日期:2014-05-16  浏览次数:20609 次

关于linux信号和系统调用的问题
最近在看unix网络编程:套接字联网,其中讲到用信号来解决进程阻塞在多个IO操作上的问题,感觉有点困惑。假设有下面几句程序:
sigaction();
alarm(5);
if( n = read(sockfd,...,...)< 0){
    if (error == EINT){
         ...
    }
    ...
}
如果网络上一直没有数据包来,那么进程(假设没有设置非阻塞的套接字)一直阻塞在read系统调用上,进程进入睡眠状态,5秒后被信号中断然后返回。
一个进程在两种情况下会处理信号:
一个是从系统调用内核态返回到用户态之前的那段时间。
另一个是进程从睡眠被唤醒之前。
但是进程不是一直在睡眠的吗,难道是alarm时间到产生一个中断信号然后被signal系统调用捕获接着它又唤醒了进程?
不知此想法是否正确,求证。
linux 网络编程 unix 内核 网络

------解决方案--------------------
引用:
Quote: 引用:

然后被signal系统调用捕获接着它又唤醒了进程?
这个不对,signal只是去注册函数,进程是被内核唤醒的。唤醒后他发现自己受到了一个信号,就去处理那个信号。当然那个信号也是内核发给他的。


就是说内核在5秒时间到后给进程发送一个信号以后接着又把进程唤醒?

是的