2016-03-06 91 views
1

我想要做的是,我有一個父母和子女的過程。我嘗試讀取文件並將所有內容傳遞給孩子。輸入文件中有記錄。我必須一次讀一遍,然後傳給孩子。但不管我做什麼。孩子只讀第一個記錄,而不是所有其他記錄。我測試了我的方法從輸入文件獲取所有記錄,但不能將它們全部寫入子項。請任何想法。如何將多條記錄從父母的叉子傳遞給孩子

struct product_record { 
    int idnumber;   // Unique identification 
    char name[PRODUCTSIZE]; // String description 
    double price;   // Unit cost 
}; 

int pid, mypipe[2], status; 

int main(int argc, char **argv) 
{ 
    int result;  
    result = pipe(mypipe);//create pipes  
    if (result < 0) { 
     perror("pipe creation error");//failure in creating a pipe 
     exit (1);  
    }//if 

    if ((pid = fork()) == 0) 
    { 
     read(mypipe[0], &product, sizeof(product)); 
     exit(0); 
    } 
    else if (pid == -1) 
    { 
     cout << "Fork failed" << endl; 
     exit(1); 
    } 
    else 
    {//parent 
     parentReadsFromTheFile(argv);//argv inputfile name 
     wait(&status); 
    } 
    return 0;//Return to the OS. 
}//main 

void parentReadsFromTheFile(char **args) 
{ 
    while (getline(inputFile, line)) //read a line till EOF 
    { 
     //put read record into product 
     write(mypipe[1], &product, sizeof(product));//Write to pipe 
    } 
} 
+0

正確地調整你的代碼,就不做評論了明顯的。 – chqrlie

+0

發佈'product'的定義。 – chqrlie

+0

我編輯和解釋得更好。謝謝。 – user2934615

回答

1

可以從過程到另一個傳輸通過管道的數據,但是這個數據只能包含標量信息:不能傳送地址或指針這樣。

我懷疑你的product對象不是一個簡單的結構,只有數字和字符。

從您發佈的product的類型可以這種方式傳輸此類型。

重讀你的代碼,我看到孩子只讀取一條記錄:

if ((pid = fork()) == 0) { 
    read(mypipe[0], &product, sizeof(product)); 
    exit(0); 
} 

你寫:不管我做什麼。孩子只讀第一個記錄,而不是所有其他記錄。,但這正是你所做的!

事實上,請注意read可能會在您應該支持的某些條件下返回短計數,但在目前的情況下,您只會嘗試讀取單個結構並退出該過程。父進一步寫入管道將失敗。

0

的原因,你的「孩子只讀取第一個記錄,不是所有的人的」,是因爲你exit()讀了一遍後立即:

if ((pid = fork()) == 0) 
{ 
    read(mypipe[0], &product, sizeof(product)); 
    exit(0); 
} 
+0

「是因爲你在閱讀一次後立即退出():」我刪除了退出。仍然沒有解決/ – user2934615

+0

@ user2934615:刪除exit()顯然是不夠的。你必須編寫能夠讀取其餘記錄的代碼,它本身不會執行它... –

相關問題