我正在学习缓慢的系统调用和信号
对于正常系统,缓慢的系统调用(从终端设备读取)可能永远阻塞
并且在下面的示例中,可以在一段时间后读取到超时。
但当我把它挖出来的时候,暂停并没有什么作用
我不明白为什么
你能解释并给我看另一个慢速系统调用的例子吗?
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
static void sig_alrm(int signo){
}
int main(){
int n;
char line[50];
if(signal(SIGALRM, sig_alrm) == SIG_ERR)
printf("signal(SIGALRM) error");
alarm(1);
if((n = read(STDIN_FILENO, line, 50)) < 0)
printf("read error");
alarm(0);
write(STDOUT_FILENO, line, n);
exit(0);
}
您的处理程序会在一秒钟后被调用。如果你检查一下,你会发现它被调用了。我不建议放一个printf
,因为它不是异步信号安全的,放你可以让它设置一个变量或其他什么。
不管怎样,回到问题上来。如果你想知道为什么read
没有用EINTR
失败,答案是SA_RESTART
。在大多数Unix系统上,一些系统调用会在出现信号时自动重新启动。
该列表不是标准的,但IIRC read(v)
、write(v)
和好友是通常重新启动的列表的一部分。