繁体   English   中英

当父母将数据写入与分叉子项共享的管道并且两者都正在读取数据时,如何防止父母在孩子之前阅读它?

[英]When a parent has written data into a pipe shared with a forked child and both are reading data, how to prevent parent from reading it before child?

我有一个C语言代码实现父子通信的管道。 我经常需要从父母和孩子那里读写。 较小版本的代码如下:

int main(){
    int cpid, var;
    int fds[2];

    pipe(fds);

    if((cpid=fork())==0){
        read(fds[0], &var, sizeof(int));
        printf("Recieved in child - %d\n",var);

        var = 3;
        write(fds[1], &var, sizeof(int));
        printf("Writing from child - %d\n",var);

        exit(0);
    }

    var = 5;
    write(fds[1], &var, sizeof(int));
    printf("Writing from parent - %d\n",var);

    // I need something here to execute following read only after child writes

    read(fds[0], &var, sizeof(int));
    printf("Recieved in parent - %d\n",var);

    waitpid(cpid,NULL,0);
    return 0;
}

但我面临的问题是父进程中的读取刚刚从父进程写入后执行。 我需要防止这种情况发生。 在孩子用上面的代码编写之前,我们有什么方法可以停止在父母中阅读? 欢迎任何算法或建议。

PS:我尝试使用像SUGUSR1这样的信号并暂停父节点直到子节点发送信号,但由于信号没有排队,因此在这种情况下信号的概念因多个子父管道通信而失败。

根据@JonathanLeffler和@EugeneSh的评论。 单管不适合双向通信。 因此,上面的代码可以修改为使用一个管道用于父子,一个管道用于子父通信,如下所示:

int main(){
    int cpid, var;
    int p2c[2], c2p[2];

    pipe(p2c);
    pipe(c2p);

    if((cpid=fork())==0){
        read(p2c[0], &var, sizeof(int));
        printf("Recieved in child - %d\n",var);

        var = 3;
        write(c2p[1], &var, sizeof(int));
        printf("Writing from child - %d\n",var);

        exit(0);
    }

    var = 5;
    write(p2c[1], &var, sizeof(int));
    printf("Writing from parent - %d\n",var);

    read(c2p[0], &var, sizeof(int));
    printf("Recieved in parent - %d\n",var);

    waitpid(cpid,NULL,0);
    return 0;
}

这也适用于多个子父逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM