#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. В принципе. Завершите все родительские процессы, чтобы потерянные процессы можно было считать демонами. Я думаю, что проблема со сном может быть в родительском процессе, но вам нужно выйти из родительских процессов.