在Linux中的多个独立程序之间共享相同的变量

时间:2012-05-21 11:37:25

标签: c linux ipc

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

2 个答案:

答案 0 :(得分:14)

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

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

你的问题读起来像shared memory就是你想要的,因为多个进程可以访问相同的内存区域来共享一些变量。也许看看this question及其答案的例子。

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

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

请注意,对于共享内存对象“在最后一个进程分离后,该段才会被实际销毁”。因此,您要确保这实际上适用于您的所有流程(shmdt)。


在回应评论时,这是POSIX方法:

  

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

有关示例,另请参阅this overviewhere

最后,请注意

  

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


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

答案 1 :(得分:6)

考虑通过shm_openshm_unlink使用POSIX共享内存...我个人觉得它们比旧的System-V IPC调用更容易使用,更直接,例如{{1因为返回的句柄与文件描述符完全相同,可以使用shmgetread等调用。否则,如果要访问由此表示的共享内存对象通过普通指针的文件描述符,您可以在shm_open返回的文件描述符上使用write