繁体   English   中英

向父母发送 SIGINT 时不要向孩子发送 SIGINT

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM