Если каждый читатель получает доступ к файлу через дубликаторы файлов, то все они будут совместно использовать смещение файла, что может вызвать проблемы.
echo cat dog mouse fish bird | run_each prog1 prog2 prog3
Если в вышеприведенном примере программа run_each открывала запущенные программы, заданные в качестве аргументов командной строки, давая каждой из них дублированную версию своего стандартного ввода, тогда prog1 может читать «cat», prog2 может читать «dog mouse» и prog3 может читать «птица». В этом случае вызов dup2 на самом деле ничего бы не сделал в долгосрочной перспективе.
Если мы заменим нашу программу run_each на параметр -stdin =, который откроет этот файл и дублирует этот файл в качестве стандартного ввода для каждой дочерней программы, то:
echo cat dog mouse fish bird > ./some-file.txt
run_each -stdin=./some-file.txt prog1 prog2 prog3
В этом примере, который, вероятно, немного ближе к тому, с чем вы имеете дело, поскольку он использует обычный файл для поиска, у вас будут те же проблемы, что и в первом примере, потому что все стандартные входные файлы каждой программы # разделить позицию смещения / поиска.
Если бы каждая из программ вызывала pread для всего своего чтения (при условии, что чтение - это все, что было сделано, но есть и pwrite), тогда это будет работать в этом примере (но первая не будет работать), но вы на самом деле следует открывать файл несколько раз, чтобы каждая из дочерних программ не имела представления о том, что еще может происходить при его стандартном вводе.