POSIX消息队列在父进程和子进程之间传递文本

时间:2016-09-28 22:53:17

标签: c++ operating-system ipc child-process

我正在尝试在父进程和子进程之间设置不同IPC的演示。我有管道和共享内存实现,但由于某种原因,我很难使用POSIX消息队列。

当我让两个进程无限循环时(父进程发送任意文本并且子进程检索并输出),似乎存在很多错误。我是否需要在固有的Message Queue阻止之外进行一些同步来防止这种情况?我已经看到POSIX消息队列允许信令。我应该以某种方式利用这个吗?我想我的问题是我不熟悉它们的使用情况,而且我发现的消息传递的具体例子并不多。

这是我目前的代码:

pid = fork();
if(pid == 0){ //Welcome Child Process
    char buf[LIM];
    unsigned int prio;
    int errchkc;

    if((mqdp = mq_open(QUENAME, O_CREAT | O_RDONLY, 0666, 0)) == -1){
         perror("mq_open() Child");
         exit(1);
    }

    errchkc = mq_getattr(mqdp, &attrc);
    if(DEBUG){
        cout << "mq_getattr status: " << errchkc <<" Messages in the Queue: " << attrc.mq_curmsgs <<endl;
    }

    while(mq_receive(mqdp, buf, LIM, &prio) != -1){
        printf("RECEIVED: %s \n", buf);

        memset(&buf[0], 0, sizeof(buf));
    }

     mq_close(mqdp);
     //}
}else if(pid < 0){
    cout << "ERROR: Process fork() experienced an issue...";
}else{ //Keep going Parent Process
    int errchkp;
    int prio = 1;
    char buf[LIM];

    char* msg = "Friends!";
    strncpy(buf, msg, LIM);

    if((mqdp = mq_open(QUENAME, O_CREAT | O_WRONLY, 0666, 0)) == -1){
        perror("mq_open() Parent");
        exit(1);
    }

    if((errchkp = mq_send(mqdp, msg, sizeof(msg), prio)) == -1){
        perror("mq_send()");
        exit(1);
    }

    char* msg2 = "Enemies!";

    if((errchkp = mq_send(mqdp, msg2, sizeof(msg2), prio)) == -1){
        perror("mq_send()");
        exit(1);
    }

    mq_close(mqdp);
}

我打算让孩子接收父母发送的所有内容并将其打印出来,但有时它会在没有打印任何内容的情况下退出队列中没有消息,或者它只是打印“好友!”有没有人知道我可能做错了什么?

0 个答案:

没有答案