2010-04-26 5 views
1

Я хочу использовать dup2 для чтения из входного файла и перенаправить его на вход функции exec. но моя проблема заключается в том, что у меня есть три запущенных процесса, и все они должны открыть один и тот же файл ввода, но они выполняют разные задания. что вы предлагаете в таком случае? я не знаю, можно ли использовать «cat data.txt» для подачи ввода для трех других процессов, но я не знаю, как это сделать.Несколько открытых файлов для чтения в то же время

ответ

0

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

+0

Хорошо, так я могу сделать вот так: dup2 (filedescriptor2, filedescriptor1); и снова dup2 (filedescriptor3, filedescriptor1); dub2 (filedescriptor4, filedescriptor1); – alaamh

+2

Нет, dup2 просто создает новый файловый дескриптор, ссылаясь на тот же открытый файл. Вам нужно открыть файл 3 раза и передать эти дескрипторы процессам, которые в них нуждаются. – nos

+0

если вы не возражаете, покажите мне пример. – alaamh

1

Если каждый читатель получает доступ к файлу через дублированные файловые дескрипторы, то все они будут разделять смещение файла, которое может вызвать проблемы.

echo cat dog mouse fish bird | run_each prog1 prog2 prog3 

Если в приведенном выше примере программы run_each были открыты запуском программ, приведенных в качестве аргументов командной строки, давая им каждый вариант а DUP-й изд из его стандартного ввода, то PROG1 может читать «кошку», PROG2 может читать "собака мышь ", а prog3 может читать" птица ". В этом случае вызов dup2 на самом деле ничего не сделал бы в конечном итоге.

Если мы изменим нашу программу run_each принять параметр -stdin =, что делает его открытым и dup2 этот файл в качестве стандартного ввода для каждой дочерней программы, то:

echo cat dog mouse fish bird > ./some-file.txt 
run_each -stdin=./some-file.txt prog1 prog2 prog3 

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

Если каждая из программ, называемых pread для всех их чтения (при условии, что чтение - это все, что было сделано, но есть также pwrite), тогда он будет работать в этом примере (но первый не будет работать), но вам действительно нужно открыть файл несколько раз, чтобы каждая из дочерних программ не знала, что еще может произойти с его стандартным вводом.