如何给自己发送信号(同一PID)?

0 投票
2 回答
686 浏览
提问于 2025-04-16 22:53

好的,这可能是个奇怪的情况,但请耐心听我说。

我有一个Python程序,它通过SWIG接口调用一个C++类。现在我需要从C++库异步地向Python代码发送信号(更新状态)。最开始我用的是效率很低的忙等待循环来检查一个标志位。我想用SIGUSR1来替换这个方法。

问题是,我发现虽然这些是不同的“线程”,但它们共享同一个进程ID(PID)。也就是说,Python和C++程序的PID是一样的。我用kill命令发送了信号,Python代码在它的处理函数中捕获到了这个信号,但并没有像我预期的那样中断代码。我尝试了两种在Python代码中等待信号的方法,第一种是调用Python的signal.pause,我听说这个方法在收到信号时应该会被打断。另一种是简单的time.sleep,这个方法也应该有类似的效果——在信号到来时返回。

但不知为什么,这些方法都没有奏效——我的C++代码发送了信号,Python代码接收到了并调用了处理函数,但暂停/睡眠的调用却从未返回。

如果可以正确地向同一个进程发送信号,你会怎么做呢?

(如果这只是个愚蠢的问题,请原谅我,继续往下看吧)

2 个回答

2

如果你在和我一样的程序里,我不太明白你为什么需要信号。在这种情况下,可以看看观察者模式。如果你让你的Python事件处理程序去订阅你C++库里的事件,那你就完全可以不使用信号了。

2

在这里,信号并不是解决问题的好方法。通常,这种情况应该使用线程之间的同步工具,比如:

不过,从C++中操作Python的线程锁并不简单。所以我会采用一种老派但非常简单的方法:

  • 使用一个管道,Python线程从中读取数据,而C++线程在想要唤醒Python时,往这个管道写入一个字节。

撰写回答