如何使进程知道同一程序的其他进程

时间:2011-01-17 16:26:12

标签: c++ c linux ipc

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

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

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

该程序与Gtk链接,因此使用glib的解决方案是可以的。

6 个答案:

答案 0 :(得分:10)

将pid放在文件中是实现此目的的常用方法。对于守护进程(“系统程序”),放置此类文件的常见位置是/var/run/PROGRAM.pid。对于用户程序,将pid文件隐藏在用户的homedir中(如果程序也有配置文件,则将配置文件和pid文件放在home目录的子目录中)。

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

答案 1 :(得分:9)

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

linux是否具有相应的命名互斥锁或信号量?所以你可以查看它是否“锁定”,然后警告用户他们已经有一个并关闭它?

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

答案 4 :(得分:1)

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

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

没有关于将PID文件放在何处的一般建议,只需选择您喜欢的地方。

答案 5 :(得分:1)

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

如果你很高兴它是特定于Linux的,你可以使用“抽象命名空间”unix socket;这些都相当不错,因为它们不需要存在于文件系统中。

如果您的程序是面向用户的,那么它应该是多用户感知的;一个用户不应该能够在另一个用户的应用程序副本中触发行为,并且需要安全性以确保用户不能轻易地相互DoS(例如:如果用户A的程序副本挂起,是否会停止用户B从开始?)。