【问题标题】:Why does using write() to write date to a disk block the SIGALRM signal until the write finishes?为什么使用 write() 将日期写入磁盘会阻塞 SIGALRM 信号,直到写入完成?
【发布时间】:2014-11-02 04:27:41
【问题描述】:
#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
#include <stdlib.h>

#define BUFSIZE 500*1024*1024
char buf[BUFSIZE];

static void sig_alrm(int signo) {
    printf("%d\n",time(NULL));
    printf("caught SIGALRM\n");
    fprintf(stderr, "in sig_alrm\n");
}


int main()
{
    int fd;
    fd=open("a.txt",O_WRONLY);
    signal(SIGALRM,sig_alrm);
    printf("%d\n",time(NULL));
    alarm(1);
    write(fd,buf,BUFSIZE);
}

输出:

1414899972
1414899976
caught SIGALRM
in sig_alrm

似乎 SIGALRM 在调用 alarm(1) 后大约 3 秒被捕获。 为什么没有立即捕捉到信号并重新启动系统调用?

【问题讨论】:

  • 请参阅How to avoid using printf() in a signal handler?,了解关于可以和不能在信号处理程序中调用的函数的讨论。
  • @JonathanLeffler:实际上这里的使用几乎是合法的。信号处理程序不能中断非异步信号安全函数,但在从main 返回期间发生,这相当于非AS 安全的exit,可能也应该通过标准被禁止可能会错过这个案例。

标签: c linux io


【解决方案1】:

某些系统调用不允许中断。写入本地磁盘文件就是其中之一。写入 NFS 服务器上的文件取决于它是否使用 intr 选项挂载(我认为这可能只允许某些类型的中断,例如 Ctl-C)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2016-07-10
    • 2020-04-16
    • 2016-01-12
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多