gpt4 book ai didi

信号处理程序中的 C++ 打印?

转载 作者:行者123 更新时间:2023-12-05 09:33:25 32 4
gpt4 key购买 nike

我搜索了很多但没有人回答我的问题,我读到在这样的信号处理程序中使用 cout 是不安全的:

void ctrlZHandler(int sig_num) {
//SIGTSTP-18
std::cout << "smash: got ctrl-Z" << std::endl;
SmallShell::route_signal(sig_num);
}
  1. 如果我将打印移到 route_signal 中,是否可以解决问题?

  2. C++11 中是否有可安全调用的函数列表?

  3. 如果唯一的解决方案是使用 write,你能给我看简短的例子吗?假设 route_signal 有 100 个打印,我应该用 write() 替换所有吗?由于需要分配内存和释放内存,这听起来让人筋疲力尽......

最佳答案

使用std::cout的原因不推荐内部信号处理程序是因为信号可能会随时中断您正在运行的代码 std::cout::operator <<不可重入。

这意味着如果您正在执行 std::cout::operator <<当发出信号并在其执行过程中使用它时,结果是未定义的。

所以,不。将其移至 route_signal不会解决这个问题,您应该替换所有 std::cout 的调用在!

一种解决方法是设置一个标志,表明已收到此信号,并在信号返回后在信号处理程序外部创建一个输出。

关于信号处理程序中的 C++ 打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67282215/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com