如何使一个进程意识到同一个程序的其他进程

我必须编写一个程序,该程序必须知道在该机器上运行的另一个自己的实例,并与之通信,然后死亡。 我想知道在Linux中是否有这样一个规范的方法。

我的第一个想法是编写一个包含进程的PID的文件,每次执行程序时都要查找该文件,但是该文件的“正确”位置和名称在哪里? 有更好的,还是更“正确”的方法?

然后我必须沟通,说用户试图运行它,但是由于还有另外一个实例,它将交出作业并退出。 我想只是发送一个信号,比如SIGUSR1,但是不允许我发送更多信息,比如用户执行第二个进程的X11显示。 如何发送此信息?

该程序链接到Gtk,所以使用glib的解决scheme是可以的。

把pid放在一个文件里是达到这个目的的常用方法。 对于守护进程(“系统程序”),放置这样一个文件的常见地方是/var/run/PROGRAM.pid 。 对于用户程序,将隐藏在用户homedir中的pid文件(如果程序也有配置文件,则将这两个配置文件和pid文件放在home目录的子目录中)。

将信息发送到“主”实例通常是使用Unix域套接字(也称为本地套接字)实现的。 使用套接字,您不需要一个pid文件(如果没有人在套接字上进行侦听,则该进程知道它是主节点)。

Unix域套接字。 让第一个实例在临时目录中创建一个实例,然后让其他实例通过它进行通信。

编写一个PID文件是一种常用的方法。 检查pidfile(3)库。

Linux有相当于一个命名的互斥体或信号量吗? 所以你可以检查是否“锁定”,然后警告用户,他们已经有一个关闭它?

这个链接是否有意义? http://www.linuxquestions.org/questions/programming-9/named-mutex-in-linux-296816/

有很多方法可以做到这一点。 您提出的方式(使用包含PID的文件)是一个有效的方法,并被许多应用程序使用。

有时候应用程序的配置文件包含PID文件的路径,有时使用硬编码路径。 通常,应用程序将PID文件放在/tmp ,放在/var (如果它们使用uid 0运行)或放在本地目录( ~/.application/ )中。

对于在哪里放置PID文件,不会有一般性的建议,只要选择你喜欢的地方即可。

你当然可以使用Unix域套接字; 我认为大多数应用程序(不使用像DCOP或DBUS这样的更高级系统)使用这些应用程序。

如果您对Linux特定的开发感到满意,可以使用“抽象名称空间”unix套接字; 这些相当不错,因为它们不需要存在于文件系统中。

如果你的程序是面向用户的,那应该是多用户的意识。 一个用户不应该能够触发另一个用户的应用程序副本的行为,安全性需要到位,以确保用户不能轻松地相互做对方(例如:如果用户A的程序副本挂起,是否停止用户B从开始?)。