首先,是的,这是我班上的一个实验室活动,但我已经提交并为这个练习辩护了。我想知道是否有另一种方式,一种更有效的方式来编写这段代码。
我们的任务是编写一段代码来创建一个进程,该进程创建一个子进程,然后再创建另一个子进程,最后再创建一个子进程。
*编辑:我将要求分开并编号以提高可读性:)
最后一个孩子将显示系统中运行的当前进程。
然后它的父母会询问一个词,然后使用用户的输入创建一个文件。
然后它的父级会询问一个单词或一个短语,然后在你机器的库中找到它(假设我输入了 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());
}
}