Я не согласен с Натаном Феллманом - другой вопрос не является дубликатом этого, хотя предмет связан.
Для простой однонаправленной связи popen () - достойное решение. Однако для двунаправленной связи он бесполезен.
IMO, imjorge (Хорхе Феррейра) дал большую часть ответа (80%?) Для двунаправленной связи - но пропустил несколько ключевых деталей.
- Крайне важно, чтобы родительский процесс закрыл конец чтения канала, который используется для отправки сообщений дочернему процессу.
- Крайне важно, чтобы дочерний процесс закрыл конец записи канала, который используется для отправки сообщений дочернему процессу.
- Крайне важно, чтобы родительский процесс закрыл конец записи канала, который используется для отправки сообщений родительскому процессу.
- Крайне важно, чтобы дочерний процесс закрыл конец чтения канала, который используется для отправки сообщений родительскому процессу.
Если вы не закроете неиспользуемые концы каналов, вы не получите разумного поведения при завершении одной из программ; например, дочерний объект может читать из своего стандартного ввода, но если конец записи канала не закрыт в дочернем элементе, он никогда не получит EOF (ноль байтов от чтения), потому что канал все еще открыт, и система считает может когда-нибудь дойти до записи в этот канал, даже если он в данный момент зависает, ожидая, что что-то из него прочитает.
Процессы записи должны учитывать, обрабатывать ли сигнал SIGPIPE, который выдается при записи в канал, где нет процесса чтения.
Вы должны знать о пропускной способности канала (зависит от платформы и может составлять всего 4 КБ) и разрабатывать программы, чтобы избежать тупика.