Как использовать канал с выбором после разветвления и выполнения? - PullRequest
1 голос
/ 19 мая 2011

Я новичок в программировании на Linux, поэтому, пожалуйста, потерпите меня.В моем приложении я выполняю fork (), а затем execl () другой двоичный файл после настройки одного канала для чтения. После того, как с fork и exec все в порядке, я делаю dup2 () для чтения из stdout исполняемого двоичного файла.Мне нужно, чтобы мое родительское приложение ожидало вывода от процесса, которое оно создало, и когда оно появилось, прочитайте его.Я подумал, что буду использовать select () и подождать несколько миллисекунд, прежде чем пытаться определить, есть ли данные для чтения, и, если они есть, использовать read ().Однако мой код не работает, потому что select () принимает в качестве аргумента fd_set, в то время как мой канал имеет тип int, преобразованный pipe () и dup2 ().Что я могу сделать, чтобы преодолеть это и есть ли другая альтернатива?Обратите внимание, я не блокирую родительский процесс, пока процесс не завершится, но хочу прочитать информацию во время выполнения дочернего процесса.

1 Ответ

3 голосов
/ 19 мая 2011

Чтобы использовать select(), вы должны создать struct fd_set и заполнить его, используя макросы FD_. Таким образом, вы будете сообщать функции, какие дескрипторы вас интересуют (обратите внимание, что обычно интересует сразу несколько). Например:

fd_set rfds;

FD_ZERO(&rfds);
FD_SET(your_input_fd, &rfds);

int retval = select(your_input_fd + 1, &rfds, NULL, NULL, NULL);

Первый аргумент, который нужно выбрать, - это интересующий вас дескриптор файла с наибольшим номером плюс один. Это, наряду с примером кода, объясняется здесь: http://linux.die.net/man/3/fd_set

...