gpt4 book ai didi

linux - POSIX 或 Linux 获取 shell 进程唯一 ID 的方法

转载 作者:太空狗 更新时间:2023-10-29 12:14:46 25 4
gpt4 key购买 nike

我正在编写一个简单的命令行实用程序,并希望能够为父进程(即运行命令的 shell)获取某种全局唯一标识符。

PID 对我来说还不够,因为随着时间的推移,两个 PID 值可能会发生冲突。

我的用例如下:我想存储来自运行命令行实用程序的“ session ”数据,该实用程序在同一 shell 进程中运行的所有实用程序实例中持续存在。我不希望与其他 shell 实例共享此数据。我想要某种标识符,使我能够在没有冲突可能性的情况下执行该关联。

我已经排除了 PID 和 PID+tty。如果有一种查询进程开始日期/时间的方法就好了,这样我的唯一 ID 就是 PID+tty+开始日期/时间...

感谢接受任何想法!

最佳答案

独特的文件

我建议使用基于文件的方法。在许多情况下都需要唯一文件,尤其是唯一临时文件,因此您可以使用一个工具来达到这个目的,mktemp:

$ mktemp -t identifier.XXXXXXXXXX
/tmp/identifier.yaJMl0cBnK

如果您在父 shell 中执行此命令,您将获得一个新创建的文件的名称,该文件以保证唯一的方式创建。如您所见,X 的后缀(至少 3 个)被替换为随机内容,因此如果目标文件已在使用中,mktemp 有很多机会创建替代文件。

为避免污染,请确保您的父 shell 在您完成工作后删除该文件。

现在您可以将日期/时间写入文件或调整标识符部分。这真的取决于你更喜欢什么。

唯一 session

如评论中所述,并不总是需要创建临时文件。事实上,mktemp 的使用不能被认为是 POSIX 兼容的,因为实用程序 mktemp(1) 未包含在标准中。

另一种方法是使用“ session ID”(技术上正确:“ session 领导者的进程 ID”)。该问题明确指出父进程是一个shell。 Shell 成为 session 领导者以管理它们的进程组。您可以通过使用 -o session 调用 ps 来查看 session ID,例如ps -o pid,session,cmd.

只要至少有一个进程仍在该 session 中, session ID 就会保持不变。您可以安全地假设 session ID 对于您的程序组是唯一的,并且在您的系统上是唯一的。如果父 shell 终止,也是如此。您的程序成为孤立程序,但仍保留在它们的 session 中。如果最后一个程序终止, session 只会被销毁(并释放 session ID)。

在 C/C++ 中,您可以通过调用 getsid(0) 来检索您的进程的 session ID,这是 POSIX 涵盖的。

关于linux - POSIX 或 Linux 获取 shell 进程唯一 ID 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29705926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com