我正在寻找“对象或函数不允许在信号处理程序”的定义。在SEC里用的。N3797的3.6.3/4:
总的来说,我想为这个UB规则找到一个例子。
在18.10/9中引用的草案中:
C和C++语言的共同子集包括所有的声明、定义和表达式,这些声明、定义和表达式可能出现在一个结构良好的C++程序中,也可能出现在一个兼容的C程序中。POF(“Plain old function”)是一个只使用该公共子集的功能的函数,它不直接或间接使用任何不是POF的函数,除了它可以使用第29条中定义的不是成员函数的函数。所有信号处理器都应具有C联动。可以在符合C程序中用作信号处理程序的POF在C++程序中用作信号处理程序时不会产生未定义的行为。在C++程序中用作信号处理程序的任何其他函数的行为都是由实现定义的。228
信号处理程序中允许的函数在C++和C中都有效。此外,您还可以使用原子非成员函数(第29条)。实现可能允许其他功能工作,但请注意:
228)特别是,使用异常处理的信号处理程序很可能会出现问题。此外,调用std::exit可能会导致对象的破坏,包括标准库实现的对象,这通常会在信号处理程序中产生未定义的行为(参见1.9)。
根据您引用的规则,在大多数情况下,在main
完成并销毁所有静态变量后,让某些线程运行会导致UB。只有当函数是信号安全的并且不使用标准库时才允许。
问题内容: 我需要在接收到任何终止命令(如SIGTERM和SIGKILL)时写入日志文件。 我可以注册SIGTERM,但是如何处理SIGKILL信号? 问题答案: 您不能,至少不是因为进程被杀死。 您 可以 做的是安排父进程监视子进程的死亡,并采取相应的措施。任何体面的过程监控系统(例如daemontools)都内置了这样的工具。
我正在开发一个用PHP编写的预分叉TCP套接字服务器。 守护进程(父进程)分叉一定数量的子进程,然后等待,直到它被告知退出并且子进程都走了或者它收到信号。 SIGINT和SIGTERM使其将SIGTERM发送给所有子级。 孩子们建立了他们自己的信号处理器:SIGTERM导致一个干净的退出。SIGUSR1导致它转储一些状态信息(只需在下面的示例代码中打印出它收到了信号)。 如果子异常退出,则父级启动
问题内容: 我的理解是,通常来说,如果您从信号处理程序调用非异步信号安全函数,则行为是不确定的,但是我听说linux允许您安全地调用任何系统调用。这是真的?另外,SIGSEGV处理程序的唯一可移植行为是中止或退出,但是我知道如果您返回,Linux实际上将恢复执行,是吗? 问题答案: 我相信可以从信号处理程序中调用任何实际的系统调用。真实的系统调用中的数字为(或)。 手册页第2节中的某些posix函
我有以下CPP代码。我想做的是当我的本机端发生错误时,我会通知Java错误。我使用了如何捕获SIGSEGV(分段错误)并在Android上的JNI下获取堆栈跟踪?作为参考。 一切正常,但对 myClass.nativeCrashed() 的调用不起作用。我做错了什么?
问题内容: 这应该非常简单,并且令我感到惊讶的是,我还没找到关于stackoverflow的答案。 我有一个类似程序的守护程序,该程序需要响应SIGTERM和SIGINT信号才能与新贵一起正常工作。我读到最好的方法是在与主线程不同的线程中运行程序的主循环,并让主线程处理信号。然后,当接收到信号时,信号处理程序应通过设置通常在主循环中检查的哨兵标志来告诉主循环退出。 我已经尝试过这样做,但是它没有按
在Linux中,当一个程序(可能有多个线程)收到信号(如SIGTERM或SIGHUP)时会发生什么? 哪个线程拦截信号?多个线程可以获得相同的信号吗?是否有专门处理信号的特殊线程?如果没有,那么处理信号的线程内部会发生什么?信号处理程序例程完成后,执行如何继续?