v1.0 可编辑可修改 操作系统原理实验报告—— 实验一
张咪 软件工程四班
一、 实验目的
加深对于进程并发执行概念的理解。实践并发进/线程的创建和控制方法。观察和体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习Linux系统中进/线程创建与控制有关的系统调用的编程和调试技术。
二、 实验要求
编写一个多进程并发执行程序。父进程每隔3秒重复建立两个子进程,首先创建的让其执行ls命令,之后创建执行让其执行ps命令,并控制ps命令总在ls命令之前执行。
三、实验软硬件环境
实验环境均为Linux操作系统,开发工具为gcc和g++。
四、实验思路
调用fock()创建子进程。创建键盘中断信号后,使用pause()可以暂停子进程执行,继续创建新的子进程。子进程并发执行子进程可以首先通过键盘中断信号唤醒子进程。通过exec()调用族装入一个新的执行程序。在建立子进程2并且唤醒子进程1后子进程sleep(seconds = 5)。这样就可以先执行ps后执行ls。。最后就是父进程的结束,程序结束。
五、实验模型
pid1=fork() pid1=0子进程1 执行ps指令 pid1>0父进程 pid2=fork() pid1<0错误 pid2=0子进程b 执行ls pid2>0父进程 每隔三秒重复建立两pid2<0错误 1
v1.0 可编辑可修改 六、调试排错
1、首先遇到的问题是,对linux的操作不熟悉,不太明白makefile怎么使用,直接用了gcc
2、在创建多个子进程上遇到了问题,在fock()后又直接跟了一个fork(),这样创建的子进程是子进程的子进程,而不是父进程创建的第二个子进程。所以应该在else语句块后面,也就是主进程执行段继续创建。一般情况下,fork()按如下规则编程: main()
{ pid_t pid; pid=fork();
if(pid<0)
{
n\
2
v1.0 可编辑可修改 } } } }
}return (EXIT_SUCCESS); }
#include
typedef void(*sighandler_t)(int);
void sigcat(){printf(\
3