慢速系统调用与信号的关系

发布于 2024-11-11 14:25:57 字数 590 浏览 0 评论 0原文

我正在学习缓慢的系统调用和信号。
对于普通系统,缓慢的系统调用(从终端设备读取)可能会永远阻塞。
在下面的示例中,在一段时间后读取可能会超时。

但是当我执行它时,超时没有任何作用。
我不明白为什么。
你能解释一下并给我展示另一个缓慢系统调用的例子吗?

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清风不识月 2024-11-18 14:25:57

一秒钟后你的处理程序就会被调用。如果你检查你会看到它被调用。我不建议放置 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 with EINTR the answer is SA_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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文