Unix 哪些POSIX系统调用可能会阻止进程?

Unix 哪些POSIX系统调用可能会阻止进程?,unix,posix,blocking,nonblocking,Unix,Posix,Blocking,Nonblocking,是否有描述POSIX系统调用阻塞行为的参考文档 到目前为止,我的启发式方法是标记为可能阻止任何可能因EINTR而失败的函数?这是一个必要和充分的条件吗?坦白地说,就我所知,只要看看man页面,运用常识就可以了。即使一个调用没有指定EINTR,也要考虑它的作用。我可能错了,但在我看来,POSIX库中的每个调用在默认情况下都会阻塞,并且只有在您要求时才会以非阻塞模式执行(通过各种标志),但我还没有看到一个调用在默认情况下会取消阻塞(除了取消阻塞之外什么都可以)。坦白地说,据我所知,只要看看man页面

是否有描述POSIX系统调用阻塞行为的参考文档


到目前为止,我的启发式方法是标记为可能阻止任何可能因
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:For
fnctl()
,这就是我的观点。你必须给一个标志,使其非阻塞。至于其他人,我不知道。你需要对此有多精确?您是否正在编写一些真正对性能至关重要的代码,根本无法等待?那么
关机(2)
插座(2)
呢?他们是什么样的例子?对,当我说阻塞时,我说阻塞的时间不确定,正如Jonathan Leffler所理解的。作为“POSIX库中的每个调用都默认阻塞”的反例,
getpid()
系统调用不阻塞;句号。
man
页面没有提供足够的信息,我也不相信我的常识。示例有
socket(2)
shutdown(2)
fnctl(2)
和命令F_SETFL等等。这就是为什么我希望有一个全面的文档来告诉我这些。@JonathanLeffler:但它也不是异步的。它确实返回其任务要返回的值,这意味着它不是非阻塞的。这不像你调用
getpid()
,然后执行其他代码,然后再得到结果。@DanielBünzli:For
fnctl()
,这就是我的观点。你必须给一个标志,使其非阻塞。至于其他人,我不知道。你需要对此有多精确?您是否正在编写一些真正对性能至关重要的代码,根本无法等待?那么
关机(2)
插座(2)
呢?他们是什么样的例子?对,当我说阻塞时,我说阻塞的时间不确定,正如乔纳森·莱夫勒所理解的。