操作系统原理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统原理
实验报告
学院:信息与电子工程学院专业:计算机科学与技术
班级:计算机
学号:
姓名:
浙江科技学院
2010-2011学年第2学期
实验1 进程管理
一、实验目的
1. 弄清进程和程序的区别,加深对进程概念的理解。
2. 了解并发进程的执行过程,进一步认识并发执行的实质。
3. 掌握解决进程互斥使用资源的方法。
二、实验内容
1. 管道通信
使用系统调用pipe( )建立一个管道,然后使用系统调用fork( )创建2个子进程p1和p2。这2个子进程分别向管道中写入字符串:“Child process p1 is sending message!”和“Child process p2 is sending message!”,而父进程则从管道中读出来自两个子进程的信息,并显示在屏幕上。
2. 软中断通信
使用系统调用fork( )创建2个子进程p1和p2,在父进程中使用系统调用signal( )捕捉来自键盘上的软中断信号SIGINT(即按Ctrl-C),当捕捉到软中断信号SIGINT后,父进程使用系统调用kill( )分别向2个子进程发出软中断信号SIGUSR1和SIGUSR2,子进程捕捉到信号后分别输出信息“Child process p1 is killed by parent!”和“Child process p2 is killed by parent!”后终止。而父进程等待2个子进程终止后,输出信息“Parent process is killed!”后终止。
三、实验要求
1. 根据实验内容编写C程序。
2. 上机调试程序。
3. 记录并分析程序运行结果。
四、程序说明和程序流程图
1. 管道通信即发送进程以字符流形式将大量数据送入管道,接收进程可从管道接收数据,二者利用管道进行通信。无论是SQL Server用户,还是PB用户,作为C/S结构开发环境,他们在网络通信的实现上,都有一种共同的方法——命名管道。由于当前操作系统的不惟一性,各个系统都有其独自的通信协议,导致了不同系统间通信的困难。尽管TCP/IP协议目前已发展成为Internet 的标准,但仍不能保证C/S应用程序的顺利进行。命名管道作为一种通信方法,有其独特的优越性,这主要表现在它不完全依赖于某一种协议,而是适用于任何协议——只要能够实现通信。
2.
五、程序代码
1.
#include
void main( )
{ int i, r, p1, p2, fd[2];
char buf[50], s[50];
pipe(fd); /* 父进程建立管道*/
while ((p1=fork())==-1); /* 创建子进程P1,失败时循环*/ if (p1==0) /* 由子进程P1返回,执行子进程P1 */
{ lockf(fd[1], 1, 0); /* 加锁锁定写入端*/
sprintf(buf, "Child process P1 is sending messages! \n");
printf("Child process P1! \n");
write(fd[1], buf, 50); /* 把buf中的50个字符写入管道*/ sleep(5); /* 睡眠5秒*/
lockf(fd[1], 0, 0); /* 释放管道写入端*/
exit(0); /* 关闭P1*/
}
else /* 从父进程返回,执行父进程*/
{ while ((p2=fork())==-1); /* 创建子进程P2,失败时循环*/ if (p2==0) /* 从子进程P2返回,执行子进程P2 */
{ lockf(fd[1], 1, 0); /* 锁定写入端*/
sprintf(buf, "Child process P2 is sending messages! \n");
printf("Child process P2! \n");
write(fd[1], buf, 50); /* 把buf中的字符写入管道*/
sleep(5); /* 睡眠5秒*/
lockf(fd[1], 0, 0); /* 释放管道写入端*/
exit(0); /* 关闭P2*/
}
wait(0);
if ((r=read(fd[0], s, 50))== -1) printf("cannot read pipe! \n");
else printf("%s", s);
wait(0);
if ((r=read(fd[0], s, 50))== -1) printf("cannot read pipe! \n");
else printf("%s", s);
exit(0);
}
}
2.
#include
#include
#include
int p1,p2;
void main()
{ void ppdo();
void p1do();
void p2do();
signal(SIGINT,ppdo);
p1=fork();
if(p1==0) {
signal(SIGUSR1,p1do);
for(;;); }
else {
p2=fork();
if(p2==0) {
signal(SIGUSR2,p2do);
for(;;); } }
wait(0);
wait(0);
printf("\nParent process is killed!\n"); exit(0);
}
void ppdo()
{ kill(p1,SIGUSR1);
kill(p2,SIGUSR2);