Какой вызов перед ветвлением?

@Caleb корректен о создании сценария просто протестировать на символьную ссылку. Однако часть о том, почему был не учтен и мне было любопытно. При рассмотрении coreutils исходного кода и strace вывод теста, Вы видите, что, когда Вы запускаете тест символьной ссылки, он использует lstat и если Вы использующий-f тестируете его, на самом деле называет 'статистику', которая следует за символьной ссылкой:

$ ln -s varnish_config XXX
$ strace -s 2000 test -L XXX 2>&1 | grep XXX
execve("/usr/bin/test", ["test", "-L", "XXX"], [/* 47 vars */]) = 0
lstat("XXX", {st_mode=S_IFLNK|0777, st_size=14, ...}) = 0

$ strace -s 2000 test -L varnish_config 2>&1 | grep varnish
execve("/usr/bin/test", ["test", "-L", "varnish_config"], [/* 47 vars */]) = 0
lstat("varnish_config", {st_mode=S_IFREG|0664, st_size=1046, ...}) = 0

$ strace -s 2000 test -f XXX 2>&1 | grep XXX
execve("/usr/bin/test", ["test", "-f", "XXX"], [/* 47 vars */]) = 0
stat("XXX", {st_mode=S_IFREG|0664, st_size=1046, ...}) = 0

Из страницы справочника статистики:

   stat() stats the file pointed to by path and fills in buf.

   lstat() is identical to stat(), except that if path is a symbolic link,
   then the link itself is stat-ed, not the file that it refers to.

Это означает, что тест-f возвратит true, пока указанное имя файла является символьной ссылкой на регулярный файл или сам регулярный файл.

5
07.09.2010, 09:13
3 ответа

Я смущаюсь помещать это как ответ, как можно только предположить, но:

  1. сбросьте stdout в случае, если ребенок собирается сделать вывод до должностного лица.
  2. закройте любые открытые дескрипторы файлов, больше, чем 2 предположения, что новый процесс ожидает "стандартную" среду, поскольку это добралось бы от оболочки.
  3. некоторая неясная вещь, требуемая некоторым неясным вариантом как Eunice, что они, хотя очень умный себя для знания.

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

7
27.01.2020, 20:33
  • 1
    # 2's неправильно. Вы закрыли бы нежелательные дескрипторы после ветвления, не прежде. Родителю все еще нужны они. –  Warren Young 07.09.2010, 10:06
  • 2
    Они могли просить видеть, как Вы поддерживаете себя, когда Вы правы, но бывшие оспариваемый. –  Kevin Cantu 10.09.2010, 02:41

Мое предположение - то, что они означают, что необходимо назвать 'канал', чтобы позволить позволять родительскому процессу управлять стандартным вводом-выводом или стандартным выводом дочернего процесса. Это - наиболее распространенный вызов, который происходит перед 'ветвлением'.

Я соглашаюсь, это - плохой вопрос. Это был бы хороший вопрос, если они указали, что Вы создавали процесс как часть конвейера или чего-то как этот. Важно знать, что порядок операций - создает канал (каналы) перед 'ветвлением', затем закрывает противостоящие неиспользованные концы в каждом процессе, использует 'dup2' для помещения дескрипторов ребенка на правильное место, вызывая некоторую 'исполнительную' функцию в ребенке, отказах вследствие неправильного обращения, и так далее.

(То, что это имеет экспертов, предполагающих, доказывает, что это - плохой вопрос.)

4
27.01.2020, 20:33

Мое предположение - это

  • любой они думали о чем-то, которое это только применимо к определенной ситуации, что они не потрудились упоминать, как сбрасывание буферов;
  • или они имели в виду что-то, что Вы сделаете после разветвления;
  • или они имели в виду что-то, что Вы сделаете прежде execve (который является другой половиной порождения другой программы), ожидая ответ fork, но они действительно не поняли все это и перепутали два.
3
27.01.2020, 20:33

Теги

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