我正在编写一个简单的命令行实用程序,并希望能够获得父进程(即运行该命令的shell)的某种全局唯一标识符。
PID对我来说是不够的,因为随着时间的推移,有两个PID值会碰撞的可能性。
我的用例如下:我想存储运行命令行实用程序的“会话”数据,该实用程序在同一个shell进程中运行的实用程序的所有实例中保留。 我不希望这个数据与其他shell实例共享。 我想要某种标识符,使我能够执行这种关联,而不会发生碰撞。
我排除了PID和PID + tty。 什么会是很好的方式来查询过程的开始date/时间,所以我的唯一ID将PID + tty +开始date/时间…
任何想法感激地接受!
我建议使用基于文件的方法。 独特的文件,特别是独特的临时文件,在许多情况下都是需要的,所以你可以使用一个工具来完成这个目的,mktemp:
$ mktemp -t identifier.XXXXXXXXXX /tmp/identifier.yaJMl0cBnK
如果你在父shell中执行这个命令,你会得到一个新创建的文件的名字,这个文件是以保证唯一的方式创建的。 正如你所看到的,X的后缀(至少3)被随机内容替换,所以如果目标文件已经被使用,mktemp有很多机会来创建一个替代。
为了避免污染,请确保您的父shell在工作完成后删除文件。
现在您可以将日期/时间写入文件或调整标识符部分。 这真的取决于你更喜欢什么。
正如在评论中指出的那样,创建临时文件并不总是需要的。 实际上,mktemp的使用不能被认为是符合POSIX的,因为mktemp(1)没有被标准覆盖。
另一种方法是利用“会话ID”(技术上正确:“会话负责人的进程ID”)。 这个问题明确指出父进程是一个shell。 壳成为会议的领导者,以管理他们的过程组。 你可以通过调用ps来使用-o会话来看到会话ID,例如ps -o pid,session,cmd
。
只要至少有一个进程仍在该会话中,会话标识就会保留。 您可以安全地假定会话ID对于您的程序组是唯一的,并且在系统上是唯一的。 如果父shell终止,也是如此。 你的节目变成孤儿,但仍然在他们的会议。 如果最后一个程序终止,会话将被销毁(并释放会话ID)。
在C / C ++中,可以通过调用POSIX所涵盖的getsid(0)
来检索进程的会话标识。