c - 使用写入或异步安全函数从信号处理程序打印 int

标签 c signals async-safe

我想在信号处理程序中使用 write(或任何异步安全函数)将数字打印到日志或终端。我不想使用缓冲 I/O。

是否有一种简单且推荐的方法来做到这一点?

例如代替printf,下面我更喜欢write(或任何异步安全函数)。

void signal_handler(int sig)
{
  pid_t pid;
  int stat;
  int old_errno = errno;

  while((pid = waitpid(-1, &stat, WNOHANG)) > 0)
    printf("child %d terminated\n", pid);

  errno = old_errno;
  return;
}

打印字符串很容易。我可以使用(不打印 pid)代替上面的 printf:

write(STDOUT_FILENO, "child terminated", 16);

最佳答案

如果您真的坚持要从信号处理程序进行打印,您基本上有 2 个选择:

  1. 阻止信号,除非在您创建的用于处理信号的专用线程中。这个特殊线程可以简单地执行 for (;;) pause(); 并且由于 pause 是异步信号安全的,信号处理程序可以使用它想要的任何函数;它不仅限于异步信号安全功能。另一方面,它确实必须以线程安全的方式访问共享资源,因为您现在正在处理线程。

  2. 编写您自己的代码,将整数转换为十进制字符串。这只是一个简单的循环,使用 %10/10 剥离最后一位数字并将它们存储到一个短数组中。

但是,我强烈建议使用 self-pipe trick 从信号处理程序中获取此操作。或类似的。

关于c - 使用写入或异步安全函数从信号处理程序打印 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14573000/

相关文章:

C语言将一个数组的元素范围复制到另一个数组

django - 在 Django 设置之后立即运行启动代码? (也适用于命令)

python - 在 pylab 中更改 numpy.sin(wt) 的振幅和频率

c - 有没有办法测试我是否在信号处理程序中?

c - 生产者/消费者 Mesa 与 Hoare 语义

c - 如何在C中的引号之间找到子字符串

c - 输出负整数到 %u 格式说明符

python - 向 QListWidget 添加或删除项目时发出信号

c - linux信号掩码函数中sig_atomic_t的用法