- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果我为 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/
SIG_DFL (trình xử lý mặc định cho tín hiệu) thực sự có chức năng gì? Tôi quan tâm đến việc gỡ lỗi SIGTSTP. Nó sẽ hoạt động không bình thường đôi chút trong những điều kiện bất thường. Tôi nghi ngờ rằng nếu một trong các luồng ở trạng thái TASK_ININTERRUPTBLE, nó sẽ thực hiện một việc gì đó như
Tôi đang viết một thư viện trong đó tôi sử dụng fork() và execvp() để khởi chạy một chương trình khác. Theo tôi hiểu, execvX() đặt lại trình xử lý tín hiệu "tùy chỉnh" thành SIG_DFL, nhưng nó không đặt bất kỳ trình xử lý tín hiệu nào bị bỏ qua thành
Tôi không xử lý SIGCHLD trong mã của mình. Quy trình của tôi vẫn bị xóa ngay sau khi chấm dứt. Tôi muốn nó trở thành một quá trình zombie. Nếu tôi đặt SIGCHLD thành SIG_DFL thì nó có hoạt động không? Cách thiết lập SIGCHLD thành SI
Trong các định nghĩa sau: #define SIG_ERR (void (*)())-1 #define SIG_DFL (void (*)())0 #define SIG_IGN (void (*)())1
Lỗi phân đoạn được tạo ra nếu tôi đặt trình xử lý tín hiệu cho SIGSEGV như thế này: int *a = NULL; *a = 1; Trình xử lý sẽ được gọi, nhưng trình xử lý tín hiệu này sẽ chỉ được gọi một lần. Vì vậy, tôi đoán hạt nhân Linux sẽ gửi tín hiệu
Tôi có một vấn đề nhỏ có vẻ kỳ lạ. Tôi đã viết đoạn mã này để xử lý tín hiệu. void sig_install(wlist *arg) { struct sigaction sigstruct; //Thực hiện
Tôi đang cố gắng viết một số mã để sử dụng python để thực hiện một số gói tin đánh hơi bằng pyshark. Tôi có đoạn mã sau: import pyshark print('Pyshark demo') capture =
Tôi đã chặn và sau đó chờ tín hiệu thông qua mã sau: sigset_t set; sigfillset(&set); // tất cả các tín hiệu sigprocmask(SIG_SETMASK, &set, NU
Tôi là một lập trình viên xuất sắc, rất giỏi!