操作系统实验

本文详细介绍了Linux环境下进程的控制,包括fork()创建进程、wait()、exit()及lockf()系统调用的使用,阐述了并发执行的特点与现象。通过实验展示了父子进程、孙进程的创建与通信,分析了不同进程执行顺序的原因。此外,还探讨了进程间的同步与互斥问题,通过pipe()实现父子进程间的通信。
摘要由CSDN通过智能技术生成

实验2 Linux进程控制
目的
要求
1.了解进程与程序的区别,加深对进程概念的理解;
2.进一步认识进程并发执行的原理,理解进程并发执行的特点,区别进程并发执行与顺序执行;
3.分析进程争用临界资源的现象,学习解决进程互斥的方法。
4.了解fork( )系统调用的返回值,掌握用fork()创建进程的方法;
5.熟悉wait、exit等系统调用。

实验
内容
1.编写C语言程序,实现在程序运行时通过系统调用fork( )创建两个子进程,使三进程并发执行,父亲进程执行时屏幕显示“I am father”,儿子进程执行时屏幕显示“I am son”,女儿进程执行时屏幕显示“I am daughter”。
2.编写C语言程序,实现在程序运行时通过系统调用fork( )创建一个子进程,子进程再创建一个孙子进程。使三进程并发执行,父亲进程执行时屏幕显示“I am father”,儿子进程执行时屏幕显示“I am son”,孙子进程执行时屏幕显示“I am grandson”。
3.多次连续反复运行这个程序,观察屏幕显示结果的顺序,直至出现不一样的情况为止。记下这种情况,试简单分析其原因。
4.修改程序,在三进程中分别使用wait、exit、lockf等系统调用“实现”其同步推进,多次反复运行改进后的程序,观察并记录运行结果。

实验
源码
①fork创建两个子进程

②Fork创建一个子进程和一个子子进程

③Wait()

④Exit()

⑤Lockf()

实验
结果




结果
分析
实验内容一
使用系统调用fork()创建两个子进程;使用系统调用fork()创建一个子进程,然后在子进程中再创建子子进程,分别用了两个if和fork进行创建。
判断输出的原理:fork函数被调用后有三种可能:①在父进程中,fork返回新创建子进程的进程ID;②在子进程中,fork返回0;③如果出现错误,fork返回一个负值。其中要注意的是:fork()是把进程当前的情况拷贝一份,\n是清除缓存区。
出现不同结果的原因:创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。所以多次运行后会出现:daughter在son前面、grandson在son前面的情况。
实验内容二
完成一个wait()练习,多次反复运行改进后的程序,观察并记录运行结果。
wait的特点是,父进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出。
在sleep(10)的过程中父进程执行了十次,每次sleep(1)一秒,所以抓捕了子进程十次都没有抓住,到第十一次的时候抓住了子进程。
sleep(1)是进入睡眠,暂时释放时间片,给其他线程,虽然sleep和wait的功能差不多,都是延长时间片,但是sleep后就是相当于唤醒了子进程,父进程会一直等待子进程苏醒后再向下进行;wait(&status)的意思是:父进程执行到此,马上阻塞自己,直到有子进程结束。当发现有子进程结束时,就会回收它的资源。
需要注意的是,wait()要与fork()配套出现,如果在使用fork()之前调用wait(),wait()的返回值则为-1,正常情况下wait()的返回值为子进程的PID。
实验内容三
学习exit()函数使用原理和范例。
exit()函数将终止调用进程,传入的参数是程序退出时的状态码,0表示正常退出;_exit终止调用进程,但不关闭文件,不清除输出缓存,也不调用出口函数。在本实验中我把exit(0)放在了第二个子进程(I am daughter)前面,结果是只输出父进程和第一个子进程(I am father、I am son)。另外,fork的子进程分支中使用_exit函数而不使用exit函数。
实验内容四
Linux进程控制 lockf()。
lockf(1,1,0)、lockf(1,0,0)分别是锁住和打开,在if循环里面实现五次信息的输出。size是指定文件fd的指定区域,用0表示从当前位置到文件结尾。实验的过程是:在父进程中创建了一个子进程,子进程需要输出五次文本信息,并且在输出语句执行之前,将标准输出设备锁住,在输出语句执行之后,将标准输出设备解锁。同样,父进程也是要输出五次文本信息,对标准输出的操作同子进程。

实验3 Linux进程间的通信
目的要求
学习如何利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信,并加深对上述通信机制的理解。

实验内容
1.了解系统调用pipe()的功能和实现过程。
2.编写一C语言程序,使其用管道来实现父子进程间通信。子进程向父进程发送字符串“is sending a message to parent!”;父进程则从管道中读出子进程发来的消息,并将其显示到屏幕上,然后终止。
3.运行该程序,观察、记录并简单分析其运行结果。

实验源码

实验结果

结果分析
本实验通过pipe函数创建了一个父进程与子进程之间传递数据的管道。filedes[0]为管道里的读取端,用read从管道中读数据;filedes[1]则为管道的写入端,用write向管道中写数据。类似于生产者消费者,父进程在执行read函数时,子进程通过write函数把消息写到管道中;若管道中没有数据可以读取,那么父进程就会阻塞自己,直到管道中有数据可以读取为止。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值