2017-10-10 60 views
-1

我正在运行linux 4.13.3,gcc 7.2.0。当在非阻塞服务器套接字上接收到新请求时,为什么从睡眠()恢复进程?

相关的代码是......。这样

while(1) { 
    // let server be the nonblocking server socket 
    int client = accept(server, &addr, &addrlen); 
    if(client != -1) { 
     foo(client); 
    } else { 
     sleep(someTime); 
    } 
} 

我知道我应该使用select /调查/ epoll的,为此目的,

但为什么犯规睡眠()返回时,在套接字上接收新的数据?

+2

这样做是因为'sleep'不只是把过程睡觉。没有检查文件描述符上的事件(除非它引起信号)。您可能想要使用['select'](http://man7.org/linux/man-pages/man2/select.2.html)或['poll'](http://man7.org/linux/ man-pages/man2/poll.2.html)。 –

+0

所以真正的问题应该是,当一个相关的套接字接收到数据时,为什么没有任何信号发生,对吧? –

+0

当我说“信号”时,我的意思是'SIGINT'或'SIGUSR1'或类似的。这些信号通常不是由描述符产生的。如果你想接收关于套接字(或者一般描述符)的通知,那么首先学习'select'或者'poll'(如我之前的评论中提到的)。这些都是常见的方式,既要去睡觉*和*轮询描述符事件。还有其他方法来轮询描述符,但从这两个开始。 –

回答

-1

void sig_handler(int sig){} 
... 
signal(SIGIO, sig_handler); 
fcntl(server, SETOWN, getpid()) 
fcntl(server, SETFL, fcntl(server, GETFL) | O_NONBLOCKING | O_ASYNC); 
...