我正在使用C语言中的信号量,特别是控制对linux中共享内存区域的访问。但有一点我无法理解。
我正在使用互斥锁来控制对特定区域的访问,因为我有2个必须从该区域读/写的进程。问题是,当我们使用fork()创建一个新的子进程时,整个程序被“复制”到另一个程序,好像它们是两个单独的程序一样对吗?所以,当我在一个过程中做V(互斥)时,另一个人怎么知道他无法访问?
我知道这是一个菜鸟问题,但直到现在还没有人可以向我解释。
答案 0 :(得分:2)
在fork
之后,两个进程都不会知道对方的内存操作,因为它们是单独的副本。您必须将共享变量放在共享内存中,包括互斥锁和信号量。然后所有进程都在同一资源上运行。
对于无关(即非分叉)进程,通常有系统工具(例如命名信号量),每个进程可以根据路径名或类似方法打开,每个进程可以用来查找和使用资源。
答案 1 :(得分:0)
您必须将同步对象放在进程共享内存中,例如使用mmap (... MAP_ANONYMOUS ...)
创建。此外,他们必须设置PTHREAD_PROCESS_SHARED
属性,例如,使用pthread_mutexattr_setpshared
。
答案 2 :(得分:0)
见这里:
Semaphores and Mutex for Thread and Process Synchronization
所以实际上互斥体经常用在线程中,这使得共享变得微不足道。但是,对于进程,可以将互斥锁存储为共享内存的一部分。
然而,对于信号量,linux内置了库,它通过键识别全局信号量。见下文。
http://beej.us/guide/bgipc/output/html/multipage/semaphores.html
或者您可以使用其他IPC进行同步。例如,信号。
希望这有帮助。