2017-08-28 101 views
4

我目前正在研究与SSH服务器交谈的客户端。 一切正常,但是,因为服务器的回答很慢,所以我必须等待它发送数据。 我有两种选择,我想告诉你什么是最有效的等待服务器的方式。使用sleep()或无限循环等待事件会更好吗?

选择#1:

while (!(ssh_channel_poll(*sshChannel,0))) 
; 

选择#2:

while (!(ssh_channel_poll(*sshChannel,0))) 
    sleep(1); 
+0

那个ssh调用不是阻止吗? –

+0

@MartinJames它没有。轮询是阻止的替代方法。轮询就像,“如果我**做了'read()',它会立即返回吗?” –

+0

好吧,你也可以使用select(),http://man7.org/linux/man-pages/man2/select.2.html系统调用。 – LethalProgrammer

回答

8

两种替代方法都是不可取的。通常情况下,你会使用阻塞读取。我认为它看起来是这样的(因为你说你正在等待服务器):

while (!ssh_channel_poll(...)) { ... } 
ssh_channel_read(...); 

在这种情况下,poll是不必要的。只要确保SSH连接是阻止连接的,并且read函数将等到数据可用,如果在调用时没有可用的数据。

// This is all you need. 
ssh_channel_read(...); 
+0

我最喜欢的方式是异步执行此操作。我调用一个async_read()函数,然后注册一个调用async_read()函数的回调函数,该函数注册相同的回调函数。这给你一个无限的阻塞循环。 – Stewart

+0

@Stewart:我想你在想别的东西吗?这个问题是关于libssh ... –

+0

感谢您的答案。我应该更加明确:我使用ssh_channel_poll()调用来知道为了存储答案需要多少个字节给malloc()。如果我只使用ssh_channel_read(),我必须使用固定长度的缓冲区,但我不能确定它足够大(除非我使用非常大的缓冲区,这不是我猜测的最好的缓冲区)。 – Chouchenn

1

我认为使用sleep而不是无限循环,因为使用无限循环,你正在浪费CPU的功率和时间。当使用sleep时,CPU将能够运行其他程序。

+4

CPU无论如何都可以运行其他程序,因为该进程将被抢占并且其优先级将降低。 –

+0

所有的sleep()调用都是放弃时间片,并且使时序通常对于过程来说很奇怪。这意味着如果你在进入循环之后很快就读了一些东西,你会在实际读取之前产生一个奇怪的,任意的延迟,这是由sleep()引起的。这就是它所做的一切。 – Lundin

0

剪切不是一个好主意。 随着睡眠(...)你几乎不用你的cpu,像空的(...)。

相关问题