まず第一に、はい、これは私のクラスの実験室の活動ですが、私はすでにこの演習を提出し、弁護しました。私が知りたいのは、このコードをより効率的に記述する別の方法があるかどうかです。
私たちの任務は、プロセスを作成するコードを作成することでした。プロセスは子を作成し、プロセスは別の子を作成し、最後に別の子を作成します。
*編集:読みやすくするために、要件を分離して番号を付けました:)
最後の子は、システムで実行中の現在のプロセスを示します。
その親は単語を要求し、ユーザーの入力を使用してファイルを作成します。
次に、その親は単語またはフレーズを要求し、マシンのライブラリ内でそれを見つけます (たとえば、hi と入力すると、hi とそのディレクトリを含むファイルが検索され、一覧表示されるはずです。単語 hi の位置は重要ではありません)。 )
最後に、メインの親はその親 ID を出力するだけです。
そのための私の完全なコードは次のとおりです。
int main(void){
char fileName[30];
char phrase[30];
int pid = fork();
int fd[2];
pipe(fd);
if(pid==0){
printf ("CHILD1: I am the 1st child\n");
printf ("CHILD1: ID is %d \n", getpid());
printf ("CHILD1: Parent ID is %d \n", getppid());
int pid2 = fork();
if(pid2==0){
printf ("\t CHILD2: I am the 2nd child\n");
printf ("\t CHILD2: ID is %d \n", getpid());
printf ("\t CHILD2: Parent ID is %d \n", getppid());
int pid3 = fork();
if(pid3==0){
printf ("\t\t CHILD3: I am the 3rd child\n");
printf ("\t\t CHILD3: ID is %d \n", getpid());
printf ("\t\t CHILD3: Parent ID is %d \n", getppid());
execlp ("/usr/bin/top", "top", NULL);
}else if(pid3==-1){
printf ("ID is %d", getpid());
printf ("error");
exit(1);
}else{
wait(NULL);
printf ("\t CHILD2: Enter a filename: ");
scanf ("%s", fileName);
printf ("\t CHILD2: %s was succcessfully created!\n", fileName);
execlp ("/bin/touch", "touch", fileName, NULL);
}
}else if(pid2==-1){
printf ("ID is %d", getpid());
printf ("error");
exit(1);
}else{
wait(NULL);
int pid4 = fork();
if(pid4 > 0) {
printf ("CHILD1: Enter a pharse: ");
scanf ("%s", phrase);
close(fd[1]);
close(STDIN_FILENO);
dup2(fd[0],STDIN_FILENO);
execlp ("/bin/grep", "grep", phrase, NULL);
}else if (pid4 == 0) {
close(fd[0]);
close(STDOUT_FILENO);
dup2(fd[1],STDOUT_FILENO);
execlp ("/usr/bin/find", "find", NULL);
}else {
printf ("error");
}
}
}else if(pid==-1){
printf ("ID is %d", getpid());
printf ("error");
exit(1);
}else{
wait(NULL);
printf ("PARENT: I am the parent\n");
printf ("PARENT: ID is %d \n", getpid());
}
}