C демон, который разветвляет другие процессы - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь создать демон, который разветвляет два процесса, которые будут работать бесконечно, чтобы проверять время и получать сообщения между процессами.Когда я запускаю программу без шагов по созданию демона, все работает нормально.Однако, как только я пытаюсь создать демон, кажется, что дочерние процессы, которые я разветвляю, становятся зомби.

Это вывод ps -ajx

 2678  3628  3628  2678 pts/2     3628 S+    1000   0:00 ./assignment_daemon
 3628  3629  3629  3629 ?           -1 Zs    1000   0:00 [assignment_daem] <defunct>

А вот код C,

int main()
{   
    int pid = fork();

    if(pid > 0)
    {
        printf("Parent process..\n");
        sleep(10);
        exit(EXIT_SUCCESS);
    }
    else if (pid == 0)
    {
        printf("Child process..\n");

        if(setsid() < 0)
        {
            exit(EXIT_FAILURE);
        }

        umask(0);

        if(chdir("/") < 0)
        {
            exit(EXIT_FAILURE);
        }

        int x;
        for(x = sysconf(_SC_OPEN_MAX); x>=0;x--)
        {
            close(x);
        }


        openlog("assignment_daemon", LOG_PID|LOG_CONS,LOG_USER);

        syslog(LOG_INFO,"assignment_daemon started...");

        int SIZE = 2;
        pid_t child_pids[SIZE];
        int num_of_children = SIZE;

        for(int i = 0; i < num_of_children; i++)
        {
            if((child_pids[i] = fork()) < 0)
            {
                perror("Error: failed to fork!\n");
                syslog(LOG_ERR,"failed to fork...");
                exit(EXIT_FAILURE);
            }
            else if(child_pids[i] == 0){

                if(i == 0)
                {   
                    syslog(LOG_INFO,"Forked message_server...");
                    //run message server
                    char * argv_list[] = {"message_queue_server",NULL};
                    execv("./assignment_queue_server",argv_list);
                }

                if(i == 1)
                {
                    syslog(LOG_INFO,"Forked time_check...");
                    //run time check
                    char * argv_list[] = {"time_check_process",NULL};
                    execv("./time_check_process",argv_list);
                }                    
            }
        }

        int status;
        pid_t pid;
        while(num_of_children > 0)
        {   
            pid = wait(&status);
            printf("Child %d exited with status 0x%x\n",pid,status);

            syslog(LOG_INFO,"child has exited...");

            num_of_children--;
        }

        syslog(LOG_INFO,"assignment_daemon ended...");


    }
    return 0;
}

Любая помощь будет оценена.Спасибо.

...