阻止control-c将SIGINT发送给所有进程组子进程

时间:2013-11-20 18:04:45

标签: c terminal signals posix

我正在尝试与一个非常糟糕,完全不透明的API接口,它在C中类似POSIX的环境(OS X / Linux)中创建两个子进程。基本上,它启动一个外部程序并为传递消息提供基本支持来来回回。进程树看起来像这样:

+ My_program
 \
  + an initiation shell script (csh -f -c external_program_startup_script)
   \
    - the external program instance

当我在My_program运行时按下终端中的control-c时,控制终端将SIGINT发送到其进程组中的所有进程 - 以上三个进程。我希望 SIGINT到达程序实例,但如果它也命中了shell脚本,则终止该中间进程并切断通信链接。

My_program内,我可以设置一个信号处理程序来忽略SIGINT。但我完全无法控制这两个子进程(API甚至不公开它们的PID),因此现有的解决方案(如更改其进程组或附加处理程序)将无法正常工作。有没有办法阻止控制终端将SIGINT发送到前台进程组中的所有进程?

(有问题的API是MATLAB's libeng,允许外部C程序在MATLAB中处理命令。但它绝对没有发送超出操作系统提供的中断的功能。)

1 个答案:

答案 0 :(得分:1)

您需要在单独的控制组中运行子流程。您可以通过正确使用setpgid()函数来实现这一点。调用fork()后,在子进程中运行setpgid(),然后执行要在单独的组中运行的程序。