Проблема с каналом O_NONBLOCK
-
20-09-2019 - |
Вопрос
Я пытаюсь отправлять и получать сообщения с помощью каналов:
send.cpp
struct
{
long a;
long b;
}T;
cout << "1" << endl;
if ( access ( FIFO_NAME, F_OK ) == -1 ) {
res = mkfifo ( FIFO_NAME, 0755 );
if ( res != 0 )
cout << " Can't make fifo" << endl;
}
cout << "2" << endl;
pipe_fd = open ( FIFO_NAME, O_WRONLY);
cout << "3: " << pipe_fd << endl;
a=b=1;
res = write ( pipe_fd, &T, sizeof ( T ) );
cout << "4" << endl;
close(pipe_fd);
recv.cpp
cout << "1" << endl;
pipe_fd = open(FIFO_NAME, O_RDONLY | O_NONBLOCK);
cout << "2" << endl;
res = read(pipe_fd, &T, sizeof(T));
cout << T.a << T.b << endl;
close(pipe_fd);
./отправить ./recv
открыть - это правильно, но когда send.cpp выполняется "запись", программа завершается и "4" не отображается!!!!Я считаю, что T.a и T.b неверны !
Что не так с моими программами?!(Я должен сказать, что программы работают корректно, когда я удаляю O_NONBLOCK falg)
Спасибо
Решение
Вы должны проверить возвращаемые значения read() и write(), особенно когда вы используете неблокирующий ввод-вывод.Они могут завершиться с ошибкой, потому что данных, которые вы хотите прочитать, еще нет, они могут вернуть некоторые, но не все ваши данные, потому что не все они были записаны, и они могут завершиться с кодом ошибки EINTR или EAGAIN.Обычно вы хотите использовать их в цикле, читая до тех пор, пока у вас либо не будут все нужные данные, либо вы не получите ошибку, которую невозможно восстановить, например EINTR / EAGAIN.