Unix 哪些POSIX系统调用可能会阻止进程?
是否有描述POSIX系统调用阻塞行为的参考文档Unix 哪些POSIX系统调用可能会阻止进程?,unix,posix,blocking,nonblocking,Unix,Posix,Blocking,Nonblocking,是否有描述POSIX系统调用阻塞行为的参考文档 到目前为止,我的启发式方法是标记为可能阻止任何可能因EINTR而失败的函数?这是一个必要和充分的条件吗?坦白地说,就我所知,只要看看man页面,运用常识就可以了。即使一个调用没有指定EINTR,也要考虑它的作用。我可能错了,但在我看来,POSIX库中的每个调用在默认情况下都会阻塞,并且只有在您要求时才会以非阻塞模式执行(通过各种标志),但我还没有看到一个调用在默认情况下会取消阻塞(除了取消阻塞之外什么都可以)。坦白地说,据我所知,只要看看man页面
到目前为止,我的启发式方法是标记为可能阻止任何可能因
EINTR
而失败的函数?这是一个必要和充分的条件吗?坦白地说,就我所知,只要看看man
页面,运用常识就可以了。即使一个调用没有指定EINTR,也要考虑它的作用。我可能错了,但在我看来,POSIX库中的每个调用在默认情况下都会阻塞,并且只有在您要求时才会以非阻塞模式执行(通过各种标志),但我还没有看到一个调用在默认情况下会取消阻塞(除了取消阻塞之外什么都可以)。坦白地说,据我所知,只要看看man
页面,运用常识即可。即使一个调用没有指定EINTR,也要考虑它的作用。我可能错了,但在我看来,POSIX库中的每个调用在默认情况下都会阻塞,并且只有在您要求的情况下(通过各种标志)才会以非阻塞模式执行,但我没有看到一个调用在默认情况下会取消阻塞(除了取消阻塞之外什么都可以做)。我没有列表,但我怀疑这不是必要的条件。例如,unlink(2)
没有将EINTR
指定为可能的错误,但它可能会阻塞(磁盘访问)。可能还有很多其他人喜欢它。我没有列表,但我怀疑这不是一个必要条件。例如,unlink(2)
没有将EINTR
指定为可能的错误,但它可能会阻塞(磁盘访问)。可能还有很多其他类似的调用。作为“POSIX库中的每个调用默认都会阻塞”的反例,getpid()
system调用不会阻塞;句号。man
页面没有提供足够的信息,我也不相信我的常识。示例有socket(2)
,shutdown(2)
,fnctl(2)
和命令F_SETFL等等。这就是为什么我希望有一个全面的文档来告诉我这些。@JonathanLeffler:但它也不是异步的。它确实返回其任务要返回的值,这意味着它不是非阻塞的。这不像你调用getpid()
,然后执行其他代码,然后再得到结果。@DanielBünzli:Forfnctl()
,这就是我的观点。你必须给一个标志,使其非阻塞。至于其他人,我不知道。你需要对此有多精确?您是否正在编写一些真正对性能至关重要的代码,根本无法等待?那么关机(2)
和插座(2)
呢?他们是什么样的例子?对,当我说阻塞时,我说阻塞的时间不确定,正如Jonathan Leffler所理解的。作为“POSIX库中的每个调用都默认阻塞”的反例,getpid()
系统调用不阻塞;句号。man
页面没有提供足够的信息,我也不相信我的常识。示例有socket(2)
,shutdown(2)
,fnctl(2)
和命令F_SETFL等等。这就是为什么我希望有一个全面的文档来告诉我这些。@JonathanLeffler:但它也不是异步的。它确实返回其任务要返回的值,这意味着它不是非阻塞的。这不像你调用getpid()
,然后执行其他代码,然后再得到结果。@DanielBünzli:Forfnctl()
,这就是我的观点。你必须给一个标志,使其非阻塞。至于其他人,我不知道。你需要对此有多精确?您是否正在编写一些真正对性能至关重要的代码,根本无法等待?那么关机(2)
和插座(2)
呢?他们是什么样的例子?对,当我说阻塞时,我说阻塞的时间不确定,正如乔纳森·莱夫勒所理解的。