Что происходит, когда я использую while(1) в дочернем процессе после fork?

Я пишу программу 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

@Dhiman - Показанный вывод терминала отвечает на все ваши вопросы, не так ли?

Armali 21.04.2023 15:12

Существует аналогичный вопрос, в котором обсуждается, как родитель ребенка переназначается, если родитель умирает раньше ребенка. «В Linux, FreeBSD/PC-BSD и DragonFly BSD родительский процесс осиротевших дочерних элементов устанавливается в ближайший процесс-предок дочернего процесса, который помечен как поджнец, или процесс №1, если нет процесса-предка поджнеца».

pmacfarlane 21.04.2023 15:16

Распечатайте pid обоих процессов в printf и проверьте это с выводом ps

Karthick 21.04.2023 17:31

@Armali Да, я видел вывод терминала, но меня смущает, что в команде ps мы видим процесс с именем fork. так это дочерний процесс или родительский??

Dhiman 22.04.2023 16:50

Из кода вашей программы видно, что родитель завершает работу (return 0;) и больше не работает. Кроме того, новым родителем запущенного процесса является systemd, а не оболочка, что доказывает, что запущенный процесс является дочерним.

Armali 23.04.2023 18:19

@ Armali Да, я тоже так думаю. Но затем, когда я интегрирую свой код с php-кодом. Где я назвал бинарный файл fork, сгенерированный gcc с помощью функций shell_exec и exec php. на моем веб-сайте я не получаю немедленного ответа, как только родительский процесс завершает этот php-скрипт, ждет завершения дочернего процесса, а затем показывает мне вывод на моем веб-сервере. Есть ли у вас какие-либо идеи по этому поводу, почему возникает такая проблема, если родитель уже вышел?

Dhiman 24.04.2023 06:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Простой способ - напечатать 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 22.04.2023 16:38

@Dhiman Проверьте pid, напечатанный в ps выводе. В моем выводе это напечатано как 5785, что соответствует This is child.My pid is 5785 Итак, это child процесс

Karthick 24.04.2023 10:36
Ответ принят как подходящий

Я не получаю немедленный ответ, как только родительский процесс завершает этот php-скрипт, ждет завершения дочернего процесса, а затем показывает мне вывод на моем веб-сервере. Есть ли у вас какие-либо идеи по этому поводу, почему возникает такая проблема, если родитель уже вышел?

Кажется, что PHP-скрипт ожидает вывода из процесса execed, пока не будет указан конец вывода. Теперь, когда родительский процесс завершается, стандартный вывод все еще открыт для дочернего процесса, поэтому еще нет конца вывода. Если вы хотите, чтобы скрипт перестал ждать дальнейшего вывода, вы можете закончить его fclose(stdout) от дочернего элемента.

Другие вопросы по теме