Мне сложно понять, почему каналы закрываются непосредственно перед вызовом execvp и чтением или записью каких-либо данных.
Каналы не закрываются. Скорее, некоторые файловые дескрипторы, связанные с концами канала, закрываются. Каждый дочерний процесс дублирует дескрипторы файлов на конце канала в один или оба своих стандартных потока, а затем закрывает все дескрипторы файлов на конце канала, которые он на самом деле не собирается использовать, и все они хранятся в массиве pipes
. Каждый канал остается открытым и может использоваться до тех пор, пока каждый конец открыт хотя бы в одном процессе, а каждый дочерний процесс удерживает как минимум один конец одного канала открытым. Они закрываются, когда дочерние процессы завершаются (или, по крайней мере, под контролем дочерних процессов, post execvp()
).
Одной из причин такого закрытия является аккуратность и управление ресурсами. Существует ограничение на количество файловых дескрипторов, которые процесс может открыть одновременно, поэтому разумно избегать оставлять ненужные файловые дескрипторы открытыми.
Но также функционально чтение процесса из одного из каналов не обнаружит конец файла, пока все дескрипторы открытого файла , связанные с концом записи канала, в любом процессе не будут закрыто. Это то, что EOF для канала означает , и это имеет смысл, поскольку, пока конец записи открыт где-либо, возможно, что в него будет записано больше данных.