Linux 在非阻塞服务器套接字上接收到新请求时,为什么进程不从sleep()恢复?

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); } } 我知道我

我运行的是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);
    }
}
我知道我应该为此使用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波尔系统(它更难使用,但比其他系统更强大、更灵活)。