Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C O_非阻塞意外行为_C_Linux_Sockets_Unix_Networking - Fatal编程技术网

C O_非阻塞意外行为

C O_非阻塞意外行为,c,linux,sockets,unix,networking,C,Linux,Sockets,Unix,Networking,我用fcntl使用socket和设置O_NONBLOCK,但应用程序仍消耗100%的CPU。即使我使用select,等待时间也为1毫秒 出于阅读目的,我使用recv 我在没有O_NONBLOCK的情况下尝试了它,在这种情况下,它不会消耗100%的CPU,但是recv需要很多时间。我尝试了使用O_非阻塞选项的recv,但recv仍然需要花费大量(有时是200毫秒)的阅读时间。 我们正在使用select,那么为什么recv需要花费很多时间呢 我不能使用第一个选项(带O_非块的套接字),因为CPU被占

我用fcntl使用socket和设置O_NONBLOCK,但应用程序仍消耗100%的CPU。即使我使用select,等待时间也为1毫秒

出于阅读目的,我使用recv

我在没有O_NONBLOCK的情况下尝试了它,在这种情况下,它不会消耗100%的CPU,但是recv需要很多时间。我尝试了使用O_非阻塞选项的recv,但recv仍然需要花费大量(有时是200毫秒)的阅读时间。 我们正在使用select,那么为什么recv需要花费很多时间呢

我不能使用第一个选项(带O_非块的套接字),因为CPU被占用,而在第二个选项中有时间延迟


任何人都可以提出意见。这是一个客户端应用程序。

我认为这并不意外。如果设置非阻塞模式,
recv
将不会阻塞等待。换句话说,它将返回数据是否可用,这很可能会占用您的CPU

<>我也会考虑增加<代码>选择< /代码>超时。没有真正的理由让它这么小,因为这也可能会消耗CPU

我倾向于使用诸如秒的值来表示
select
timeout,因为这是我在其他事情上需要的延迟(比如及时处理CTRL-BREAK信号)


这为进程在等待数据可用时提供了大量非CPU密集型时间。如果它在不到一秒钟的时间内可用,那么您将更早地了解它(
select
将返回)。

我认为这并不意外。如果设置非阻塞模式,
recv
将不会阻塞等待。换句话说,它将返回数据是否可用,这很可能会占用您的CPU

<>我也会考虑增加<代码>选择< /代码>超时。没有真正的理由让它这么小,因为这也可能会消耗CPU

我倾向于使用诸如秒的值来表示
select
timeout,因为这是我在其他事情上需要的延迟(比如及时处理CTRL-BREAK信号)

这为进程在等待数据可用时提供了大量非CPU密集型时间。如果它在不到一秒钟的时间内可用,那么您将更早地了解它(
select
将返回)。

select()经过优化,可以在您使用更长的超时时间时进入有效的等待状态(不消耗太多CPU)。尝试30秒左右。当某个监视的文件描述符上发生活动时,它将立即返回,以便您可以执行您的工作

试着在strace-v-ttt或tcpdump下查看您的进程,以寻找关于高延迟的提示,或者显示相关代码

还要注意,select可以更改timeval结构,因此请记住重置select()调用之间的值。

select()经过优化,可以在使用较长超时时进入有效的等待状态(不消耗太多CPU)。尝试30秒左右。当某个监视的文件描述符上发生活动时,它将立即返回,以便您可以执行您的工作

试着在strace-v-ttt或tcpdump下查看您的进程,以寻找关于高延迟的提示,或者显示相关代码


还要注意,select可以更改timeval结构,因此请记住在select()调用之间重置值。

“为了使用recv进行读取,并且一旦未设置O_非块,则不会消耗100%的CPU,如果在这种情况下,使用O_非块选项的recv读取值会花费很多时间。”“为了使用recv进行读取,并且一旦未设置O_非块,则其不会消耗100%的CPU,如果在这种情况下,使用O_非块选项进行recv会花费大量时间来读取值。”选择()即使在其中一个FD_集合中有O_NONBLOCK套接字,也将阻止。O_NONBLOCK用于i/O,而不是边缘触发就绪通知。@ggiroux:这不是真正相关的,但是
select
是级别触发的,而不是边缘触发的。是的,对不起,我搞糊涂了,忘了这一点,自从我发表评论后,pax也澄清了他的答案。select()即使在其中一个FD_集合中有O_非块套接字,也将阻止。O_非块用于i/O,而不是边缘触发就绪通知。@ggiroux:这并不相关,但
select
是级别触发的,而不是边缘触发的。是的,对不起,我搞糊涂了,忘了这一点,pax也澄清了他的答案,因为我评论了。30秒有点多。关于1.5-2秒对于用户请求的操作是很好的,当网络访问不起作用时(例如,错误的对等地址或网络关闭),给他们一个取消的机会时间实际上取决于您需要服务的select之外的其他事件。对于一个非交互式守护进程来说,30秒可能很好,它只会在一个月内关闭一次。如果您的进程有另一个线程运行,则可能需要1毫秒。
rm-rf/
:-)同意30秒可能过多,但select()也可以通过信号自动中断。无论如何,它应该是可配置的:)。我怀疑OP正在进入recv()和/或select()的忙循环-strace应该说明这一点。如果您必须退出select循环来轮询某些内容,那么您的应用程序设计得很糟糕。信号处理程序无论如何都无法完成任何重要的工作,因此让他们写下select监视的哨兵管道是很容易的。同样,对于用户输入,请将X套接字或stdin连接到select。等等如果您有一个必须在特定时间发生的事件,那么几乎没有理由让select超时。30秒有点多。大约1.5-2秒对于用户请求的操作是很好的,以便在网络访问不工作时(例如,错误的对等地址或网络关闭)给他们取消的机会时间实际上取决于select之外需要服务的其他事件。对于一个非交互式守护进程来说,30秒可能很好,它只会在一个月内关闭一次。如果您的进程有另一个线程正在运行,则可能需要1毫秒。
rm-rf/
:-)同意30秒可能过多,但select()可能会过多