Я пишу программу c, которая использует fork() для создания дочернего процесса, теперь в дочернем процессе я запускаю цикл while (1), а в родительском процессе я просто печатаю «hello World», а затем выхожу из программы. Теперь, как проверить, что моя родительская программа убита/закрыта, но дочерняя программа все еще работает в фоновом режиме?
#include <stdio.h>
#include <unistd.h>
int main(void) {
int pid = fork();
if (pid == 0) {
printf("This is child\n");
while (1)
;
} else {
printf("Hello World this is parent\n");
return 0;
}
return 0;
}
Вот все детали после выполнения с выводом команды ps.
Я пытался найти процессы, используя ps команду вывода linux, как показано на рисунке. Вывод команды Ps
Существует аналогичный вопрос, в котором обсуждается, как родитель ребенка переназначается, если родитель умирает раньше ребенка. «В Linux, FreeBSD/PC-BSD и DragonFly BSD родительский процесс осиротевших дочерних элементов устанавливается в ближайший процесс-предок дочернего процесса, который помечен как поджнец, или процесс №1, если нет процесса-предка поджнеца».
Распечатайте pid обоих процессов в printf и проверьте это с выводом ps
@Armali Да, я видел вывод терминала, но меня смущает, что в команде ps мы видим процесс с именем fork. так это дочерний процесс или родительский??
Из кода вашей программы видно, что родитель завершает работу (return 0;) и больше не работает. Кроме того, новым родителем запущенного процесса является systemd, а не оболочка, что доказывает, что запущенный процесс является дочерним.
@ Armali Да, я тоже так думаю. Но затем, когда я интегрирую свой код с php-кодом. Где я назвал бинарный файл fork, сгенерированный gcc с помощью функций shell_exec и exec php. на моем веб-сайте я не получаю немедленного ответа, как только родительский процесс завершает этот php-скрипт, ждет завершения дочернего процесса, а затем показывает мне вывод на моем веб-сервере. Есть ли у вас какие-либо идеи по этому поводу, почему возникает такая проблема, если родитель уже вышел?





Простой способ - напечатать pid обоих процессов в printf и проверить это с помощью ps вывода.
Пример программы
int main(void) {
int pid = fork();
if (pid == 0) {
printf("This is child.My pid is %ld and my parent pid is %ld\n", getpid(), getppid());
while (1)
;
} else {
printf("Hello World this is parent. My pid is %ld\n", getpid());
return 0;
}
Пример вывода
$ ./fork
Hello World this is parent. My pid is 5784
This is child.My pid is 5785 and my parent pid is 5784
$
$
$ ps -ef | grep 5784 | grep -v grep
$
$ ps -ef | grep 5785 | grep -v grep
k+ 5785 1 99 15:36 pts/8 00:00:22 ./fork
$
Да, я пробовал то же самое и получил тот же тип вывода. Меня смущает, что в команде ps мы видим процесс с именем fork. так это дочерний процесс или родительский?? Как видите, ваша команда ps также показывает ответвление имени процесса. Вы можете это объяснить?
@Dhiman Проверьте pid, напечатанный в ps выводе. В моем выводе это напечатано как 5785, что соответствует This is child.My pid is 5785 Итак, это child процесс
Я не получаю немедленный ответ, как только родительский процесс завершает этот php-скрипт, ждет завершения дочернего процесса, а затем показывает мне вывод на моем веб-сервере. Есть ли у вас какие-либо идеи по этому поводу, почему возникает такая проблема, если родитель уже вышел?
Кажется, что PHP-скрипт ожидает вывода из процесса execed, пока не будет указан конец вывода. Теперь, когда родительский процесс завершается, стандартный вывод все еще открыт для дочернего процесса, поэтому еще нет конца вывода. Если вы хотите, чтобы скрипт перестал ждать дальнейшего вывода, вы можете закончить его fclose(stdout) от дочернего элемента.
@Dhiman - Показанный вывод терминала отвечает на все ваши вопросы, не так ли?