0

我正在尝试使用管道发送和接收:

发送.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);

接收文件

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”!!!!我recv端的Ta和Tb都不对!

我的程序有什么问题?!(我不得不说当我删除 O_NONBLOCK falg 时程序运行正常)

谢谢

4

1 回答 1

1

您必须检查 read() 和 write() 的返回值,尤其是在使用非阻塞 I/O 时。它们可能会失败,因为您要读取的数据尚不存在,它们可能会返回一些但不是全部的数据,因为它们尚未全部写入,并且它们可能会失败并显示错误代码 EINTR 或 EAGAIN。您通常希望在循环中使用它们,读取直到您拥有所需的所有数据,或者遇到无法恢复的错误,如 EINTR/EAGAIN。

于 2010-03-10T00:42:43.007 回答