linux进程创建及同步实验

linux进程创建及同步实验

编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程输出不同的内容。试观察记录屏幕上的显示结果,并分析原因。

fork()返回值意义:
返回值<0,创建失败
返回值=0,在子进程中
返回值>0,在父进程中

vim fork1.c
进入编辑
在这里插入图片描述在这里插入图片描述
结果如上图
分析:在调用fork()函数创建子进程后,父子进程的执行顺序由操作系统来决定。从进程并发执行来看,各种情况都有可能,这三个进程的输出顺序具有随机性。

修改上述程序,每一个进程循环显示一句话。子进程显示“duaghter…”及“son…”,父进程显示“parent…”,观察结果,分析原因。

再次进入fork1.c编辑

在这里插入图片描述
在这里插入图片描述
结果如上图
每个进程循环10次
分析:由于函数printf( )在输出字符串时不会被中断,所以,字符串内部字符顺序输出不变。由于进程并发执行的调度顺序和父子进程抢占处理机问题,循环输出字符串的顺序随着进程执行的不同而发生变化。

在调用exec()函数用新的程序替换该子进程的内容,并利用wait()函数来控制进程执行的顺序。调用exit()函数使子进程结束。

exec()

用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段。

有6种不同的exec函数可供使用,它们常常被统称为exec函数。这些exec函数使得UNIX进程控制原语更加完善。用fork可以创建新进程,用exec可以执行新程序。exit函数和两个wait函数处理终止和等待终止。

exec()和fork()联合使用

系统调用exec()和fork()联合使用能为程序开发提供有力支持。用fork( )建立子进程,然后在子进程中使用exec(),这样就实现了父进程与一个与它完全不同子进程的并发执行。

wait()

等待子进程运行结束。如果子进程没有完成,父进程一直等待。wait()将调用进程挂起,直至其子进程因暂停或终止而发来软件中断信号为止。如果在wait()前已有子进程暂停或终止,则调用进程做适当处理后便返回。
对于wait()
首先查找调用进程是否有子进程,若无,则返回出错码;
若找到一处于“僵死状态”的子进程,则将子进程的执行时间加到父进程的执行时间上,并释放子进程的进程表项;
若未找到处于“僵死状态”的子进程,则调用进程便在可被中断的优先级上睡眠,等待其子进程发来软中断信号时被唤醒。

exit()

该函数表示退出,传入的参数是程序退出时的状态,0表示正常退出,其他表示非正常他退出

在这里插入图片描述在这里插入图片描述
结果如上图
分析:我们在使用了exec()函数后程序使用了ls的命令,列出/bin/目录下的文件信息,我们可以发现在使用wait()函数后,父进程永远将在其他的子进程完成之后才执行,程序在调用fork()函数建立一个子进程后,马上调用wait()函数,使父进程在子进程结束之前一直处于睡眠状态,所以在输出的结果中我们可以看到最后输出的将是父进程的信息。

感想

我的很多操作都是根据这些题目在网上找博客看得,感觉对于进程的一些调度以及很多与进程有关的函数都不怎么懂,通过这次作业,我对于这些知识有了一点了解,但是有些知识还是处于略迷糊的状态,下次再加油弄懂。。。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值