sách gpt4 ai đã đi

Khi nào hạt nhân Linux sẽ thiết lập lại trình xử lý tín hiệu cho SIGSEGV thành SIG_DFL?

In lại 作者:太空宇宙 更新时间:2023-11-04 01:17:47 29 4
mua khóa gpt4 Nike

如果我为 SIGSEGV 设置了信号处理程序,则会生成如下段错误:

int *a = NULL;
*a = 1;

处理程序将被调用,但此信号处理程序只会被调用一次。所以,我猜想 Linux 内核会将信号处理程序重置为 SIG_DFL,但是什么时候呢?想知道详情,于是查了Linux内核源码,还没有找到头绪。如果您知道详细信息,请告诉我代码。

1 Câu trả lời

这取决于您如何注册信号处理程序。使用 sigaction 并且没有 SA_RESETHAND 标志,将不会重置为 SIG_DFL(尽管从响应 运行的信号处理程序返回>SIGSEGV 由于段错误而交付在技术上是 UB)。使用 SA_RESETHAND 它将被重置,如果您使用 tín hiệu 注册处理程序,那么处理程序是否会被重置是未指定的(所以不要使用 信号()).

ví dụ:

#include 
#include

int volatile*a;
void h(int Sig) { write(1,"h\n", 2); }
int chính()
{
//sigaction(SIGSEGV,&(struct sigaction){.sa_handler=h}, 0); //won't reset the handler, will likely loop
sigaction(SIGSEGV,&(struct sigaction){.sa_handler=h,.sa_flags=SA_RESETHAND}, 0); //will reset the handler
//signal(SIGSEGV,h); //may or may not reset the handler
*a=1;
trả về 0;
}

关于c - Linux 内核何时会将 SIGSEGV 的信号处理程序重置为 SIG_DFL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53279954/

29 4 0
太空宇宙
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com