【问题标题】:If I dup a file descriptor can I make one side blocking and one non-blocking如果我复制一个文件描述符,我可以使一侧阻塞和一个非阻塞
【发布时间】:2021-09-21 20:31:58
【问题描述】:

我已经通过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 在文件描述符上设置非阻塞?

【问题讨论】:

  • 如果你使用select,为什么要设置为非阻塞?为了写入它而让它非阻塞的目的是什么?
  • 您可以自己验证这一点,方法是在两个 fd 上执行 F_GETFL 并比较返回值

标签: c linux unix posix


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2021-12-26
    相关资源
    最近更新 更多