我想在信号处理程序中使用 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 个选择:
阻止信号,除非在您创建的用于处理信号的专用线程中。这个特殊线程可以简单地执行
for (;;) pause();
并且由于pause
是异步信号安全的,信号处理程序可以使用它想要的任何函数;它不仅限于异步信号安全功能。另一方面,它确实必须以线程安全的方式访问共享资源,因为您现在正在处理线程。编写您自己的代码,将整数转换为十进制字符串。这只是一个简单的循环,使用
%10
和/10
剥离最后一位数字并将它们存储到一个短数组中。
但是,我强烈建议使用 self-pipe trick 从信号处理程序中获取此操作。或类似的。
关于c - 使用写入或异步安全函数从信号处理程序打印 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14573000/