如果我复制一个文件描述符,我可以使一侧阻塞而另一侧不阻塞吗

If I dup a file descriptor can I make one side blocking and one non-blocking

我已经通过 connect 打开了一个套接字并且希望能够读取结果阻塞和写入非阻塞。我当前的解决方案是将文件描述符设置为非阻塞,然后在我执行 read.

时设置 select

这样做会更简单

int sock = socket(...);
connect(sock, ...);
int reader = dup(sock);
int writer = sock;
fcntl(writer, F_SETFL, fcntl(writer, F_GETFL) | O_NONBLOCK);

fcntl 的调用是否会导致 readerwriter 都成为非阻塞的(它在 I/O 对象上设置它)还是 fcntl 在文件描述符上设置非阻塞?

如果您仔细阅读 fcntl 手册页,您会看到状态标志与 文件描述 相关联,而不是文件描述 或者。而dup表示新旧文件descriptor指的是同一个文件description。所以访问 readerwriter 应该都是非阻塞的。