我想在 Linux 中多个独立的 C 可执行文件之间共享一个变量。也就是说,一个程序将在一个数组上写入并设置一个标志,以便其他程序无法使用它,并且在此操作之后它将取消设置标志,然后另一个程序将读取该数组。我尝试在每个程序中使用相同的自定义头文件(包含变量),但似乎在调用程序时创建了不同的变量实例。
2 回答
您在标头中声明的变量将在您包含它们的地方生成一个副本(除非您声明它们extern
)。当然,在处理单独的进程时,每个进程都会有自己的内存空间。您需要使用更复杂的技术来规避这一点,即进程间通信 (IPC)。例如:
- (命名)管道
- 插座
- 共享内存
您的问题看起来像共享内存就是您想要的,因为多个进程可以访问相同的内存区域以共享一些变量。也许看看这个问题及其答案作为一个例子。
您的程序需要创建一些共享内存,例如使用shmget并使用shmat附加共享内存对象。当多个进程访问相同的内存区域时,在变量的读/写期间添加进程同步始终是一种健康的方法,例如使用共享信号量(semget,semop)。
完成共享内存后,您需要从中分离(shmdt)。因此,您告诉内核您的进程不再需要访问它。创建共享内存/信号量对象的进程也需要在程序结束时销毁它们。否则它将驻留在内存中,可能直到您重新启动机器(请参阅shmctl、semctl,尤其是IPC_RMID
)。
请注意,对于共享内存对象,“只有在最后一个进程将其分离后,该段才会真正被销毁”。因此,您要确保这实际上发生在您的所有进程(shmdt)中。
作为对评论的回应,这里是 POSIX 方法:
System V 共享内存(shmget(2)、shmop(2) 等)是较旧的共享内存 API。POSIX 共享内存提供了一个更简单、设计更好的接口;另一方面,与 System V 共享内存相比,POSIX 共享内存的可用性稍差(尤其是在旧系统上)。
- shm_open - 获取共享内存(通过文件描述符)
- ftruncate - 设置共享内存的大小
- mmap - 获取指向内存的指针
- sem_open - 获取信号量
- sem_wait , sem_post - 用于您的读/写同步
- shm_unlink , sem_close - 毕竟要清理
最后,请注意
POSIX 共享内存对象具有内核持久性:共享内存对象将一直存在,直到系统关闭,或者直到所有进程都取消映射该对象并使用 shm_unlink(3) 将其删除
为了考虑共享内存对象的持久性,不要忘记向应用程序添加信号处理程序,以便在异常终止(SIGINT、SIGTERM 等)的情况下执行清理操作。
shm_open
研究通过and使用 POSIX 共享内存shm_unlink
...我个人觉得它们比旧的 System-V IPC 调用(例如shmget
等)更容易使用和更直接,因为返回的句柄与您的文件描述符完全一样可以与 , 等调用一起使用read
。write
否则,如果您想通过普通指针访问由文件描述符表示的共享内存对象,您可以mmap
在 . 返回的文件描述符上使用shm_open
。