Почему форк () перед сетсидом () необходим, т.е. делает дочерний процесс не лидером группы? - PullRequest
0 голосов
/ 14 февраля 2019

Когда мы создаем демон, мы все знаем, что причина, по которой мы выполняем fork () ПЕРЕД setsid (), состоит в том, чтобы сделать дочерний процесс не лидером группы процессов, потому что нам нужно вызвать setsid ().

Myвопрос в том, почему родительский процесс может быть лидером группы процессов?Если fork () сделает дочерний процесс не лидером группы процессов, то почему родительский процесс является лидером группы?Потому что родительский процесс разветвляется большим процессом, верно?

Спасибо!

1 Ответ

0 голосов
/ 14 февраля 2019

Оболочка делает это.

Интерактивные оболочки сделают каждую исполняемую программу своим собственным лидером группы процессов, чтобы включить управление заданиями (приоритет и фон команд).

Вот выдержка из GNUдокументация по Реализация оболочки управления заданиями :

Поскольку каждый процесс разветвляется, он должен поместить себя в новую группу процессов, вызвав setpgid [...]

if (shell_is_interactive)
  {
    /* Put the process into the process group and give the process group
     the terminal, if appropriate.
     This has to be done both by the shell and in the individual
     child processes because of potential race conditions.  */
  pid = getpid ();
  if (pgid == 0) pgid = pid;
  setpgid (pid, pgid);
  if (foreground)
    tcsetpgrp (shell_terminal, pgid);
...