私はファイルを読み込み、子プロセスとキーワードに一致する行を返して親に伝えようとしていますが、順序は関係ありません。パイプでファイルのすべての行を取得できません
私の最初の質問は次のとおりです。パイプを1つしか使用できないか、最初のプロセスでパイプを閉じることができますか?
私の2番目の質問は、それぞれの子のためのパイプを作成し、まだ親がそれらのすべてを読んでいない、最初のファイルのキーワードに一致するすべての行と2番目のファイルの最初の行の一致と停止を表示することです。 (私は2つのファイルしか試していませんが、それは問題ではありません)
すべてのファイルのオープンとクローズが正常に動作するものとします。私はすべてのファイルオープン、パイプ()とフォーク()のチェックを持っています。残りはチェックされません。
私のコードは以下の通りです:
#include "commons.h"
//efmalloc is error-free malloc
int main(int argc, char *argv[]){
int numargs = argc-1;
int fds[numargs][2];
pid_t n;
for (int i = 0; i < numargs; i++)
pipe(fds[i]);
for(int i = 0; i < argc-1;i++){
n = fork();
if(n==0){
close(fds[i][0]);//closing the read end of the pipe for the children
FILE * fs = fopen(argv[i+1],"r");
//// SETTING UP THE PARAMETERS FOR READING ////
char * outputdata = (char*) efmalloc(400*sizeof(char));
*outputdata = '\0';
char * line = NULL;
size_t len = 0;
int read = getline(&line, &len, fs);
int currentline = 1;
//// END OF READINGS SETUP ////
while (read >= 0) {
if(strstr(line,"keyword") != NULL) {
strcat(outputdata,argv[i+1]);
strcat(outputdata,line);
strcat(outputdata,"\0");
//Write the data in the pipe in here
write(fds[i][1],outputdata,(strlen(outputdata)+1));
*outputdata = '\0';
}
read = getline(&line, &len, fs);
currentline++;
}
free(outputdata);
fclose(fs);
close(fds[i][1]); //now closing the write end of the pipe
exit(0);
}
}
/***** PARENT PROCESS *****/
if(n!=0) {
for (int index = 0; index < numargs; index++)
close(fds[index][1]);
char * readmsg = (char*)efmalloc(BUFFER_SIZE*sizeof(char));
for(int j = 0; j < numargs; j++){
int bytes = read(fds[j][0],readmsg,BUFFER_SIZE);
while(bytes>0){
readmsg[bytes] = 0;
printf("%s\n", readmsg);
bytes = read(fds[j][0],readmsg,BUFFER_SIZE);
}
}
for(int i = 0; i < numargs;i++)
wait(NULL);
}
return 0;
}
コードを機能に分割します。これにより、デバッグが容易になります。 – sturcotte06