- 论坛徽章:
- 0
|
有时候在IO读取时需要设置超时, 但是Linux下面的write ,read 系统调用是自动重启的, 所以下面的代码不能控制超时:
- void sig_alrm(int signo)
- {
- return ;
- }
- int main()
- {
- int n;
- char line[100] = {0};
- if (signal(SIGALRM, sig_alrm) == SIG_ERR)
- {
- perror("signal\n");
- exit(1);
- }
- alarm(5);
- if ((n = read(STDIN_FILENO, line, 100)) < 0)
- {
- if (errno == EINTR)
- {
- printf("yes\n");
- }
- perror("read\n");
- exit(1);
- }
- alarm(0);
- return 0;
- }
复制代码
后来改用了sigaction就可以处理这个问题了, 即:
- void sig_alrm(int signo)
- {
- return ;
- }
- int main()
- {
- int n;
- char line[100];
- struct sigaction act, oact;
- act.sa_handler = sig_alrm;
- sigemptyset(&act.sa_mask);
-
- act.sa_flags |= SA_INTERRUPT;
- if (sigaction(SIGALRM, &act, &oact) < 0)
- {
- perror("sigaction\n");
- exit(1);
- }
- alarm(4);
- if ((n = read(STDIN_FILENO, line, 100)) < 0)
- {
- if (errno == EINTR)
- {
- printf("yes\n");
- }
- perror("read\n");
- exit(1);
- }
- printf("done\n");
- return 0;
- }
复制代码
就是设置成SA_INTERRUPT, 这样就可以打断系统调用read了. 但是我想请教的问题是为什么我把act.sa_flags != SA_INTERRUPT; 这一行去掉之后, 仍然可以进行超时控制呢?就是说仍然工作正常, 设不设置这一位, 系统调用都不会重启. 而之前的signal却总是会重启的. 请教一下是怎么回事? 谢谢大家! |
|