慢速系统调用与信号的关系
我正在学习缓慢的系统调用和信号。
对于普通系统,缓慢的系统调用(从终端设备读取)可能会永远阻塞。
在下面的示例中,在一段时间后读取可能会超时。
但是当我执行它时,超时没有任何作用。
我不明白为什么。
你能解释一下并给我展示另一个缓慢系统调用的例子吗?
#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);
}
I'm learning slow system call and signals.
For the normal system, the slow system call (read from terminal device) can block forever.
and below example, it is possible to read to time out after some amount of time.
But when I excuted it, The time out does nothing.
I can't understand why.
Could you explain and show me another example of slow system call?
#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);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
一秒钟后你的处理程序就会被调用。如果你检查你会看到它被调用。我不建议放置
printf
因为它不是异步信号安全的,放置你可以让它设置一个变量或其他东西。无论如何,回到问题。如果您想知道为什么
读取
不会因EINTR
而失败,答案是SA_RESTART
。在大多数 Unix 系统上,一些系统调用会在出现信号时自动重新启动。该列表不是标准的,但 IIRC
read(v)
、write(v)
和朋友是经常重新启动的列表的一部分。Your handler gets called after a second. If you check you will see it gets called. I don't recommend putting a
printf
since it's not async-signal-safe, put you can make it set a variable or something.Anyway, back to the question. If you're wondering why the
read
doesn't fail withEINTR
the answer isSA_RESTART
. On most Unix systems a few system calls are automatically restarted in the event of a signal.The list is not standard but IIRC
read(v)
,write(v)
and friends are part of the ones commonly restarted.