我正在尝试找到一种方法来同步两个共享数据的进程。
基本上我有两个使用共享内存链接的进程。我需要进程A在共享内存区域中设置一些数据,然后进程B读取该数据并对其进行操作。
我期待的事件顺序是:
换句话说,B会阻塞直到它得到“1”信号,得到数据,然后再次阻塞,直到该信号变为“0”。
我已经设法使用纯共享内存来模拟它,但是我使用while循环消耗100%的CPU时间,或者我使用带有nanosleep的while循环,有时会错过某些信号。
我尝试过使用信号量,但我只能找到一种等待零的方法,而不是一种方法,并尝试使用两个信号量只是不起作用。我认为信号量不是最佳选择。
将有许多进程都访问相同的共享内存区域,并且在修改共享内存时需要通知所有进程。
它基本上试图模拟硬件数据和控制总线,其中事件是边缘而不是电平触发。这是我感兴趣的国家之间的过渡,而不是国家本身。
那么,任何想法或想法?
答案 0 :(得分:2)
Linux有自己的eventfd(2)
工具,您可以将其合并到正常的poll
/ select
循环中。您可以通过常规方式通过UNIX套接字将eventfd
文件描述符从进程传递到进程,或者只使用fork(2)
继承它。
重新阅读问题后,我认为您的选择之一是信号和流程组:在同一流程组(setpgid(2)
)下启动“监听”流程,然后用负pid
发出全部信号} kill(2)
或sigqueue(2)
的参数。同样,Linux提供signalfd(2)
用于轮询和避免慢速信号蹦床。
答案 1 :(得分:0)
如果涉及2个进程,您可以使用文件,共享内存甚至网络来传递标志或信号。但是如果这些过程更多,那么在修改内核时可能会有一些合适的解决方案。你的问题中有一个共享内存,对吧?!现在如何传递信号?!
答案 2 :(得分:0)
在linux中,所有POSIX控制结构(互斥,条件,读写锁,信号量)都有一个选项,如果它们驻留在共享内存中,它们也可以在进程之间使用。对于您描述的过程,经典的互斥/条件对似乎很适合这项工作。查看这些结构的..._init
函数的手册页。
Linux还有其他适当的实用程序,如“futex”,可以更有效地处理这个问题。但这些可能不是开始时的正确工具。
答案 3 :(得分:0)
1 Single Reader&单作家郎 1 Single Reader&单个作家 这可以使用信号量来实现。 在posix信号量api中,你有sem_wait(),它会等到信号量计数的值为零,一旦使用sem_post从其他进程递增,等待将完成。
在这种情况下,您必须使用2个信号量进行同步。
流程1(读者)
sem_wait(SEM1);
.......
sem_post(sem2);
流程2(作者)
sem_wait(sem2);
.......
sem_post(SEM1);
通过这种方式,您可以在共享内存中实现同步。