Процессы висят на чтение - PullRequest
3 голосов
/ 15 ноября 2011

Следующий код читает сообщения от других процессов через канал.Все процессы правильно распечатывают все сообщения, но тогда они никогда не пройдут цикл while.Попробовав отладку в Eclipse, после прочтения чтения всех сообщений он просто остановится на цикле while.

Индекс - это номер, назначенный каждому процессу.Первый процесс будет иметь индекс == 0. Само сообщение является просто индексом процесса, отправляющего сообщение.

while((n = read(fd[index][0], &mymsg, sizeof(int))) == sizeof(int))
        printf("process%d  has received a message from process%d\n", index, mymsg);

Любые идеи, почему это произойдет?

Вот как каждыйпроцесс пишет другому:

// Write to other process
if(write(fd[index2][1], &index, sizeof(int)) != sizeof(int))
    sys_error(2);

Это делается пять раз.fd - таблица конца операций чтения и записи для каждого процесса.

1 Ответ

6 голосов
/ 15 ноября 2011

Звонок на read() блокируется, пока не появится больше данных.Из справочной страницы для канала

Если процесс пытается выполнить чтение из пустого канала, чтение (2) блокируется до тех пор, пока данные не станут доступны.Если процесс пытается выполнить запись в полный канал (см. Ниже), записывайте блоки (2) до тех пор, пока из канала не будет считано достаточное количество данных для завершения записи.Неблокируемый ввод / вывод возможен при использовании операции fcntl (2) F_SETFL, чтобы включить флаг состояния открытого файла O_NONBLOCK.

После того, как вы откроете каждый дескриптор файла перед тем, как войти в цикл while, сделайте это с каждым:

fcntl(fd, F_SETFL, O_NONBLOCK);

Тем не менее, вы действительно должны прочитать о блокирующем и неблокирующем вводе / выводе, включая чтение страниц руководства для pipe, read, fcntl и т. Д.

...