在此論壇中有許多與讀寫管道有關的問題,但我無法解決我的問題。 下面的代碼片段,並以下的事情:父進程無法讀取管道中的子進程寫入的數據
- 通過命令行參數的文件名是通過pipe_p傳遞給子進程
- 子進程打開指定的文件,並將它的內容pipe_c父進程閱讀並在屏幕上顯示。
一切工作正常,但父進程無法從管道讀取數據(因爲它不打印任何東西)。 我觀察到數據被成功寫入子進程,因爲我能夠通過管道在子進程塊中打印內容,但不能在父進程中打印內容。
注意:步驟4不起作用
任何人都請幫助我。
代碼:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv){
int pipe_p[2], pipe_c[2];
int childpid, c, k = 0;
char buffer[1000] = {0};
FILE *file;
pipe(pipe_p);
pipe(pipe_c);
childpid = fork();
if(childpid){
//parent process block
//STEP 1 -------
close(pipe_p[0]); //closing reading side of pipe
write(pipe_p[1], argv[1], strlen(argv[1]));
close(pipe_p[1]);
//--------------
wait(NULL);
//--------------
//printf("%s\n", "Its working");
//STEP 4 -------
close(pipe_c[1]);
read(pipe_c[0], buffer, sizeof(buffer));
close(pipe_c[0]);
printf("%s\n", buffer);
//--------------
}
else{
//child process block
//sleep(1);
//STEP 2 -------
close(pipe_p[1]);
read(pipe_p[0], buffer, sizeof(buffer));
close(pipe_p[0]);
//printf("%s\n", buffer);
//--------------
//STEP 3 -------
file = fopen(buffer, "r");
while((c = getc(file)) != EOF){
buffer[k++] = c;
}
buffer[k] = 0;
//printf("%s", buffer);
close(pipe_c[0]);
write(pipe_c[1], buffer, strlen(buffer));
close(pipe_c[1]);
//--------------
}
return 0;
}
感謝您的建議@zwol。我沒有得到你的第四點,在這裏我讓父進程等到子進程完成填充緩衝區(這是成功完成的,你可以通過取消printf部分的註釋來查看其他部分)。但是在返回到父上下文之後,如果我在其他部分中複製了STEP 4,則不會讀取在子進程中讀取的數據。 –
好的,我會檢查你的編輯。如果你能使代碼工作,那將是非常好的。謝謝 –
@ChanchalRoshan修復孩子的緩衝區溢出,然後使用一個_large_測試文件(至少32KB),你應該看到從等待過早的死鎖。現在,死鎖被緩衝區溢出所掩蓋,這使得孩子在填充管道緩衝區之前崩潰。 – zwol