Мне не совсем понятно, о чем вы здесь спрашиваете, поэтому дайте мне знать, если этот ответ не соответствует отметке.
man popen
подтверждает, что popen возвращает FILE *
. Это не массив; fp[0]
или fp[1]
.
* "канал" - это просто пара связанных файловых дескрипторов ... один доступен в родительском процессе (это возвращаемое значение из popen), а другой - доступно в дочернем процессе. Когда вы читаете из своей переменной fp
, вы читаете с одного конца канала (а когда дочерний процесс пишет в stdout
, он записывает на другой конец канала).
является дочерним, читающим из потока или родительским
Когда вы запускаете fp = popen("date", "r")
, вы создаете однонаправленный канал. Родитель может читать, а ребенок может писать (если бы вы указали "w"
в качестве режима, а не наоборот).
Вы явно читаете из пункта здесь:
fgets(buffer, BUFFER_SIZE, fp);
и как мне узнать, что выполняется подпроцессом
Подпроцесс выполняет то, что вы ему сказали (в данном случае date
).
Кроме того, как мы узнаем, какой конец для чтения, а какой для записи
Вы управляете вторым аргументом команды popen
.
- это цель popen (в моем случае, здесь) перенаправить вывод команды родительскому процессу
Цель popen
- разрешить связь между дочерним процессом и родительским процессом. Он создает однонаправленный канал, но вы контролируете, является ли это parent -> child
или child -> parent
.
Это то, что происходит в предоставленной мной программе? 1) popen открывает подпроцесс 2) подпроцесс записывает выходные данные команды date в конец записи канала 3) родительский процесс читает конец чтения канала (ie что имеет дочерний элемент) передано)?
Это правильно.