gpt4 book ai didi

c++ - 从 cin 读取进程的 HUP 信号

转载 作者:行者123 更新时间:2023-12-01 14:47:55 24 4
gpt4 key购买 nike

我有一个可执行文件,它总是在循环中从 std::cin 读取输入,我也有一个 SIGHUP 处理程序。

#include <iostream>
#include <signal.h>

void hupHandler(int)
{
std::cout << "Handled sighup" << std::endl;
}

int main(int, char*[])
{
struct sigaction sigHupHandler{};
sigHupHandler.sa_handler = hupHandler;
sigemptyset(&sigHupHandler.sa_mask);
sigHupHandler.sa_flags = 0;
sigaction(SIGHUP, &sigHupHandler, nullptr);

while(true)
{
std::string input;
std::getline(std::cin, input);
std::cout << "Read input \"" << input << "\"" << std::endl;
}

std::cout << "Child Exiting" << std::endl;

return 0;
}

当我在终端上启动可执行文件并使用 kill -HUP 发送 SIGHUP 我看到它处理 SIGHUP 但之后我看到以下无限打印 -
$ ./child 
Handled sighup
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""
Read input ""

有人可以向我解释这种行为吗?我实际上需要一个在后台运行并不断监听其标准输入的进程(另一个进程提供给它的标准输入)。如果它已被 SIGHUP,我还需要它来重新加载配置。我注意到,一旦我 HUP 它就会进入一个读取空行的循环。所以我写了这个实用程序来测试,我看到了相同的行为。任何帮助将不胜感激,谢谢!

最佳答案

你不能在信号处理程序中做任何你想做的事情。信号处理程序可以中断程序 随时 .包括当它在 C++ 库函数或类中执行某些操作时,并且 C++ 库函数、模板等都不是可重入的,就像那样。您几乎不能使用任何 C++ 库代码,当然也不能 std::cout , 在信号处理程序中。你甚至做不到newdelete任何事情。这是第一个问题,这里。

您也不能使用 C 库函数。它们也不是可重入的。在信号处理程序中你唯一能做的就是使用操作系统调用,比如打开/关闭/读/写等。 (基本上,手册页的第 2 部分),直接。

因此,显示的代码是未定义的行为,您不能指望它以任何方式、形状、物质或形式可靠地工作,只要您的信号处理程序执行它所做的工作。

此外,当一个进程处于系统调用本身的中间时(取决于特定的系统调用),捕获的信号会导致失败并带有特定的 errnoEINTR .这在您的 signal(7) 中有所描述。手册页,您应该阅读。 C++ 库很可能会将此解释为从文件读取的任何其他错误,并将流设置为失败状态,这看起来就像您看到的行为。你也必须自己处理。

关于c++ - 从 cin 读取进程的 HUP 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61611266/

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