@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, пока указанное имя файла является символьной ссылкой на регулярный файл или сам регулярный файл.
Я смущаюсь помещать это как ответ, как можно только предположить, но:
Любым путем Вы царапаете, это, задавая неясный фактический вопрос не является никакой способ получить что-либо о кандидате кроме, возможно, как они отвечают на глупые вопросы.
Мое предположение - то, что они означают, что необходимо назвать 'канал', чтобы позволить позволять родительскому процессу управлять стандартным вводом-выводом или стандартным выводом дочернего процесса. Это - наиболее распространенный вызов, который происходит перед 'ветвлением'.
Я соглашаюсь, это - плохой вопрос. Это был бы хороший вопрос, если они указали, что Вы создавали процесс как часть конвейера или чего-то как этот. Важно знать, что порядок операций - создает канал (каналы) перед 'ветвлением', затем закрывает противостоящие неиспользованные концы в каждом процессе, использует 'dup2' для помещения дескрипторов ребенка на правильное место, вызывая некоторую 'исполнительную' функцию в ребенке, отказах вследствие неправильного обращения, и так далее.
(То, что это имеет экспертов, предполагающих, доказывает, что это - плохой вопрос.)
Мое предположение - это
execve
(который является другой половиной порождения другой программы), ожидая ответ fork
, но они действительно не поняли все это и перепутали два.