操作系统
进程管理实验报告
班级:2012211310
学号:2012211391
姓名:胡莺夕
班内序号:27
以下程序用来验证 fork()函数的功能。
可见,一个 fork()语句会返回两次.通过判断条件(pid1 > 0 && pid2 > 0)来标明主进程,
(pid1 == 0 && pid2 > 0)来标明子进程 1,(pid1 > 0 && pid2 == 0)来标明子进程 2。其中
pid1 == 0 && pid2 == 0 的进程为
pid1 = fork();语句第二次返回时再次执行 pid2 = fork();创建的子进程。
(1)进程的创建:
编写一段程序,使用系统调用 fork() 创建两个子进程。当此程序运行时,在系统中有一
个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,
子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原
因。
实验结果如图所示:
(2)进程的控制
修改已经编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现
的现象,并分析原因。
如果在程序中使用系统调用 lockf () 来给每一个进程加锁,可以实现进程之间的互斥,
观察并分析出现的现象。
如上图所示,lockf(1, 1, 0);为进程加锁,其他进程不能访问锁内的内容;lockf(1, 0, 0);为解
锁操作。
(3)
a) 编写一段程序,使其实现进程的软中断通信。
要求:使用系统调用 fork() 创建两个子进程,再用系统调用 signal() 让父进程捕捉键盘上来的中断信号(即按
DEL 键);当捕捉到中断信号后,父进程用系统调用 Kill() 向两个子进程发出信号,子进程捕捉到信号后分别
输出下列信息后终止:
Child Process 1 is killed by Parent!
Child Process 2 is killed by Parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent Process is killed!
b) 在上面的程序中增加语句 signal(SIGINT, SIG-IGN) 和 signal(SIGQUIT, SIG-IGN),
观察执行结果,并分析原因。
——程序将不响应 SIGINT(cntr + c)和 SIGQUIT(cntr + /)信号
#include
#include
#include
pid_t pid1, pid2;
void killChild(int sig);
void childOneDo(int sig);
void childTwoDo(int sig);
int main ()
{
pid1 = fork();
pid2 = fork();
if (pid1 > 0 && pid2 > 0)
{
signal(SIGINT, killChild);
signal(SIGINT, SIG_DFL);
}
else if (pid1 == 0 && pid2 > 0)
{
signal(SIGINT, childOneDo);
}
else if (pid1 > 0 && pid2 == 0)
{
}
signal(SIGINT, childTwoDo);
for ( ; ; ) ;
return 0;
}
void killChild(int sig)
{
kill(pid1, sig);
kill(pid2, sig);
}
void childOneDo(int sig)
{
printf("Child process one is killed by parent!\n");
}
void childTwoDo(int sig)
{
printf("Child process two is killed by parent!\n");
printf("Parent process is killed!\n");
}
(4)进程的管道通信
编制一段程序,实现进程的管道通信。
使用系统调用 pipe() 建立一条管道线;两个子进程 P1 和 P2 分别向管道各写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。
要求父进程先接收子进程 P1 发来的消息,然后再接收子进程 P2 发来的消息。
实现代码如下:
#include
#include
int main ()
{
pid_t pid1, pid2;