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