《计算机系统2》Lab实验6

本次实验是学校自己布置的,网上几乎没有参考。 

对于实验的第四个内容  “4.编写5.c,实现父进程与子进程交替输出10次,父进程输出word pid,子进程输出 hello pid。”,我搜集了网上的很多资料进行学习,然而做出来的效果与实验指导书要求的有差距。

 

指导书要求的效果:

35ea7f2ad69a40878c03c716324a2331.png

 

我根据网上搜集资料学习做出来的效果:

b3bccf314b4149c6885065d4ab3b9e6f.jpeg

可以看到,并不够准确。

 

所以根据进一步的学习与查找资料,尝试多种,最终得出与实验指导书要求效果更为匹配的代码:

#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;
}

我最终的实验效果如下:

80ba89b2960f43eea8c3a8519a20b7a0.jpeg

完成。

 

总结最开始我在网上搜集借鉴得出的代码段为什么不够准确: (非常非常感谢提供代码思路的前辈们。此处仅个人观点)

开始的代码

d323657c19e64b0499d78ecf6b4edd5a.png

 

原因:

  1. 在循环中使用了 getpid() 和 getppid() 函数来获取父进程的 PID。然而,没有正确地处理这些函数的返回值。在 C 语言中,即使函数调用成功,其返回值也可能不为零,这并不意味着发生了错误。因此,需要检查函数调用的实际返回值,而不是简单地使用 != 0 来判断是否发生错误。
  2. 在循环中使用了 fork() 函数来创建子进程,但是没有在适当的位置执行父进程和子进程的操作,所以父进程和子进程都可能同时输出“world”或“hello”。为了确保父进程和子进程交替输出,需要在父进程和子进程中分别执行不同的操作。
  3. 在循环结束后,尝试再次获取父进程的 PID。然而,此时父进程已经退出,所以 getppid() 将无法获取到有效的父进程 PID。此外,试图将 pid 设置为了零,但这在循环结束后是没有意义的,因为 pid 不再代表任何活跃的进程。

 

个人见解,欢迎批评指正!

 

 

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值