操作系统原理实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档