【问题标题】:Prevent control-c from sending SIGINT to all process group children阻止 control-c 向所有进程组子进程发送 SIGINT
【发布时间】:2013-12-04 21:26:05
【问题描述】:

我正在尝试与一个非常糟糕、完全不透明的 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 中处理命令。但它绝对没有发送超出操作系统提供的中断的功能。)

【问题讨论】:

  • 我觉得我知道这个问题的答案在某个时候

标签: c terminal signals posix


【解决方案1】:

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

【讨论】:

  • 我没有对子进程的任何访问权限。在对闭源库的一次 API 调用中,所有的分叉都被掩盖了。使用父错误中的setpgid(child_id,child_id) 并拒绝权限。这就是我寻找替代解决方案的原因。
  • @MattB 如果我理解正确的话,这个 API 调用会生成启动 shell 脚本,对吧?如果是,只需 fork(),在 child 中使用 setpgid(),然后调用 API 函数。之后你需要决定是否可以退出这个中间进程,或者是否需要等待子进程完成。
  • @MattB。顺便说一句,你也可以使用 tcsetpgrp() 来设置控制终端——我完全忘记了这个。
  • 嗯,是的,将我自己的孩子添加到链中可能是一个可行的解决方案,但需要另一种 IPC 机制会很痛苦。如果存在,我更喜欢更简单的解决方案。
  • 这是我最终使用的解决方案。没有我想要的那么漂亮,但这是我需要的。谢谢!
猜你喜欢
  • 2013-02-17
  • 2016-03-22
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多