процесс может создать дополнительные дескрипторы файлов с возможностью перенаправления в оболочку? - PullRequest
2 голосов
/ 07 августа 2010

Может ли процесс 'foo' записать в дескриптор файла 3, например, таким образом, чтобы внутри оболочки bash можно было сделать

foo 1>f1 2>f2 3>f3

, и если да, то как бы вы это записали (в C)

Ответы [ 4 ]

3 голосов
/ 07 августа 2010

Вы можете начать свою команду с:

./foo 2>/dev/null 3>file1 4>file2 

Тогда, если вы ls -l / proc / _pid_of_foo_ / fd, вы увидите, что файловые дескрипторы созданы, и вы можете написать в них, например, через ::

write(3,"abc\n",4);

Возможно, было бы менее странно, если бы вы сначала проверили дескриптор файла (с помощью fcntl?).

2 голосов
/ 07 августа 2010

Оболочка открывает дескрипторы файлов для вашей программы перед ее выполнением.Просто используйте их так же, как и любой другой файловый дескриптор, например write(3, buf, len); и т. Д. Вы можете выполнить проверку ошибок, чтобы убедиться, что они действительно были открыты (попытка dup их затем закрытие дубликата будет одной простой проверкой).

1 голос
/ 07 августа 2010

Может ли процесс 'foo' записать в файловый дескриптор 3, например, таким образом, чтобы внутри оболочки bash можно было сделать [...], и если да, то как бы вы написали это (в C)?

Я не уверен, что именно вы после, но как бы то ни было, отправная точка будет man dup / man dup2 - это то, как оболочки делают из случайного файла дескриптор файловый дескриптор с заданным номером.

Но очевидно, что процесс foo должен каким-то образом знать, что он может записывать в дескриптор файла 3. POSIX задает только 0, 1 и 2: оболочка гарантирует, что все, что запущено, получает дескрипторы файлов и libc в контексте приложения также ожидает, что они будут stdin / stdout / stderr. Начиная с 3 и далее - до разработчика приложения.

1 голос
/ 07 августа 2010

Нет.

Дескрипторы файлов открываются оболочкой, и дочерний процесс наследует их.Это не дочерний процесс, который открывает эти доступные файловые дескрипторы командной строки, это процесс bash.

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

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

...