C-执行未定义为异步安全的函数,例如MMAP(2),在信号处理程序中效果其他异步 - 安全功能



我正在制作一个库,该库被注入流程并重新定义一些功能,例如打开(2(在调用真实打开之前执行某些任务(2(。我的图书馆会致电mmap(2(。由于开放(2(是异步安全的,因此使用库的人可能在信号处理程序中打开(2(的人以及我的图书馆也添加了MMAP(2(的呼叫可以使他的呼叫打开(2(出错?

更新的问题:

void handle_sigint(int sig)
{
    int fd = open(“file”, O_RDWR, 0666);
    void *base = mmap(NULL, 20, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
}

在上述功能中,是否会呼叫(2(,因为我称之为mmap(2(?

是。

如果您的替代open()调用不是异步信号安全的函数,则信号处理程序调用您的功能是不安全的。它具有与标准函数相同的名称和签名,而 async-signal-safe是无关紧要的。它称为替换功能或其他异步信号安全函数是无关紧要的。预期的信号处理程序对不是异步信号安全的函数的呼吁不会是无关紧要的。

响应问题更新:如果问题中显示的函数称为信号处理程序,则由于其呼叫mmap()的呼吁而具有不确定的行为。无法预测该UB的细节,至少不是根据相关标准。这就是"未定义"的含义。没有理由认为open()调用的实际和明显效果会以某种方式保护免受干扰。也不是一般信号处理机制。程序中也没有其他任何内容。

您从UB的轨迹获得的距离越远,任何明显的效果的可能性就越小,OS越有可能包含它,但是UB并不是要混乱的。原则上,它可能表现为计算机产生功能中的任何行为或行为,例如擦除磁盘,关闭CPU风扇或将密码邮寄给黑客。

这是完全可能的。另一个冲突将是在Main上运行的MMAP((,该MMAP((被Sighandler打断,该sighandler调用open((,该epter((调用mmap((导致mmap((reenter。

这里的大关键字是"重新入侵":您在Sighandler中使用的任何功能都必须重新进入。这意味着,该函数仅操纵堆栈数据,或者,如果它操纵全局数据或状态,则必须以原子方式进行。原子性是一个非常困难的成就,它带来了必须处理的更可怕的副作用(即,僵局,需要回滚/重新启动行为……如果您对RDB的经验有任何经验,则应知道(。在这种情况下,mmap((是麻烦的母星,因为它不仅可以操纵过程静态数据,还可以交叉 - 过程静态数据。

最新更新