赞
踩
实验题目:
(1)编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在一个系统中有一个父进程和两个子进程活动,让每一个进程输出不同的内容,试观察记录屏幕上的显示结果,并分析原因;
(2)修改上述程序,每一个进程循环显示一句话,子进程显示‘daughter…’及‘son…’,父进程显示’parent…’,观察结果,分析原因;
(3)再调用exec()用新的程序替换该子进程的内容,并利用wait()来控制进程执行顺序,调用Exit()使子进程结束。
开始之前先介绍一下fork()函数和exec()函数:
fork()函数的作用是从已经存在的进程中创建一个子进程,而原进程称为父进程。该子进程和父进程的二进制代码和部分数据结构相同,且都运行到了相同的地方,相当于父进程的拷贝,但每个进程都将开始自己的活动fork()。若成功调用fork()函数,则子进程返回0,父进程返回子进程ID,否则,出错返回-1。函数的实质是一个系统调用。
在linux中exec()是一个函数族,一共包含六个函数(具体请自行百度)
fork()函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时候我们希望子进程去执行其他的程序,这时候就会用到exec()函数,它提供了一个在进程中启动另一个程序执行的方法,它可以根据指定的文件名或目录名找到可执行文件,并用它代替原进程的数据段,代码段和堆栈段,新程序从main处开始执行。需要注意的是原进程的被新程序的内容替代之后,进程号依旧不变。
下面将一步一步地介绍该实验的操作过程
1.创建.c文件,打开linux终端,使用vim命令新建文件夹(此操作需要安装vim,具体步骤自行百度)
这里总结一下vim编辑器的基本操作:
i 进入编辑模式
Esc 退出编辑模式
:wq 保存并退出
:q! 不保存退出
:q 退出
w 保存
下面是第一个题目的代码
分析:
父进程和两个子进程并发执行,输出顺序随机
gcc hello.c -o hello 编译
./hello 运行
附两次运行结果:
下面是第二个题目的代码
分析:
相比于第一个题目,改动的地方只是加了一个for循环,和第一题类似,输出带有随机性,但父进程和两个子进程的进程号是始终保持不变的
以下为两次运行结果:
第三题代码
分析:
fork()创建一个子进程之后执行switch-case语句,如果是子进程,就调用exec函数用新代码取代旧代码,并开始执行新代码,而如果是父进程,则调用wait函数使父进程在子进程结束之前一直处于睡眠状态。
以下为运行结果:
最后一行为父进程执行结果,其余的为子进程被新的程序替代之后的运行结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。