2015-04-22 41 views
1

我有以下代碼:通過管道發送變量時會丟失數據的風險?

#include <unistd.h> 
#include <stdio.h> 
#include <sys/wait.h> 
#include <sys/types.h> // may not be needed 
#include <sys/stat.h> // may not be needed 
#include <stdlib.h> 
#include <string.h> 

typedef struct { 
    int pid; 
    char arg[100]; 
    int nr; 
} Str; 

int main() { 
    int c2p[2]; 
    pipe(c2p); 
    int f = fork(); 

    if (f == 0) { 
     Str s; 
     s.pid = 1234; 
     strcpy(s.arg, "abcdef"); 
     s.nr = 1; 

     close(c2p[0]); 
     write(c2p[1], &s, sizeof(Str)); 
     close(c2p[1]); 
     exit(0); 
    } 

    wait(0); 
    close(c2p[1]); 
    Str s; 
    read(c2p[0], &s, sizeof(Str)); 
    printf("pid: %d nr: %d arg: %s", s.pid, s.nr, s.arg); 
    close(c2p[0]); 
    return 0; 
} 

我不得不說,它的工作只是罰款,直至現在(PID,NR和Arg從未改變),但:

當孩子過程完成後,是由孩子使用的內存段(被標記爲空閒)? 如果是這樣,那麼在書寫時間和閱讀時間之間是否存在失去對該段的訪問或要改變的數據的風​​險?

(原來的問題是這樣的:Sending structure through pipe without losing data

+0

檢查您所做圖書館電話的結果可能是值得的,因爲根據這些結果採取行動。當子進程完成時,它的記憶自然也消失了。但不要認爲管道上寫的數據也是如此。這個管道仍然有一個優秀的讀取句柄(和寫入句柄,因爲這個問題),因爲你沒有關閉父進程write-side,直到你的wait()之後。 – WhozCraig

回答

3

雖然子進程的內存返還給操作系統時的進程退出,我懷疑這是不是你真的問。

您更可能擔心子進程退出後寫入管道的數據會發生什麼情況。由於管(2)手冊頁指出:

寫入管道寫端的數據是由內核 直到它被從管道的讀端讀取緩衝。

因此即使寫入過程已經退出,您的數據也會到達。

+0

謝謝你,那正是我所問的。 – Horatiu