Демон C, который разветвляет другие процессы

#c #process #fork #daemon

#c #процесс #разветвление #демон

Вопрос:

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

Это результат 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(amp;status);
            printf("Child %d exited with status 0x%xn",pid,status);

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

            num_of_children--;
        }

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


    }
    return 0;
}
  

Буду признателен за любую помощь.
Спасибо.

Комментарии:

1. Что вы assignment_daemon делаете? Можете ли вы опубликовать стек вызовов, когда он, по-видимому, застрял вот так? Какие записи в журнале вы получаете?

2. Если вы создаете один родительский процесс, а затем дважды разветвляете этот порожденный процесс, то получается 3 процесса плюс умирающий родительский. Это то, чего вы хотите?

3. Я также почти уверен, что вы должны убить родительский процесс, чтобы дочерние элементы тоже стали сиротами.

4. @BaileyKocin Я думал, что для создания демона программа разветвляется, и родитель завершает работу, оставляя дочерний элемент сиротой. Затем я хотел, чтобы у этого осиротевшего процесса было два дочерних процесса, которые выполняли некоторую работу. Вы имеете в виду уничтожение процесса (демона), который изначально был осиротевшим?

5. В принципе. Завершите все родительские процессы, чтобы потерянные процессы можно было считать демонами. Я думаю, что проблема со сном может быть в родительском процессе, но вам нужно выйти из родительских процессов.