Использование fork() в C?

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

Какая функция библиотеки Linux похожа на fork(), но родительский процесс завершен?

2 ответа

Я совершенно уверен, что тот, кто назначил вам это домашнее задание, ищет exec() семейство функций, из заголовка API POSIX <unistd.h> потому что нет ничего более похожего на ту функциональность, которую вы описываете.

exec() Семейство функций выполняет новый процесс и заменяет текущее адресное пространство процесса вновь выполненным процессом.

Со страницы руководства:

Семейство функций exec() заменяет текущий образ процесса новым образом процесса.

Это не то же самое, что "завершение" родительского процесса, но на практике это приводит к аналогичной ситуации, когда адресное пространство родительского процесса стирается (заменяется) адресным пространством дочернего процесса.

Какая функция библиотеки Linux похожа на fork(), но родительский процесс завершен?

Родительский процесс не должен завершаться, потому что он должен ждать завершения дочерних процессов, после чего они будут находиться в состоянии, называемом "состоянием зомби", теперь родитель обязан очистить остатки дочернего процесса., Родительский процесс может завершиться без очистки дочерних процессов, но тогда это неправильный способ сделать это, поскольку состояние выхода дочерних процессов должно собираться и проверяться родительским процессом.

Вот пример, чтобы продемонстрировать, что я только что сказал...

#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>

int main()
{
  pid_t cpid = 1 ;
  int status;

  cpid = fork();

  // Load a application to the child using execl() , and finish the job

  printf("Parent waiting for child to terminate\n");

  int wait_stat = waitpid(-1,&status,0);     // Parent will hang here till all child processes finish executing..
  if (wait_stat < 0)
  {
    perror("waitpid error");
    exit(-1);
  } 

  // WIFEXITED and WEXITSTATUS are macros to get exit status information, of the child process

  if (WIFEXITED (status))          
  {
  printf("Child of id %u cleaned up\n",wait_stat);
  printf("Exit status of application = %u\n",WEXITSTATUS(status));
  }

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