c - 防止 control-c 向所有进程组子进程发送 SIGINT

标签 c terminal signals posix

我正在尝试与一个非常蹩脚、完全不透明的 API 进行交互,该 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 内的命令。但除了操作系统提供的功能之外,它绝对没有发送中断的功能。)

最佳答案

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

关于c - 防止 control-c 向所有进程组子进程发送 SIGINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20103521/

相关文章:

c - 如何使用 C 语言中的 read() 函数读取大文件

c - 如何处理 WTL/Win32 应用程序中 TreeView 的右键单击?

linux - 如何在 Linux 中使用 md5sum 创建递归文件列表并输出到 csv

c++ - 如果我收到信号,我的程序的退出代码应该是什么?

c - C程序中的某种内存错误

c - 在C中通过套接字传输数据

java - 如何通过在 Mac 上分配更多 RAM 的终端运行 .jar

python - 当我执行 pip --version 时,它显示错误为 ImportError : No module named pyparsing

bash - 如何在 tail -f 命令后继续运行脚本

c - 如何在 C 中阻止信号?