現在、パイプについて学習を行っております。
以下のコードの中で理解が不十分な箇所がありますので教えていただけないでしょうか。
不明点
このコードの大まかな流れは以下のようになっていると認識しています。
・fork()によって子プロセスを生成
親プロセス
・テキストファイルを開く
・テキストファイルに文字列が記入されているか確認(一行ごと確認する)&buff[]へ文字列を格納
・pipefd[1]へ文字を書き込む
子プロセス
・pipefd[0]に文字列があるか確認
・コンソールにbuff[]に格納されている文字を出力
踏まえての以下質問になります。
1.pipefd[1]に文字が書き込まれるとpipefd[0]に文字格納されるのか?
※パイプの概念がそのような仕様だったのでそう思いました。
2.親プロセスと子プロセスは同時に動いているように認識しています。
そのため、子プロセスの処理実行時にはpipefd[0]には何も格納されておらず、ループから抜けてしまうのではないかと思っております。
また、上記以外にも細かいところですが
・write関数の第三引数のstrlen(buff) + 1の意味
・それぞれのプロセスで使用しないpipe配列をcloseしている意味
・親プロセス末尾のwait関数の意味
などがわかっていないので併せて教えていただけると幸いです。
なお、このコードで使用するテキストファイル以下のテキストになります。
sample.txtの内容が出力されることは確認しております。
sample.txt
Hello
bye
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <stdlib.h> #include <string.h> #define BUFF_SIZE 1024 int main(int argc, char **argv) { int pipefd[2]; int p_id; int status; FILE *fp; char buff[BUFF_SIZE]; if (argc != 2) { fprintf(stderr, "main : 実行時引数の数が不当です\n"); exit(EXIT_FAILURE); } if (pipe(pipefd) == -1) { perror("main "); exit(EXIT_FAILURE); } if ((p_id = fork()) == -1) { perror("main"); exit(EXIT_FAILURE); } if (p_id == 0) { /* 子プロセス */ /* 使用しないwrite側はクローズ */ close(pipefd[1]); /* パイプから読み込む */ while (read(pipefd[0], &buff, BUFF_SIZE) > 0) { fputs(buff, stdout); } close(pipefd[0]); } else { /* 親プロセス */ /* 使用しないread側はクローズ */ close(pipefd[0]); if ((fp = fopen(*(argv + 1), "r")) != NULL) { while(fgets(buff, BUFF_SIZE, fp) != NULL) { /* パイプに書き込む */ write(pipefd[1], buff, strlen(buff) + 1); } fclose(fp); } else { perror("親プロセス"); } close(pipefd[1]); wait(&status); } return EXIT_SUCCESS; }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/04 02:42
2020/12/04 13:49
2020/12/04 13:58
2020/12/07 05:30