Linux — запуск службы из C ++ с execv

Я пытаюсь запустить службу 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 процесса, и один из них помечен как несуществующий?
Что не так в моем коде?
Как я могу это исправить?

Заранее спасибо.

1

Решение

Правильно разветвлять процесс демона сложно в Unix и Linux, потому что есть много деталей, которые нужно исправить, и порядок также важен. В этом случае я бы заподозрил комбинацию дескрипторов открытых файлов и не отключал управляющий терминал.

Я настоятельно рекомендую использовать хорошо отлаженную реализацию из другой программы — один из вариантов командной строки с ограниченной функциональностью, такой как rsh или ksh, может быть хорошим выбором, вместо того, чтобы пытаться испечь свою собственную версию.

0

Другие решения

Для удаления зомби вы родительский процесс должны wait() его ребенок или умирает. Если вам нужно сделать неблокирующую wait() посмотри на waitpid() с W_NOHANG флаг.

1

По вопросам рекламы [email protected]