Unix IPC套接字:closures一端而不读取它

我有一个父进程和一个分叉的subprocess,并且它们共享一个使用socketpair(AF_UNIX, SOCK_STREAM, 0, sockets)创build的Unix域IPC套接字。 这两个进程closuressocketpair的一端,并将另一端保存到sockvariables中。 之后,他们这样做:

 int sock; // Unix-domain socket void child_main() { printf("I am child\n"); sleep(1); close(sock); } void parent_main() { printf("I am parent\n"); write(sock, "hello", 5); char buf[100]; int ret = read(sock, buf, 100); // this read will return ECONNRESET if (ret == -1) { perror("read"); exit(-1); } } 

父进程将一些数据写入套接字,并且孩子读取它。 而是孩子closuressockets。 现在我担心的是,在父进程read失败与ECONNRESET(连接重置由同行),而我期望它会返回“0”表示stream结束。 因为套接字的另一端通过调用close 优雅地closures。

现在,我明白,行为(closures套接字而不读取挂起的数据会生成ECONNRESET),但是这是在哪里logging的? man read没有说ECONNRESET,但它提到:

可能会发生其他错误,具体取决于连接到fd的对象

unix域套接字的手册页只说:

ECONNRESET:远程套接字意外closures。

但是由于Unix域套接字是一个本地IPC的东西,我想这可能是更具体的情况下,这个错误可能发生。

我的“更深层次的想法”是这样的:如果规范说如close ,只有当没有数据要从套接字读取时才会产生stream结束标记,它如何​​知道另一个进程是不是只是写一些? 这不会造成竞争状态吗? 内核如何知道连接是否将被正常closures?

使用有状态套接字(unix域或tcp),区分“无数据”和关闭另一端的套接字的最好方法是首先使用select()传递一个readfds(请参见man 2 select)。 如果,并且只有当select指示一个读事件时,然后尝试在套接字上读()。 如果读取的字节数为0,则表示套接字已关闭(由对等方重置连接)。