本次实验是学校自己布置的,网上几乎没有参考。
对于实验的第四个内容 “4.编写5.c,实现父进程与子进程交替输出10次,父进程输出word pid,子进程输出 hello pid。”,我搜集了网上的很多资料进行学习,然而做出来的效果与实验指导书要求的有差距。
指导书要求的效果:
我根据网上搜集资料学习做出来的效果:
可以看到,并不够准确。
所以根据进一步的学习与查找资料,尝试多种,最终得出与实验指导书要求效果更为匹配的代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() {
pid_t pid;
for(int i = 0; i < 10; i++) {
pid = fork();
if(pid == 0) {
// 子进程
printf("hello %d\n", getpid());
break; // 子进程退出循环
} else if(pid > 0) {
// 父进程
printf("world %d\n", getpid());
wait(NULL); // 等待子进程完成
} else {
// fork失败
perror("fork");
return 1;
}
}
return 0;
}
我最终的实验效果如下:
完成。
总结最开始我在网上搜集借鉴得出的代码段为什么不够准确: (非常非常感谢提供代码思路的前辈们。此处仅个人观点)
开始的代码
原因:
- 在循环中使用了
getpid()
和getppid()
函数来获取父进程的 PID。然而,没有正确地处理这些函数的返回值。在 C 语言中,即使函数调用成功,其返回值也可能不为零,这并不意味着发生了错误。因此,需要检查函数调用的实际返回值,而不是简单地使用!= 0
来判断是否发生错误。 - 在循环中使用了
fork()
函数来创建子进程,但是没有在适当的位置执行父进程和子进程的操作,所以父进程和子进程都可能同时输出“world”或“hello”。为了确保父进程和子进程交替输出,需要在父进程和子进程中分别执行不同的操作。 - 在循环结束后,尝试再次获取父进程的 PID。然而,此时父进程已经退出,所以
getppid()
将无法获取到有效的父进程 PID。此外,试图将pid
设置为了零,但这在循环结束后是没有意义的,因为pid
不再代表任何活跃的进程。
个人见解,欢迎批评指正!