c++ 多进程 守护进程 与 僵尸进程

1. 子进程变成守护进程

int __CreateDaemon__(const string &serialNo)
{

    if(gMapAvailCameras.find(serialNo)==gMapAvailCameras.end())
    {
        Log::info("***** failed get camera : " + serialNo + " *******");
        return BCERRORS::CAM_NOT_FOUND;
    }

    BaslerCameraInfo &cam = gMapAvailCameras[serialNo];
    CRedisOpera redisdb = CRedisOpera(gMapRedisInfo["redis_ip"], atoi(gMapRedisInfo["redis_port"].c_str()), gMapRedisInfo["redis_pass"]);


    Log::info("");
    Log::info("***** starting process .... *******");

    // fork process
    pid_t pid = fork();      //创建子进程
    if(pid < 0)
    {
        perror("fork");
        exit(0);
    }
    if(pid > 0)             //父进程退出
    {
        Log::info("create process " + serialNo + " for shotting. pid=" + to_string(pid) + " ppid=" + to_string(getppid()) );
        gCamPid[serialNo]=pid;
        return BCERRORS::SUCESS;
    }

    // sub process change to daemon
    setsid();               //让子进程脱离原本会话
    chdir("/tmp");          //修改当前工作路径
    umask(0);               //重设文件权限掩码
    int i = 0;
    for(i = 0; i < getdtablesize(); i++)
    {
        close(i);
    }

    // 5. 防止子进程成为僵尸进程   忽略掉SIGCHLD SIGHUP信号
    signal(SIGCHLD,SIG_IGN);
    signal(SIGHUP,SIG_IGN);


    int ret = cam.doShot(redisdb, gMapUsedCamConf[serialNo] );

    if (ret!=BCERRORS::SUCESS)
    {
        Log::info("failed process pid= " + to_string(getpid()) + " for camera " + serialNo + " result: " + to_string(ret) );
        return ret;
    }

    Log::info("sucess process pid= " + to_string(getpid()) + " camera " + serialNo );
    return ret;
}
#include 
#include 
#include 
#include 
#include 
#include 
#include 
 
int main(){
	// 1. 重设文件权限
	umask(0);
	// 2. 创建子进程
	int ret = fork();
	if(ret < 0) printf("创建进程失败:%m"),exit(-1);
	if(ret > 0) printf("父进程结束:%m\n"),exit(0); 	// 3. 让父进程结束
	if(0 == ret){
		printf("pid:%d\n",getpid());
		// 4. 创建新会话
		setsid();
		// 5. 防止子进程成为僵尸进程   忽略掉SIGCHLD SIGHUP信号
		signal(SIGCHLD,SIG_IGN);
		signal(SIGHUP,SIG_IGN);
		// 6. 改变当前工作目录
		chdir("/");
		// 7. 重定向文件描述符号
		int fd = open("/dev/NULL",O_RDWR);
		dup2(fd,0);
		dup2(fd,1);
	}
	
	while(1){
		//做事情(模拟守护进程工作)
		sleep(1);
	}
 
	return 0;
}

开始时没有加

 signal(SIGCHLD,SIG_IGN);
    signal(SIGHUP,SIG_IGN);

测试时发现进程状态会变成僵尸进程

c++ 多进程 守护进程 与 僵尸进程_第1张图片

后来加上这两行后问题解决 

你可能感兴趣的:(c++,开发语言,守护进程)