Какие процессы имеют стандартные файловые дескрипторы?

Command: awk '$2 !~ /^-/{print $0}' file

output

1577.57 47
1578.87 49
1580.15 51
1
04.05.2020, 07:58
3 ответа

Они оба не правы.

sleep 999 <&- >&- 2>&-
^C

Процесс sleep 999Unix не имеет открытых стандартных файловых дескрипторов, но он все еще подключен к терминалу, так как я могу убить его с помощью Control -C.

1
28.04.2021, 23:16

Со всеми враждебными комментариями предлагаю следующий ответ:

Какие три файла всегда открыты процессом?

здесь содержится ссылка на стандарт POSIX:

https://pubs.opengroup.org/onlinepubs/009695399/functions/stdin.html

At program start-up, three streams shall be predefined and need not be opened explicitly: standard input (for reading conventional input), standard output (for writing conventional output), and standard error (for writing diagnostic output). When opened, the standard error stream is not fully buffered; the standard input and standard output streams are fully buffered if and only if the stream can be determined not to refer to an interactive device.

-3
28.04.2021, 23:16

Если это экзаменационный вопрос с несколькими вариантами ответов, отметьте первый. Преподаватель хочет, чтобы вы поняли, что эти стандартные файловые дескрипторы обычно открыты для любого процесса, а не только для тех, которые подключены к терминалу.

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


Что верно?

Каждому процессу разрешено закрывать()или заменять любой из своих файловых дескрипторов, включая STDIN STDOUT STDERR. После закрытия они исчезают и больше не существуют как FD. Все файловые дескрипторы, хранящиеся в дочернем процессе, наследуются от родительского. Таким образом, если один процесс закроет эти три стандартных дескриптора файла, а затем создаст дочерний процесс, у дочернего процесса их тоже не будет.

Чтобы было ясно, это неверно:

So the process creating system calls create all processes with the three standard file descriptors, but some dissociate from their terminal

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


Для справки по posix вам нужно понимать, что выполнение программы обычно выполняется с помощью комбинации:

  • fork()для запуска дочернего процесса
  • execve()в дочернем процессе для запуска другой программы

Согласно posix fork ()наследует все файловые дескрипторы:

The child process shall have its own copy of the parent's file descriptors. Each of the child's file descriptors shall refer to the same open file description with the corresponding file descriptor of the parent.

Есть еще одна опасность, о которую можно споткнуться. Некоторые файловые дескрипторы могут быть настроены на автоматическое закрытие при вызове execve():

File descriptors open in the calling process image shall remain open in the new process image, except for those whose close-on- exec flag FD_CLOEXEC is set.

Таким образом, даже если родитель явно не закрыл файловый дескриптор, он может не существовать для дочерней программы.

1
28.04.2021, 23:16

Теги

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