首页 文章

向儿童进程传播信号

提问于
浏览
0

我有一组进程,我从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 ,自杀并启动一个新的独立程序 . (好奇的是,他们通过启动空闲进程来模拟"server dead"状态,然后可以接收信号以再次启动原始进程 . )

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

有没有办法允许这个原始脚本的执行(以及后续信令)也向新的 exec 'd过程发送信号?

2 回答

  • 1

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

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

  • 0

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

    我觉得在某些情况下会有竞争条件导致这种情况失败 .

相关问题