[英]Not to send SIGINT to a child when SIGINT is sent to a parent
当SIGINT
发送给父进程时,有没有办法不将SIGINT
发送给子进程? 例子:
main.c
:
#define _GNU_SOURCE
#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sched.h>
int run_python(void* arg){
(void) arg;
char *const args[] = {"python3", "run.py", NULL };
execve("/usr/bin/python3", args, NULL);
return 0;
}
int main(void){
char *stack = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 1234, 0);
clone(run_python, stack + 4096, 0, NULL);
sleep(10);
return 0;
}
作为子运行的程序run.py
:
import sys
import time
import signal
f = open("output.output", 'w')
def recieved_sigint(*args):
print("Received sigint", file=f, flush=True)
sys.exit(1)
signal.signal(signal.SIGINT, recieved_sigint)
while(True):
print("Test", file=f, flush=True)
time.sleep(1)
问题是在执行main.c
并按Ctrl+C
时, run.py
程序也会收到SIGINT
。 打印字符串"Received sigint"
。
有没有办法不将SIGINT
发送给clone
ed- execve
的孩子?
请注意,这是内核向附加到终端的进程组中的所有进程发送键盘生成的信号,例如SIGINT
。
在使用clone
生成子代之前,使用sigprocmask
在父代中阻止SIGINT
。 子代继承信号掩码。
产卵后解除封锁SIGINT
。 待解除的SIGINT
将在解除阻塞时交付(如果有)。
在生成子进程时忽略带有SIG_IGN
的信号有丢弃信号的风险,这可能导致无法可靠再现的零星错过信号竞争条件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.