【问题标题】:C++ Execute one child process iteration after another processC ++在另一个进程之后执行一个子进程迭代
【发布时间】:2021-01-04 03:52:24
【问题描述】:

我想创建两个包含一些迭代的子进程,以便进程 X 中的迭代 l 总是在进程 Y 中的迭代 l+1 之后执行。

#include <stdio.h>
#include <unistd.h>
#include <bits/stdc++.h>
#include <sys/wait.h>
#include <semaphore.h>


using namespace std;

sem_t mut;

int x = 2;
int main()
{
    int cpX = fork();
    sem_init(&mut, 1, 1);
    if (cpX == 0)
    {
        //child A code
        for (int i = 0; i < 10; i++)
        {
            sem_wait(&mut);
            cout << "Inside X:" << getpid() << ", " << i << '\n';
            sleep(rand() % 5);
        }
        
        exit(0);
    }
    else
    {
        int cpY = fork();
        if (cpY == 0)
        {
            //child B code
            for (int i = 0; i < 10; i++)
            {
                cout << "Inside Y:" << getpid() << ", " << i << '\n';
                sleep(rand() % 5);
                sem_post(&mut);
            }
            //sem_wait(&mut);
           exit(0); 
        }
        else
        {
            //sleep(50);
            
            //wait(NULL);
            //wait(NULL);
            exit(0);
            // wait(NULL);
        }
    }
}

但是在这里,X 执行一次,然后 Y 开始执行,X 不再执行。为什么会这样?

【问题讨论】:

  • 可能是因为第一个子进程在信号量初始化之前被分叉了?
  • 嗨,我也这样做了,但没有帮助。我认为问题在于使用 sem_init 创建的信号量必须位于共享内存空间中。

标签: c++ process fork semaphore


【解决方案1】:

fork 期间的父/子正在复制,因此它们不会引用相同的信号量对象。因此,mut 不会像您假设的那样共享。您的 sn-p 几乎是正确的,您只需要进行微小的更改即可按预期工作。

由于您使用的是未命名的信号量,因此您需要在共享区域中实例化信号量对象:

#include <sys/mman.h>

sem_t *mut = (sem_t*)mmap(NULL, sizeof(*mut), PROT_READ |PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS, -1, 0);
sem_init(mut, 1, 1);

通过这些细微的调整,您上面的 sn-p 现在可以按预期工作,因为它们现在指的是同一个信号量对象。

另外,一些提示:sem_post 是一个非阻塞调用,而sem_wait 是一个阻塞调用。您还需要注意,当此时没有人在信号量上等待时,sem_post 发送的信号可能会丢失。

这类东西最好的参考是Unix Network Programming: Interprocess Communication by Richard Stevens

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-14
    • 2012-05-18
    • 2016-09-09
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多