使用write或async-safe函数从信号处理程序中打印int

14 c signals async-safe

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

是否有一种简单而推荐的方法可以做到这一点?

例如代替printf,我更喜欢write(或任何asyn安全功能).

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;
}
Run Code Online (Sandbox Code Playgroud)

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

write(STDOUT_FILENO, "child terminated", 16);
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 7

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

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

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

但是,我强烈建议使用自管技巧或类似工具将此操作从信号处理程序中取出.

  • 只有第二个选项适用于 SIGSEGV、SIGILL 等信号。自管道技巧在这些情况下也不起作用。 (2认同)