【问题标题】:How to make a process aware of other processes of the same program如何让一个进程知道同一程序的其他进程
【发布时间】:2011-06-10 13:36:03
【问题描述】:

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

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

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

程序是针对Gtk链接的,所以使用glib的解决方案是可以的。

【问题讨论】:

    标签: c++ c linux ipc


    【解决方案1】:

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

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

    【讨论】:

    • 单独的 pid 文件几乎没有用。如果应用程序崩溃,它可能不会删除它的 pid 文件,因此必须手动删除它。更好的选择是锁定 pid 文件,因为操作系统总是在进程以某种方式终止时释放锁定。但是通过ls -la 是看不到那个锁的。一个unix域套接字就足够了。
    • @Maxim:错误。 unlink(...) 在文件关闭后删除文件。所以fd = open(path, ...); unlink(path); 是拥有临时文件的常用技巧。
    • @Alexandru:几乎正确,你错过了我们讨论 pid 文件而不是临时文件的事实。在应用程序终止之前不得删除 pid 文件。
    【解决方案2】:

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

    【讨论】:

    • 可能不是临时目录 - /var/run 对于套接字文件很常见。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      Linux 是否具有与命名互斥量或信号量等效的功能?因此,您可以检查它是否已“锁定”,然后警告用户他们已经有一个并将其关闭?

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

      【讨论】:

      • 命名信号量似乎可以作为一种解决多实例问题的方法,尽管它是一种相当非正统的方法。
      • 虽然这可行,但它相当难看,因为名称空间在机器上的所有进程之间共享,并且任何其他用户都可以通过打开具有相同名称的命名信号量来拒绝您的程序。就我个人而言,我永远不会使用没有随机名称的 POSIX 命名信号量/共享内存,并且通过其他一些不可写入的安全通道传达名称,除非通过具有正确权限的进程。
      【解决方案5】:

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

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

      对于放置 PID 文件的位置没有一般性建议,只需选择您喜欢的位置即可。

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

        • 我认为将文件保存在用户家中可以防止一个人干扰另一个用户。
        • 是的,这是一种可能的实现方式。
        猜你喜欢
        • 1970-01-01
        • 2015-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-09
        • 1970-01-01
        相关资源
        最近更新 更多