当前位置: 首页 > 面试题库 >

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

华献
2023-03-14
问题内容

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


问题答案:

您在标头中声明的变量将在包含它们的任何地方生成一个副本(除非您声明了它们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等)的情况下执行清除操作。



 类似资料:
  • 问题内容: 我想像这样在多个线程之间共享一个变量: 我想在主线程和帮助线程之间共享,这是我创建的两个不同的Java类。有什么办法吗?谢谢! 问题答案: 二者并可以参照包含该变量的类。 然后,可以使该变量为 volatile ,这意味着 对该变量的更改在两个线程中立即可见。 有关更多信息,请参见本文。 易变变量 共享已同步的可见性功能,但不共享原子性功能。这意味着线程将自动 查看volatile变量

  • 背景:我正在并行运行自动化测试。使用pom.xml中的分叉,多个浏览器在相同数量的线程中启动,即1个浏览器是1个线程。 中的下面插件创建了与线程(fork)计数相等数量的。 所有这些类都同时并行执行。因此,似乎每当我创建或时,每个线程都会创建自己的这些,因此跨多个线程共享变量的概念是不起作用的。 我只想让一个线程访问“准备测试数据”函数,并将<code>标志 我正在按照教程https://www.

  • 我有一个人[]有三个人(p1,p2,p3)。Person类有两个属性name和email。 我使用了以下代码。 但我不想这样用。我想使用两个组合框与相同的型号。我尝试使用DefaultComboBoxModel并重写getElementAt()方法,如下所示。 } 问题是如何使用相同的ComboBoxModel在一个JComboBox中添加Person[]的所有名称,并在另一个JComboBox中

  • 问题内容: 我有一个下载器功能,可以并行下载多个文件。我使用以便下载同一文件的不同块。我想显示下载的状态栏。为此,我需要知道已经下载的总字节数()。 是否有一种方法可以设置将在所有这些进程和主进程之间共享的变量,以便每个进程都可以追加刚刚下载的字节数? 问题答案: 解决方案是利用新进程并传递共享的ctypes值:

  • 我正在思考架构组件/MVVM。 假设我有一个存储库、一个ViewModel和一个片段。我使用类作为包装器来公开网络状态,就像体系结构组件指南中建议的那样。 我的存储库目前看起来是这样的(为简洁起见进行了简化): 然后在ViewModel中,我还声明了一个可变LiveData: 最后,片段: 正如您所看到的,由于LiveData变量将在过程中重置(存储库将创建一个新实例),因此不会触发观察者会出现问

  • 问题内容: 我有两个线程。可以调用修改变量的类的update方法。另一个调用读取该变量的类的update方法。只有一个线程写入,一个(或多个)线程读取该变量。由于我是多线程技术的新手,我需要在并发方面做什么? 谢谢, 问题答案: 如果有且仅有一个写线程,你可以逃脱使得它。否则,请查看答案。 仅在只有一个写线程的情况下才起作用,因为只有一个写线程,因此它始终具有的正确值。