【问题标题】:propogating signal to child processes向子进程传播信号
【发布时间】:2018-12-09 14:23:39
【问题描述】:

我有一个从 shell 脚本开始的进程集合,如下所示:

#!/bin/bash
#This is a shortcut to start multiple storage services

function finish {
    alljobs=$(jobs -p)
    if [ ! -z "$alljobs" ]; then
        kill $alljobs >/dev/null 2>&1
    else
        echo "Entire trio ceased running"
    fi
}
trap finish EXIT

./storage &
P1=$!
./storage &
P2=$!
./storage &
P3=$!
wait $P1 $P2 $P3 

目前,它按照我想要的方式执行,当我向它发送ctrl+c 信号时,脚本会将该信号发送到我的所有后台进程。

但是:我现在扩展了这些程序,以便根据他们从客户端收到的连接/消息,他们可以执行execv,杀死自己并启动一个新的独立程序。 (出于好奇,他们通过启动一个空闲进程来模拟“服务器死机”状态,然后它可能会接收信号以再次启动原始进程。)

问题是,在execv 之后,这个新进程不再响应bash 脚本发送的kill

有没有办法让这个原始脚本的执行(以及随后的信号)也向新的exec'd 进程发送信号?

【问题讨论】:

  • 为什么在标签中使用 C++?
  • 对不起,也许c 更合适;我预计答案可能涉及对execv 调用的一些修改,或者程序的创建方式,目前都在 c++ 中

标签: c bash


【解决方案1】:

我建议您考虑通过父 pid 搜索子进程。更具体地说,在杀死一个 pid 之前,使用 ps 搜索该 pid 的子进程并首先杀死这些子进程。最后,杀死父级。

我感觉在某些情况下存在竞争条件会导致此失败。

【讨论】:

    【解决方案2】:

    更新:我的问题与此脚本完全无关;正在运行/重新启动的进程的pid 从未改变,但我无意中继承了我在程序内部的各个线程中阻塞的信号。对pthread_sigmask 的一些明智调用解决了这个问题。

    感谢@Mark 提供有关子进程的提示;如果有fork 通话正在进行,那将是一个非常好的方法!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      相关资源
      最近更新 更多