操作系统原理实验报告 2010-2011学年 第2学期
sprintf(buf, \ printf(\
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(\ else printf(\ wait(0);
if ((r=read(fd[0], s, 50))== -1) printf(\ else printf(\ exit(0); } } 2.
#include
第 5 页 共 16 页
操作系统原理实验报告 2010-2011学年 第2学期
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(\ exit(0); }
void ppdo() { kill(p1,SIGUSR1); kill(p2,SIGUSR2);
第 6 页 共 16 页
操作系统原理实验报告 2010-2011学年 第2学期
}
void p1do()
{ printf(\ exit(0); }
void p2do()
{ printf(\ exit(0);
第 7 页 共 16 页
操作系统原理实验报告 2010-2011学年 第2学期
六、程序运行结果及分析
1. 2.
程序相对比较简单,运行的时候基本没有错误。但编写程序是还需小心认真。
第 8 页 共 16 页
操作系统原理实验报告 2010-2011学年 第2学期
实验2 进程通信
一、实验目的
1. 了解进程间通信IPC的三种方式:消息队列、共享内存和信号量。 2. 掌握使用消息队列进行进程间通信的有关系统调用和编程方法。 3. 掌握使用共享内存进行进程间通信的有关系统调用和编程方法。
二、实验内容
1. 消息队列
使用系统调用msgget( )、msgsnd( )、msgrcv( )和msgctl( ),用消息队列机制实现客户进程和服务器进程间的通信。客户进程首先建立一个描述符为msgqid的消息队列,接着向服务器进程发送一个消息正文为自己的进程标识pid且类型为1的消息,然后接收来自服务器进程的消息,并在屏幕上显示:“Client receives a message from xxxx!”,其中“xxxx”为服务器进程的进程标识。服务器进程首先捕捉软中断信号(除不能捕捉的SIGKILL),若捕捉到时则调用函数cleanup( )删除消息队列,终止服务器进程。否则重复下列操作:接收所有类型为1的消息,并在屏幕上显示:“Server receives a message from xxxx!”,其中“xxxx”为客户进程的进程标识;然后服务器进程将客户进程的进程标识作为返回消息的类型,而将自己的进程标识作为消息正文发送给客户进程。
2. 共享内存
使用系统调用shmget( )、shmat( )和shmctl( ),用共享内存机制实现进程间的通信。其中一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据并显示在屏幕上。
三、实验要求
1. 根据实验内容编写C程序。 2. 上机调试程序。
3. 记录并分析程序运行结果。
第 9 页 共 16 页