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