2012-06-23 58 views
0

我在調用fdopen時遇到錯誤,它將errno設置爲22.我正在使用exec命令調用子進程。孩子的文件描述符調用fdopen 4.第一個孩子的工作,並將數據發送回父和errno爲0後父創建下一個子進程,fdopen(4, "w");再次被調用時errno設置爲22Errno 22在調用fdopen()後

這是

從我讀過的內容來看,errno對於fdopen()可能意味着模式參數不正確。我也讀過它可能是從fnctl錯誤,這可能意味着一個錯誤的文件描述符。我指定文件描述符4,它在第一個子進程上工作。那麼爲什麼errno被設置爲22,當我嘗試創建另一個FILE*

我不明白什麼時候它適用於一個子進程,但不是下一個。任何人都可以爲我闡明這一點嗎?

下面是代碼:

int main(int argc, char* argv[]) 
{ 
    cout << "Child " << argv[argc-1] << " starting" << endl; 
    //close(3); 
    if(argc < 1) fatal("Not enough arguments provided to ChildMain"); 
    int id = atoi(argv[argc-1]); 
    //Child kid((int) *argv[1]); 
    cout << "Error before fdopen(): " << errno << endl; 
    FILE* out = fdopen(4, "w"); 
    if(out == NULL) 
    { 
     cout << "Child ID: " << id << endl; 
     cout << "\tError: " << errno << endl << endl; 
    } 
    int ret = fprintf(out, "%d", id); 
    fflush(out); 
    return 0; 
} 
+0

您還應該顯示'strerror(errno)' –

+0

因爲父進程(或甚至是父進程)可能已經使用了它,所以您不應該在「4」中進行連線。你應該明確地傳送'pipe'系統調用給出的文件描述符。只有文件描述符0(標準輸入),1(標準輸出)和2(標準錯誤)是固定的。 –

回答

1

第一個孩子的過程中,文件描述符的數字是4。對於第二個孩子過程中,4是在父用,所以它得到了一些其他的文件描述符數。孩子要麼搜索文件描述符,要麼父母必須在環境中,孩子的命令行或其他方式中將其傳遞給孩子。

+0

我在分岔後,我關閉文件描述符4.所以當孩子發送數據到父母,它會去父母文件desciptor 3 – DFord

+0

爲什麼4? 4從哪裏來? –

+0

第一次調用管道時,它返回文件描述符3和4.父應該讀取3,並且該子節點應該向文件描述符的父節點發送數據4 – DFord

相關問題