【问题标题】:Sharing same variable between more than one independent programs in Linux [closed]在Linux中的多个独立程序之间共享相同的变量[关闭]
【发布时间】:2012-05-27 21:49:13
【问题描述】:

我想在 Linux 中多个独立的 C 可执行文件之间共享一个变量。也就是说,一个程序将在一个数组上写入并设置一个标志,以便其他程序无法使用它,并且在此操作之后它将取消设置标志,然后另一个程序将读取该数组。我尝试在每个程序中使用相同的自定义头文件(包含变量),但似乎在调用程序时创建了不同的变量实例。

【问题讨论】:

  • 提示:IPC(进程间通信),这个话题太大了,无法在这里回答。
  • 是的,您可能想看看here。两个独立的可执行文件在不同的进程中启动,因此您必须在它们之间实现某种通信,使用socketspipes 等...甚至文件。
  • 我明白了。这意味着,在这种情况下必须使用管道。有没有更简单的方法?
  • @Rifat Pipes 很简单。 Here's 很好的解释让您了解管道。
  • 管道确实比shared memory 简单,我想。不过,您需要序列化您的变量。

标签: c linux ipc


【解决方案1】:

您在标头中声明的变量将在您包含它们的位置生成一个副本 (unless you declare them extern)。当然,在处理单独的进程时,每个进程都会有自己的内存空间。您需要使用更复杂的技术来规避这一点,即进程间通信 (IPC)。例如:

  • (命名)管道
  • 套接字
  • 共享内存

您的问题看起来像shared memory 是您想要的,因为在此多个进程可以访问相同的内存区域以共享一些变量。不妨看看this question 及其答案作为示例。

您的程序需要创建一些共享内存,例如使用shmget 并使用shmat 附加共享内存对象。 当多个进程访问相同的内存区域时,在变量的读/写期间添加进程同步始终是一种健康的方法,例如使用共享信号量(semgetsemop)。

当您完成共享内存后,您需要将其分离 (shmdt)。因此,您告诉内核您的进程不再需要访问它。 创建共享内存/信号量对象的进程也需要在程序结束时销毁它们。否则它将驻留在内存中,可能直到您重新启动计算机(请参阅shmctlsemctl,尤其是IPC_RMID)。

请注意,对于共享内存对象“只有在最后一个进程将其分离后,该段才会真正被销毁”。因此,您需要确保您的所有进程都发生这种情况 (shmdt)。


针对 cme​​ts,这里是 POSIX 方法:

System V 共享内存(shmget(2)、shmop(2) 等)是较旧的共享内存 API。 POSIX 共享内存提供了一个更简单、设计更好的接口;另一方面,与 System V 共享内存相比,POSIX 共享内存的可用性稍差(尤其是在旧系统上)。

有关示例,另请参阅 this overviewhere

最后,请注意

POSIX 共享内存对象具有内核持久性:共享内存对象将一直存在,直到系统关闭,或者直到所有进程都取消映射该对象并使用 shm_unlink(3) 将其删除


为了考虑共享内存对象的持久性,不要忘记向应用程序添加信号处理程序,以便在异常终止(SIGINT、SIGTERM 等)的情况下执行清理操作。

【讨论】:

  • 不要使用shmget,而是使用posix shm_open。这样使用起来不那么痛苦,并且没有键冲突的问题
  • @Hasturkun - 感谢您的评论!到目前为止我还没有使用过这些,但为了完整起见,我添加了一个注释。
【解决方案2】:

研究通过shm_openshm_unlink 使用POSIX 共享内存...我个人觉得它们比旧的System-V IPC 调用(例如shmget 等)更易于使用和更直接,因为返回的句柄与文件描述符完全一样,您可以将其与readwrite 等调用一起使用。否则,如果您想通过普通指针访问由文件描述符表示的共享内存对象,您可以使用mmapshm_open 返回的文件描述符上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    相关资源
    最近更新 更多