Вы должны использовать popen()
только в том случае, если вы хотите отправлять данные или читать данные из дочернего процесса (и это эксклюзивный или; если вы хотите сделать и то, и другое, вы должны установить соединение самостоятельно ).
Если вы не хотите этого делать, не используйте popen()
.
Как jim mcnamara точно объяснил , учитывая, что вы перенаправили вывод дочернего элемента на /dev/null
после создания канала, перенаправление закрывает вход канала в вашу программу popen()
получает нулевые байты для чтения, что считается как EOF. И он возвращается - ему больше нечего читать (если бы его было больше, он не получил бы EOF).
В этом контексте используйте system()
; он будет ждать завершения дочернего процесса - даже когда выходные данные дочернего объекта перенаправляются на /dev/null
. В других контекстах может быть целесообразно использовать подпрограммы fork()
и exec*()
более низкого уровня.