当在非阻塞服务器套接字上接收到新请求时,为什么从睡眠()恢复进程?
问题描述:
我正在运行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的,为此目的,
但为什么犯规睡眠()返回时,在套接字上接收新的数据?
答
前
void sig_handler(int sig){}
...
signal(SIGIO, sig_handler);
fcntl(server, SETOWN, getpid())
fcntl(server, SETFL, fcntl(server, GETFL) | O_NONBLOCKING | O_ASYNC);
...
这样做是因为'sleep'不只是把过程睡觉。没有检查文件描述符上的事件(除非它引起信号)。您可能想要使用['select'](http://man7.org/linux/man-pages/man2/select.2.html)或['poll'](http://man7.org/linux/ man-pages/man2/poll.2.html)。 –
所以真正的问题应该是,当一个相关的套接字接收到数据时,为什么没有任何信号发生,对吧? –
当我说“信号”时,我的意思是'SIGINT'或'SIGUSR1'或类似的。这些信号通常不是由描述符产生的。如果你想接收关于套接字(或者一般描述符)的通知,那么首先学习'select'或者'poll'(如我之前的评论中提到的)。这些都是常见的方式,既要去睡觉*和*轮询描述符事件。还有其他方法来轮询描述符,但从这两个开始。 –