Проблема с O_NONBLOCK Pipe - PullRequest
       21

Проблема с O_NONBLOCK Pipe

0 голосов
/ 08 октября 2009

Я пытаюсь отправлять и получать по каналам:

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

open - это правильно, но когда send.cpp выполняет «write», программа завершается, а «4» не отображается !!!! Я считаю, что T.a и T.b не верны!

Что не так с моими программами ?! (Я должен сказать, что программы работают правильно, когда я удаляю O_NONBLOCK falg)

спасибо

1 Ответ

1 голос
/ 10 марта 2010

Вы должны проверить возвращаемые значения read () и write (), особенно когда вы используете неблокирующий ввод / вывод. Они могут потерпеть неудачу, потому что данных, которые вы хотите прочитать, еще нет, они могут вернуть некоторые, но не все ваши данные, потому что они не все были записаны, и они могут потерпеть неудачу с кодом ошибки EINTR или EAGAIN. Как правило, вы хотите использовать их в цикле, читая до тех пор, пока у вас не появятся все необходимые данные, или вы не получите ошибку, которую невозможно исправить, например EINTR / EAGAIN.

...