在信号处理程序中不允许对象或函数
Object or function not permitted within signal handlers
我正在寻找"信号处理程序中不允许的对象或函数"的定义。它用于N3797:
第3.6.3/4节如果使用标准库对象或函数而不是在信号处理程序(18.10)中被允许,以前没有发生过(1.10)完成静态存储对象的销毁std::atexit注册函数(18.5)的持续时间和执行程序有未定义的行为
在一般情况下,我想找到一个例子,这个UB规则
在18.10/9引述的草稿中:
在信号处理程序中允许的C和c++语言的公共子集包括可能出现在格式良好的c++程序和符合标准的C程序中的所有声明、定义和表达式。一个POF("普通旧函数")是一个函数,它只使用这个通用函数的特性子集,它不直接或间接使用任何函数不是POF,但它可以使用第29条定义的函数它们不是成员函数。所有的信号处理程序都应该有C联系。一种POF,可以在规范中用作信号处理程序C程序作为信号使用时不会产生未定义行为c++程序中的处理程序。c++程序中用作信号处理程序的任何其他函数的行为都是由实现定义的。228
是在c++和C中都有效的函数。此外,你可以使用原子非成员函数(第29条)。实现可能允许其他函数工作,但请注意:
228)特别是,使用异常处理的信号处理程序非常可能会有问题。另外,调用std::exit可能会导致对象的销毁,包括标准库中的对象类中产生未定义的行为信号处理程序(见1.9).
根据你引用的规则,在大多数情况下,在main
完成后,留下一些线程运行,所有静态变量都被销毁,将导致UB。只有当函数是信号安全的并且不使用标准库时才允许。
相关文章:
- 如何创建对象函数指针C++映射?
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 如何将对象函数的实例传递给另一个函数
- 调用模板函数的问题"No matching function for call"参数:迭代器、对象函数
- makefile对我的名称空间对象/函数/构造函数的不确定引用
- 将对象函数转换为函数指针
- 非对象函数/类函数C++
- 线程对象函数 C++
- C 将成员对象函数分配给类成员功能
- 使用基本指针调用派生对象函数
- 可以(通过编译器)使用多少个线程来初始化全局对象(函数main之前)
- C++类对象函数
- 对对象::函数的未定义引用
- 无法弄清楚将多个对象函数作为单独的线程调用的语法
- 在提升作用域出口中调用对象函数
- 使用基指针来使用派生对象函数
- 在for_each lambda 中调用对象函数
- C++:: 模板函数 - 从对象函数获取对象的地址
- Qt5 未解析的外部静态元对象函数
- 通过变量使用对象和对象函数