使用sleep()或无限循环等待事件会更好吗?
我目前正在研究与SSH服务器交谈的客户端。 一切正常,但是,因为服务器的回答很慢,所以我必须等待它发送数据。 我有两种选择,我想告诉你什么是最有效的等待服务器的方式。使用sleep()或无限循环等待事件会更好吗?
选择#1:
while (!(ssh_channel_poll(*sshChannel,0)))
;
选择#2:
while (!(ssh_channel_poll(*sshChannel,0)))
sleep(1);
两种替代方法都是不可取的。通常情况下,你会使用阻塞读取。我认为它看起来是这样的(因为你说你正在等待服务器):
while (!ssh_channel_poll(...)) { ... }
ssh_channel_read(...);
在这种情况下,poll
是不必要的。只要确保SSH连接是阻止连接的,并且read
函数将等到数据可用,如果在调用时没有可用的数据。
// This is all you need.
ssh_channel_read(...);
我最喜欢的方式是异步执行此操作。我调用一个async_read()函数,然后注册一个调用async_read()函数的回调函数,该函数注册相同的回调函数。这给你一个无限的阻塞循环。 – Stewart
@Stewart:我想你在想别的东西吗?这个问题是关于libssh ... –
感谢您的答案。我应该更加明确:我使用ssh_channel_poll()调用来知道为了存储答案需要多少个字节给malloc()。如果我只使用ssh_channel_read(),我必须使用固定长度的缓冲区,但我不能确定它足够大(除非我使用非常大的缓冲区,这不是我猜测的最好的缓冲区)。 – Chouchenn
你可能想调用poll(2)系统调用(或旧select(2)一个)。然后你需要获得相关的文件描述符。或者使用ssh_channel_poll_timeout函数或ssh_channel_select。
我认为使用sleep
而不是无限循环,因为使用无限循环,你正在浪费CPU的功率和时间。当使用sleep
时,CPU将能够运行其他程序。
CPU无论如何都可以运行其他程序,因为该进程将被抢占并且其优先级将降低。 –
所有的sleep()调用都是放弃时间片,并且使时序通常对于过程来说很奇怪。这意味着如果你在进入循环之后很快就读了一些东西,你会在实际读取之前产生一个奇怪的,任意的延迟,这是由sleep()引起的。这就是它所做的一切。 – Lundin
剪切不是一个好主意。 随着睡眠(...)你几乎不用你的cpu,像空的(...)。
那个ssh调用不是阻止吗? –
@MartinJames它没有。轮询是阻止的替代方法。轮询就像,“如果我**做了'read()',它会立即返回吗?” –
好吧,你也可以使用select(),http://man7.org/linux/man-pages/man2/select.2.html系统调用。 – LethalProgrammer