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