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

Rif*_*eau 12 c linux ipc

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

moo*_*eep 14

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

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

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

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

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

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


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

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

另请参见此概述此处的示例.

最后,请注意

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


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

  • 不要使用`shmget`,而是使用posix`shm_open`代替.这样使用起来就不那么痛苦了,也没有关键碰撞的问题 (3认同)

Jas*_*son 6

考虑使用POSIX共享内存通过shm_openshm_unlink...我个人认为它们比旧的System-V IPC调用更容易使用和更直接shmget,因为返回的句柄完全像你的文件描述符可以使用像read,write等等调用.否则,如果你想通过普通指针访问文件描述符表示的共享内存对象,你可以使用mmap返回的文件描述符shm_open.