操作系统4 实验报告.doc
文本预览下载声明
甘肃政法学院
本科生实验报告
(四)
姓名:
学院:计算机科学学院
专业: 信息管理与信息系统
班级: 11级信管1班
实验课程名称:操作系统实验
实验日期: 2013 年 12 月20日
指导教师及职称:
实验成绩:
开课时间:2012—2013 学年 一 学期
甘肃政法学院实验管理中心印制
实验题目 ?进程的管道及消息通信 否 姓名 班级 信管1班 学 号 一、实验目的 熟悉UNIX和linux操作系统进程通信的系统调用。
理解和掌握UNIX和LINUX进程通信系统的调用的功能,给出了进程通讯实现机制中的使用的系统调用命令的格式和如何利用系统调用命令进行进程通信编程,通过学习,提高对进程之间可通过系统的编程能力。 二.实验环境 操作系统Windows 7
2.装有虚拟机Linux的系统 三、实验内容与步骤 管道通信机制
图1_1
图1_2
通过使用管道实现两个或多个进程之间的通信。所谓管道,就是能将一个进程的标准输出与另一个进程的标准输入联系在一起,进行通信的一种方法。同组进程之间可用无名管道任意通信,而不同组进程之间可通过有名管道进行通信。
2、以命令行为参数的管道通信
(1)命令格式
#includestdio.h
#includesys/types.h
#includectype.h
FILE popen(const char cmdstring,const char type);
正确返回:文件结构的指针;错误返回:空指针。
Int pclose(FILE *fp);
正确返回:cmdstring文件结构的指针;错误返回:-1。
(2)打开一个以命令行为参数的管理文件,完成进程之间的通信进程
例子:以命令行为参数的管理文件的示例。
假设有一个的可执行程序chcase,从标准输出设备读字符,将小写字母转换成大写字母并进行输出。
主程序使用popen创建管道,实现将某文件中的字母转换成大写字母。其中的文本文件名作为参数传进来。源程序如下:
#includesys/wait.h
#includestdio.h
#define MAXLINE 100
int main(int argc,char *argv[])
{
char line[MAXLINE];
FILE *fpin,*fpout;
if(argc!=2)
{
fprintf(stderr,usage:a.outpathname\n);
exit(1);
}
if((fpin=fopen(argv[1],r))==NULL)
{
fprintf(stderr,cant open %s \n,argv[1]);
exit(1);
}
if((fpout=popen(/mnt/usb/mldm/chcase.exe,w))==NULL)
{
fprintf(stderr,popen error\n);
exit(1);
}
while((fgets(line,MAXLINE,fpin))!=NULL)
{
if(fputs(line,fpout)==EOF)
{
fprintf(stderr,fputs error to pipe. \n);
exit(1);
}
}
if(ferror(fpin))
{
fprintf(stderr,fgets error. \n);
exit(1);
}
if(pclose(fpout)==-1)
{
fprintf(stderr,pclose error. \n);
exit(1);
}
exit(0);
}
图2_1
3、有名管道的通信
创建一个有名管道的系统调用mknod()
有名管道的使用方法与无名管道不同。有名管道可被任何知道其名字的进程打开和使用。为了使用有名管道,进程要先建立它,并与它的一端相连。创建有名管道的进程的进程叫服务器进程,存取管道的其他进程叫客户端。通信双方必须首先创建有名管道后,才能打开管道进行读写。当文件不再需要时,要显示删除。创建一个有名管道的命令同创建一个目录文件,特殊文件一样,使用如下命令:
#includesys/types.h
#includesys/stat.h
#includeunistd.h
#incl
显示全部