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

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

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

您在标头中声明的变量将在包含它们的任何地方生成一个副本(除非您声明了它们

extern
)。当然,当处理单独的进程时,每个进程都会有自己的内存空间。您需要使用更复杂的技术来规避这一问题,即进程间通信(IPC)。例如:

  • (命名)管道
  • 插座
  • 共享内存

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

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

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

IPC_RMID
)。

请注意,对于共享内存对象, “只有在最后一个进程将其分离后,该段才真正被破坏”
。因此,您需要确保所有过程(shmdt)都会真正发生这种情况。


为了回应评论,这是POSIX方法:

System
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等)的情况下执行清除 *** 作。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5012050.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存