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

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

Solutions Collecting From Web of "在Linux中的多个独立程序之间共享相同的variables"

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

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

你的问题读取像共享内存是你想要的,因为在这里多个进程可以访问相同的内存区域来共享一些变量。 也许看看这个问题及其答案为例。

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

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

请注意,对于共享内存对象“只有在最后一个进程分离它之后才会销毁该分段” 。 所以你要确保,这实际上发生在你所有的进程( shmdt )。


针对这些意见,这里是POSIX方法:

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

  • shm_open – 获取共享内存(通过文件描述符)
  • ftruncate – 设置共享内存的大小
  • mmap – 获取一个指向内存的指针
  • sem_open – 得到一个信号量
  • sem_wait , sem_post – 用于读/写同步
  • shm_unlink , sem_close – 清理毕竟

另见这个概述 , 这里的例子。

最后请注意

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


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

看看通过shm_openshm_unlink使用POSIX共享内存…我个人觉得它们比较旧的System-V IPC调用(比如shmget等)更容易使用和更直接,因为返回的句柄就像文件一样,描述符,你可以使用readwrite等调用。否则,如果你想通过普通的指针访问由文件描述符表示的共享内存对象,你可以在由shm_open返回的文件描述符上使用mmap