@Riki-tiki-tavi

Как проверить запущен ли дочерний процесс?

Нужно запустить процесс и в родительском процессе проверить запустился ли он. Я хочу сделать это с помощью библиотеки 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
  • Вопрос задан
  • 528 просмотров
Решения вопроса 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Похоже вы получили зомби-процесс. Родительский процесс должен считать код возврата с помощью wait/waitpid.
https://ru.stackoverflow.com/a/484142/221454
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы