实验一:进程管理
(2011-11-23 21:13:47)
标签:
进程管理实验操作系统linuxit |
分类: Linux |
实验目的:
(1)进程的创建
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”:子进程分别显示“b”和“c”。试观察记录屏幕上显示结果,并分析原因。
步骤一:了解fock()函数的原理
fock()函数通过系统调用创建一个与原来进程几乎完全相同的进程,(已执行的代码不复制)。如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。fork()函数调用一次能返回两个值,在子进程中,fork()函数返回0,在父进程中,fork()函数返回新创建子进程的进程ID。如果出现错误,fork()函数返回一个负值。
步骤二:编写代码
#include<stdio.h>
int main()
{
int p1 ,p2 ;
while((p1=fork())==-1);
if(p1==0)
putchar('b');
else
{
while((p2=fork())==-1);
if(p2==0)
putchar('c');
else
putchar('a');
}
return 0;
}
步骤三:编译运行
步骤四:分析原因
(2) 进程的控制
1. 修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行是屏幕上出现的现象,并分析其原因。
修改实验(1)的代码如下:
#include<stdio.h>
int main()
{
int p1 ,p2 ;
while((p1=fork())==-1);
if(p1==0)
printf("Child1 is running!\n");
else
{
while((p2=fork())==-1);
if(p2==0)
printf("Child2 is running!\n");
else
printf("Father is
running!\n");
}
return 0;
}
执行后输出结果如下:
原因分析:与实验(1)一样的原理,只是输出内容改变了。
2.使用exec函数族使子进程执行新的目标程序。
exec()函数是一个调用别的已存在的程序,使之代替原来的进程的一个系统调用。它的参数就是已存在的程序的名字。
代码如下:
#include <stdio.h>
#include <unistd.h>
int main()
{
}
输出结果如下:
===system call execl testing ===
—10月 31
原因分析:
进程执行到第一个打印函数,正常执行,输出“===system
call execl testing ===”。接着调用execlp();放弃主程序,转去执行名字为“date”的程序,输出日期“— 10月31
(3) 编写一段程序,使其实现进程的软中断通信
使用系统调用fork()创建两个子程序,再用系统调用signal()接收父进程从键盘上来的中断信号(即按Ctrl+c键);当有中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程有信号后分别输出
Child Processll is Killed by Parent!
Child Processl2 is Killed by Parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent process is Killed!
函数分析:signal(int
sign,void(*
代码如下:
}
执行结果如下:
键盘键入:Ctrl+c键
输出:
原因分析:

加载中…