Нужно запустить процесс и в родительском процессе проверить запустился ли он. Я хочу сделать это с помощью библиотеки POCO примерно так:
poco::ProcessHandle handle = poco::Process::launch(path, arg, workingDirectory);
if ( !poco::Process::isRunning(handle) )
{
...
}
Внутри все работает следующим образом: вызывается
fork()
запоминается pid. В дочернем процессе вызывается
execvp()
и далее вызывается
_exit()
;
Внутри
isRunning()
вызывается
kill(pid, 0)
.
Все это работает, вопрос возникает когда переменная path равна нулю, то есть никакой другой исполняемый файл выполнятся не должен. Но почему то
kill(pid, 0)
возвращает 0, то есть процесс запущен, как такое может быть?
Может быть так будет понятней:
int main(int argc, char** argv)
{
int pid = fork();
if ( pid == 0)
{
int pid = getpid();
int ppid = getppid();
printf("Child process: pid: %d \n", pid);
printf("Child process: ppid: %d \n", ppid);
int res = execvp("", NULL);
printf("Child process: res: %d \n", res);
_exit(72);
}
sleep(3);
if ( kill(pid, 0) == 0 )
{
printf("kill returned 0 \n");
}
return 0;
}
Вывод:
Child process: pid: 3542
Child process: ppid: 3533
Child process: res: -1
kill returned 0
Вывод
ps -ef | grep 3533
milai 3533 3531 0 15:55 pts/6 00:00:00 /home/milai/project/test/build/testApp
milai 3542 3533 0 15:55 pts/6 00:00:00 [testApp] <defunct>
milai 3561 2579 0 15:57 pts/4 00:00:00 grep --color=auto 3533