- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经阻塞,然后通过以下代码等待信号:
sigset_t set;
sigfillset(&set); // all signals
sigprocmask(SIG_SETMASK, &set, NULL); // block all signals
siginfo_t info;
int signum = sigwaitinfo(&set, &info); // wait for next signal
struct sigaction act;
sigaction(signum, NULL, &act); // get the current handler for the signal
act.sa_handler(signum); // invoke it
最后一行生成段错误,因为处理程序设置为 SIG_DFL
(定义为 0
)。如果设置为 SIG_DFL
hoặc SIG_IGN
,我如何手动调用默认处理程序?另请注意,SIG_IGN
定义为 1
.
1 Câu trả lời
如您所见,您无法调用 SIG_DFL 和 SIG_IGN 本身。但是,您可以或多或少地模仿他们的行为。
简单地说,模仿正常的信号处理是:
sa_handler
来说非常容易这是否符合您的要求?
#include
#include
/* Manually dispose of a signal, mimicking the behavior of current
* signal dispositions as best we can. We won't cause EINTR, for
* instance.
*
* FIXME: save and restore errno around the SIG_DFL logic and
* SIG_IGN/CHLD logic.
*/
void dispatch_signal(const int signo) {
int stop = 0;
sigset_t oset;
struct sigaction curact;
sigaction(signo, NULL, &curact);
/* SIG_IGN => noop or soak up child term/stop signals (for CHLD) */
if (SIG_IGN == curact.sa_handler) {
if (SIGCHLD == signo) {
int status;
while (waitpid(-1, &status, WNOHANG|WUNTRACED) > 0) {;}
}
return;
}
/* user defined => invoke it */
if (SIG_DFL != curact.sa_handler) {
curact.sa_handler(signo);
return;
}
/* SIG_DFL => let kernel handle it (mostly).
*
* We handle noop signals ourselves -- "Ign" and "Cont", which we
* can never intercept while stopped.
*/
if (SIGURG == signo || SIGWINCH == signo || SIGCONT == signo) return;
/* Unblock CONT if this is a "Stop" signal, so that we may later be
* woken up.
*/
stop = (SIGTSTP == signo || SIGTTIN == signo || SIGTTOU == signo);
if (stop) {
sigset_t sig_cont;
sigemptyset(&sig_cont);
sigaddset(&sig_cont, SIGCONT);
sigprocmask(SIG_UNBLOCK, &sig_cont, &oset);
}
/* Re-raise, letting the kernel do the work:
* - Set exit codes and corefiles for "Term" and "Core"
* - Halt us and signal WUNTRACED'ing parents for "Stop"
* - Do the right thing if we forgot to handle any special
* signals or signals yet to be introduced
*/
kill(getpid(), signo);
/* Re-block CONT, if needed */
if (stop) sigprocmask(SIG_SETMASK, &oset, NULL);
}
làm mới(回应OP的优秀问题)
1: does this slot in after the sigwaitinfo?
是的。像这样的东西:
... block signals ...
signo = sigwaitinfo(&set, &info);
dispatch_signal(signo);
2: Why not raise those signals handled by SIG_IGN, they'll be ignored anyway
在用户空间中执行 noop 比通过三个系统调用(重新引发、取消屏蔽、重新屏蔽)稍微高效一些。此外,当 SIG_IGNored 时,CHLD 具有特殊的语义。
3: Why treat SIGCHLD specially?
最初(检查答案编辑)我没有——在 SIG_IGN 案例中重新提出它,因为IGNored CHLD signals tell the kernel to automatically reap children .
但是,我更改了它,因为"natural" CHLD signals carry information aboutthe terminated process (至少 PID、状态和真实 UID)。用户生成的 CHLD 信号不具有相同的语义,并且在我的测试中,忽略它们不会导致 2.6 自动获取 SIGCHLD 排队的僵尸被“错过”了。所以,我自己做。
4: Why are "stop" related signals unblocking CONT. Will not invoking the default handler for CONT unstop the process?
如果我们停止(不执行)并且 CONT 被阻塞,我们将永远不会收到叫醒我们的信号!
5: Why not call raise instead of the kill line you've given?
个人喜好; raise()
也可以。
关于linux - 在 Linux 上显式调用 SIG_DFL/SIG_IGN 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3147840/
Đặt trình xử lý tín hiệu thành SIG_IGN sẽ khiến tín hiệu bị bỏ qua khi chạy chương trình bình thường, nhưng không phải khi chạy chương trình thông qua gdb. Tôi đang tạo bộ đếm thời gian bằng các hàm timer_create và timer_settime. Tôi không
Tôi đang thử nghiệm giải pháp chống gỡ lỗi bằng phương thức ptrace int main(int argc, char **argv) { void *handle; long (*go)(enum __p
#define SIG_IGN (void (*)(int))1 #define SIG_HOLD (void (*)(int))5 #define SIG_ERR ((void
Tôi có một tiến trình chính và một số tiến trình con được sinh ra từ tiến trình đó. Đến một thời điểm nào đó, tôi phải gửi tín hiệu SIGINT đến tất cả các tiến trình con thay vì tiến trình chính. Tôi không thể lưu trữ pid cho tất cả các tiến trình con. Vì vậy, tôi sử dụng SIG_IGN trong quy trình chính để bỏ qua SIGINT và
Tôi biết mục đích tương ứng của SIGPIPE và SIGIGN. Signal(SIGPIPE, SIG_IGN); có tác dụng gì? Câu trả lời tốt nhất là signal(SIGPIPE, SIG_IGN); đơn giản là bỏ qua tín hiệu.
Trong các định nghĩa sau: #define SIG_ERR (void (*)())-1 #define SIG_DFL (void (*)())0 #define SIG_IGN (void (*)())1
Tôi đã tham gia một dự án cũ và tìm thấy dòng này - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NS
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 =
POSIX.1-2017 chỉ định trong XSH 2.4.3 SIG_IGN rằng hành vi của một quy trình không được xác định sau khi nó bỏ qua SIG
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!