このフォーラムではパイプの読み書きに関する多くの質問がありますが、私は問題を解決できません。以下 コードスニペットは、以下のことを行います。コマンドライン引数のファイル名を通じ親プロセスがパイプ内の子プロセスによって書き込まれたデータを読み取ることができない
- がpipe_pて子プロセスに渡される
- 子プロセスが指定されたファイルを開き、に親プロセスのためにpipe_cために、その内容を書き込みます画面に表示されます。
すべてがうまくいきますが、親プロセスは(何も印刷していないので)パイプからデータを読み取ることができません。 子プロセスでデータを正常に書き込むことができました。なぜなら、親プロセスではなく子プロセスブロックでパイプを通じてコンテンツを印刷できるからです。
注:STEP 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;
}
ur提案のおかげで@zwol。私は4番目の点を持っていませんでした。ここでは、親プロセスが子プロセスがバッファを埋めるまで待機しています(これは正常に実行され、他の部分のprintf部分のコメントを外して確認できます)。しかし、親コンテキストに戻った後、子プロセスで読み込まれるデータは読み込まれません。 –
よろしくお願いします。あなたがコードを動作させることができれば素晴らしいだろう。ありがとうございました –
@ChanchalRoshan子プロセスでバッファオーバーランを修正し、_large_テストファイル(少なくとも32KB)を使用すると、待ち時間が早すぎるというデッドロックが発生するはずです。現在、デッドロックはバッファオーバーランによってマスクされているため、パイプバッファをいっぱいにする前に子がクラッシュします。 – zwol