Linux 在非阻塞服务器套接字上接收到新请求时,为什么进程不从sleep()恢复?
我运行的是Linux4.13.3,GCC7.2.0 相关代码是这样的Linux 在非阻塞服务器套接字上接收到新请求时,为什么进程不从sleep()恢复?,linux,sockets,network-programming,sleep,Linux,Sockets,Network Programming,Sleep,我运行的是Linux4.13.3,GCC7.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); } } 我知道我
while(1) {
// let server be the nonblocking server socket
int client = accept(server, &addr, &addrlen);
if(client != -1) {
foo(client);
} else {
sleep(someTime);
}
}
我知道我应该为此使用select/poll/epoll
但是,当套接字上接收到新数据时,为什么sleep()不返回呢?请先执行此操作
void sig_handler(int sig){}
...
signal(SIGIO, sig_handler);
fcntl(server, SETOWN, getpid())
fcntl(server, SETFL, fcntl(server, GETFL) | O_NONBLOCKING | O_ASYNC);
...
因为
sleep
只是让进程进入睡眠状态。不检查文件描述符上的事件(除非它引起信号)。你可能想用or来代替。所以真正的问题应该是,当相关套接字接收到数据时,为什么进程没有信号,对吗?当我说“信号”时,我的意思是例如SIGINT
或SIGUSR1
或类似的。这些信号通常不是由描述符生成的。如果您想接收有关套接字(或一般描述符)的通知,请从了解选择或轮询开始(如我之前的评论中所述)。这些是进入睡眠和轮询描述符事件的常用方法。还有其他的方法来调查描述符,但是从这两个开始。谢谢。我发现需要为SIGIO配置套接字,我认为这是一个默认选项。不,不是,我强烈建议您先了解更简单的select
和poll
函数。然后继续学习更高级的主题,如信号和SIGIO,然后继续学习Linux e波尔系统(它更难使用,但比其他系统更强大、更灵活)。