使用两种不同的状态同步两个进程

时间:2012-06-04 18:28:46

标签: c linux shared-memory

我正在尝试找到一种方法来同步两个共享数据的进程。

基本上我有两个使用共享内存链接的进程。我需要进程A在共享内存区域中设置一些数据,然后进程B读取该数据并对其进行操作。

我期待的事件顺序是:

  1. B阻塞等待数据可用信号
  2. A写入数据
  3. 可用的信号数据
  4. B读取数据
  5. B阻止等待数据不可用信号
  6. A信号数据不可用
  7. 一切都回到了开头。
  8. 换句话说,B会阻塞直到它得到“1”信号,得到数据,然后再次阻塞,直到该信号变为“0”。

    我已经设法使用纯共享内存来模拟它,但是我使用while循环消耗100%的CPU时间,或者我使用带有nanosleep的while循环,有时会错过某些信号。

    我尝试过使用信号量,但我只能找到一种等待零的方法,而不是一种方法,并尝试使用两个信号量只是不起作用。我认为信号量不是最佳选择。

    将有许多进程都访问相同的共享内存区域,并且在修改共享内存时需要通知所有进程。

    它基本上试图模拟硬件数据和控制总线,其中事件是边缘而不是电平触发。这是我感兴趣的国家之间的过渡,而不是国家本身。

    那么,任何想法或想法?

4 个答案:

答案 0 :(得分:2)

Linux有自己的eventfd(2)工具,您可以将其合并到正常的poll / select循环中。您可以通过常规方式通过UNIX套接字将eventfd文件描述符从进程传递到进程,或者只使用fork(2)继承它。

编辑0:

重新阅读问题后,我认为您的选择之一是信号和流程组:在同一流程组(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);

通过这种方式,您可以在共享内存中实现同步。