Я пытаюсь запустить службу Linux из C ++, и я делаю это успешно, но один из моих процессов помечен как «несуществующий», и я не хочу, чтобы мой родительский процесс умер.
Мой код (testRip.cpp):
int main()
{
char* zebraArg[2];
zebraArg[0] = (char *)"zebra";
zebraArg[1] = (char *)"restart";
char* ripdArg[2];
ripdArg[0] = (char *)"ripd";
ripdArg[1] = (char *)"restart";
pid_t ripPid;
pid_t zebraPid;
zebraPid = fork();
if(zebraPid == 0)
{
int32_t iExecvRes = 0;
iExecvRes = execv("/etc/init.d/zebra", zebraArg);
return 0;
if(iExecvRes == -1)
{
::syslog((LOG_LOCAL0 | LOG_ERR),
"zebra process failed \n");
}
}
else
{
while(1)
{
::syslog((LOG_LOCAL0 | LOG_ERR),
"running\n");
sleep(2);
}
}
}
Выход команды ps -e:
9411 pts/1 00:00:00 testRip
9412 pts/1 00:00:00 testRip <defunct>
9433 ? 00:00:00 zebra
/Etc/init.d/zebra запускает службу как демон или что-то в этом роде, так что я думаю, что это хитрость, но:
Почему существует 3 процесса, и один из них помечен как несуществующий?
Что не так в моем коде?
Как я могу это исправить?
Заранее спасибо.
Правильно разветвлять процесс демона сложно в Unix и Linux, потому что есть много деталей, которые нужно исправить, и порядок также важен. В этом случае я бы заподозрил комбинацию дескрипторов открытых файлов и не отключал управляющий терминал.
Я настоятельно рекомендую использовать хорошо отлаженную реализацию из другой программы — один из вариантов командной строки с ограниченной функциональностью, такой как rsh или ksh, может быть хорошим выбором, вместо того, чтобы пытаться испечь свою собственную версию.
Для удаления зомби вы родительский процесс должны wait()
его ребенок или умирает. Если вам нужно сделать неблокирующую wait()
посмотри на waitpid()
с W_NOHANG
флаг.