(LINX-IPC 协议)如何查明具有 PID 的进程是不是在 C++ 中运行?

Posted

技术标签:

【中文标题】(LINX-IPC 协议)如何查明具有 PID 的进程是不是在 C++ 中运行?【英文标题】:(LINX-IPC protocol) How to find out if a process with a PID is running in C++?(LINX-IPC 协议)如何查明具有 PID 的进程是否在 C++ 中运行? 【发布时间】:2017-05-22 20:37:29 【问题描述】:

我有一个 LINX 进程的 PID(通过“linxstat”命令获得),我想将 LINX 信号 (http://linx.sourceforge.net/linxdoc/doc/html/linx.7.html) 发送到:

Cmn::Ipc<ASig> sig(A_SIG);
sig->a = 10;
sig->b = 20;
sig.send(PID);

现在,在我将 LINX 信号发送到 PID 之前,我想确保 PID 存在并且仍在运行(确保进程没有崩溃)。如果 PID 不存在,那么我会将其发送到另一个 PID 为 0 的公共进程,该进程可以处理任何类型的信号。有没有办法检查 PID 是否存在于 C++ 中?如果是,它的 LINX API 是什么?

我希望能够做到这一点,而不必知道进程名称并且只需要进程的 PID。

【问题讨论】:

这里有一场比赛。完成检查后,在发送信号之前,进程可以停止。 【参考方案1】:

在获取 PID、执行 PID 检查和发送信号的代码之间的任何地方,目标进程都可以退出,并且可以产生具有相同 PID 的新的不相关进程,因为 PID 编号的范围是有限的,并且随着时间的推移它们会被重用。所以我认为仅仅使用 PID 是不可能实现你想要的。

【讨论】:

【参考方案2】:

你可以先发送信号0:

杀死(2):

如果 sig 为 0,则不发送信号,但仍进行错误检查 执行;这可以用来检查是否存在 进程 ID 或进程组 ID。

但这可能毫无意义。此外,这种基于 pid 的访问很容易出现竞争条件,除非您是该进程的父进程(在这种情况下,您始终知道它是否结束以及您是否已经收获)。

【讨论】:

【参考方案3】:

无论您如何检查它当前是否正在运行,都不能保证它不会在您检查和发送信号之间发生崩溃 - 或者在您发送信号和发送信号之间它到了。因此,只需发送信号并找到一种方法来处理进程到达时可能不存在的事实。在极端情况下,进程甚至可能会死掉,并且在信号到达之前它的 PID 会被重新使用——玩得开心。

【讨论】:

以上是关于(LINX-IPC 协议)如何查明具有 PID 的进程是不是在 C++ 中运行?的主要内容,如果未能解决你的问题,请参考以下文章

查明用户是不是有权在 PostgreSQL 中选择/更新/...一个表/函数/...

查明是不是存在默认查看器

如何查明网页中任何元素的底层页面代码?

如何查明 RSK 交易在 RSK 区块链上被确认的次数?

如何序列化具有填充数组的对象类型属性的类

如何在我的代码中查明触发 QObject::connect 的调用的位置:无法在 Qt5 中对类型的参数进行排队?