Каждый процесс имеет свой стандартный вывод stdin stderr как Клавиатура, Терминал и т. Д.? - PullRequest
0 голосов
/ 16 марта 2011

У каждого процесса есть stdin, stdout и stderr, связанные с ним с клавиатурой и терминалом?

У меня небольшая программа. Я хочу заменить ввод с клавиатуры на файл с именем new.txt. Как мне это сделать?

FILE *file1
fopen("new.txt", "r")
close(0);  // close the stdio
dup2(file1, 0);

Будет ли это работать? Теперь мой stdio перенаправлен на FILE?

Ответы [ 2 ]

4 голосов
/ 16 марта 2011

Нет, не каждый процесс.Но в операционных системах, которые предоставляют окно командной строки для ввода, программа, запущенная из этой командной строки, будет иметь подключенный stdin к клавиатуре, а stdout и stderr будут идти к терминалу.

Если одна программа запускает другую, то часто стандартные потоки второй программы каким-либо образом связаны с первой программой;например, первая программа может иметь открытый дескриптор, через который она может отправлять текст и делать вид, что это «клавиатура» для второго процесса.Конечно, детали зависят от операционной системы.

1 голос
/ 16 марта 2011

В ответ на ваш вопрос:

Будет ли это работать?

Нет.dup2() принимает два файловых дескриптора (int с), в то время как вы передаете ему FILE * и int.Вы не можете смешивать файл дескрипторы (FILE * с) и файл дескрипторы (int с) таким образом.

Вы можете использовать open вместоfopen, чтобы открыть файл как дескриптор файла вместо дескриптора файла, или вы можете использовать fileno, чтобы получить дескриптор файла из дескриптора файла.Или вы можете использовать freopen для повторного открытия дескриптора файла stdin для нового файла.

Обратите внимание, что файловые дескрипторы (int s) являются частью операционных систем POSIX и переносимы только на другие системы POSIX., в то время как файловые дескрипторы (FILE * s) являются частью стандарта C и переносимы везде.Если вы используете файловые дескрипторы, вам придется переписать свой код, чтобы он работал в Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...