操作系统实验Word格式.doc
《操作系统实验Word格式.doc》由会员分享,可在线阅读,更多相关《操作系统实验Word格式.doc(20页珍藏版)》请在冰豆网上搜索。
sys/type.h>
sys/wait.h>
(pid_t)wait(int*statloc);
Exit()函数:
进程终止。
在正常终止时,exit()函数返回进程结束状态。
调用格式为:
stdio.h>
Voidexit(intstatus);
其中,status为进程结束状态。
3、实验内容
(1)进程创建
编写一段程序,利用系统调用fork()创建两个进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:
父进程显示字符“a”;
子进程分别显示字符“b”和字符“c”。
(2)进程控制
修改已经编号的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。
如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
参考程序1:
#include<
Main()
{
Intp1,p2;
While((p1=fork())==-1);
If(p1==0)
Putchar(‘b’);
Else
{
While((p2=fork()==-1);
If(p2==0)
Putchar(‘c’);
Else
Putchar(‘a’);
}
分析执行结果及原因。
参考程序2:
#include<
{
Intp1,p2;
While((p1=fork()==-1);
If(p1==0)
For(i=0;
i<
50;
i++)
Printf(“child%d\n”,i);
Else
{
While((p2=fork()==-1);
If(p2==0)
For(i=0;
Printf(“son%d\n”,i);
Else
For(i=0;
Printf(“daughter%d\n”,i);
参考程序3:
#include<
unistd.h>
Main()
Intp1,p2,I;
While((p1=fork()==-1);
If(p1==0)
Lockf(1,1,0);
For(i=0;
Printf(“child%d\n”,i);
Lockf(1,0,0);
Else
{
While((p2=fork()==-1);
If(p2==0)
Lockf(1,1,0);
For(i=0;
Printf(‘son%d\n”,i);
Lockf(1,0,0);
Else
{
Lockf(1,1,0);
For(i=0;
Printf(“daughter%d\n”,i);
Lockf(1,0,0);
实验2进程通信
一、实验目的
(1)理解进程处理信号的方法,使用用户自定义的信号处理程序。
(2)分析进程竞争资源现象,学习解决进程互斥的方法。
(3)了解linux系统中进程通信的基本原理。
二、预备内容
通过Linux提供的系统调用signal(),来说明如何执行一个预先安排好的信号处理函数。
signal()的返回值是指向一个函数的指针,该函数的参数为一个整数。
#include<
signal.h>
intctrl_c_count=0;
void(*old_handler)(int);
voidctrl_c(int);
voidmain()
intc;
/*设置ctrl+c产生的信号SIGINT的处理程序为ctrl_c.取代系统原来默认的处理程序*/
old_handler=singal(SIGINT,ctrl_c);
/*不断输入字符,同时按多次ctrl+c,直到按回车结束*/
while((c=getchar())!
=’\n’));
printf(“ctrl_c_count=%d\n”,ctrl_c_count);
/*设置信号处理程序为原来的处理程序*/
(void)singal(SIGINT,old_hander);
/*不断输入字符,ctrl+c结束*/
while((c=getchar())!
/*对SIGINT信号的处理程序*/
voidctrl_c(intsignum)
(void)signal(SIGINT,ctrl_c);
++ctrl_c;
程序说明:
这个程序是从键盘获得字符,直到换行符为止,然后进入无限循环。
这里,程序安排了捕获ctrl_c信号(SIGINT),并且利用SIGINT来执行一个ctrl_c的处理函数。
当在键盘上敲入一个换行符时,SIGINT原来的操作(很可能是默认操作)才被恢复。
Main()函数中的第一个语句完成设置信号处理程序:
old_handler=signal(SIGINT,ctrl_c);
signal()的两个参数是:
信号值,这里是键盘中断信号SIGINT;
以及一个指向函数的指针,这里是ctrl_c,当这个中断信号出现时,将调用该函数。
Signal()调用返回旧的信号处理程序的地址,在此它被赋给变量older_handler,使得原来的信号处理程序稍后可以被恢复。
三、实验内容
1、软中断通信
编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:
childprocess1iskilledbyparent!
childprocess2iskilledbyparent!
父进程等待两个子进程终止后,输出以下信息后终止:
parentprocessiskilled!
2、进程的管道通信
编制一段程序,实现进程的管道通信。
使用系统调用pipe()建立一条管道先。
两个子进程p1和分别向管道各写一句话:
Child1processissendingamessage!
Child2processissendingamessage!
而父进程则从管道中读出来自于两个子进程的信息并显示在屏幕上。
3、消息通信
使用系统调用msgget(),msgsnd(),msgrcv()及msgctl()编制一长度为1K的消息发送和接收的程序。
〈程序设计〉
(1)为了便于操作和观察结果,用一个程序为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。
(2)SERVER端建立一个Key为75的消息队列,等待其他进程发来的消息。
当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。
SERVER每接收到一个消息后显示一句“(server)received”。
(3)CLIENT端使用Key为75的消息队列,先后发送类型从10到1的消息,然后退出。
最后的一个消息,既是SERVER端需要的结束信号。
CLIENT每发送一条消息后显示一句“(client)sent”。
(4)父进程在SERVER和CLIENT均退出后结束。
参考程序:
略。
4、共享存储区通信
使用系统调用shmget(),sgmat(),smgdt(),shmctl(),编制一个与上述相同功能的程序。
sys/types.h>
sys/msg.h>
sys/ipc.h>
#defineSHMKEY75
Intshmid,I;
Int*addr;
Voidclient()
IntI;
Shmid=shmget(SHMKEY,1024,0777);
/*获取共享区,长度为1024*/
Addr=shmat(shmid,0,0);
/*共享区起始地址为addr*/
For(i=9;
i>
=0;
i--)
{
While(*addr!
=-1);
Printf(“(client)sent\n”);
/*打印(client)sent*/
*addr=I;
Exit(0);
Voidserver()
Shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);
/*创建共享区*/
/*共享区起始地址为addr*/
Do
{*addr=-1;
While(*addr==-1);
Printf(“(server)received\n”);
/*服务进程使用共享区*/
}while(*addr);
Shmctl(shmid,IPC_RMID,0);
Eixt(0);
Voidmain()
While((i=fork())==-1);
If(!
i)server();
While((i=fork())==-1);
i)client();
Wait(0);
Wait(0);
实验三存储管理
(1)理解内