Может ли процесс создавать дополнительные перенаправленные файловые дескрипторы?

StackOverflow https://stackoverflow.com/questions/3427651

Вопрос

Может ли процесс «foo» писать в файл дескриптор 3, например, таким образом, что внутри Bash Shell можно сделать

foo 1>f1 2>f2 3>f3

И если так, как бы вы написали это (в C)?

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Это было бы меньше хаки, возможно, если вы проверили дескриптор файла сначала (с FCNTL?).

Нет.

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

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

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

Может ли процесс «Foo» писать в файловый дескриптор 3, например, таким образом, что внутри Bash Shell можно сделать [...] и если так, как вы его написали (в C)?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top