簡體   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