资源描述:
《实验二进程通信-Linux实验报告.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验报告学号_____姓名_______成绩实验二进程通信【实验目的和要求】1、了解进程通信的概念及方法;2、了解信号量、管道;3、掌握信号量、管道和命名管道编程方法。【实验内容】1、利用命名管道实现单机QQ聊天;2、撰写实验报告;【实验原理】1、信号量(semaphore)是为那些访问相同资源的进程以及同一进程不同线程之间提供的一个同步机制。它不是用于传输数据,而只是简单地协调对共享资源的访问。信号量包含一个计数器,表示某个资源正在被访问和访问的次数,用来控制多进程对共享数据的访问。一旦成功拥有了一个信号量,对它所能做的操作只有两
2、种:请求和释放。当执行释放操作时,系统将该信号值减1(如果小于零,则设置为零);当执行请求操作时,系统将该信号值加1,如果加1后的值大于设定的最大值,那么系统将会挂起处理进程,直到信号值小于最大值为止。Tuxedo用信号量来确保在某一时刻只有一个进程对某一块共享内存进程访问。信号量配置太低会导致Tuxedo系统应用程序无法启动。2、管道分为两种:管道和命名管道。管道是UNIX系统IPC的最古老形式,并且所有的UNIX系统都提供这种通信机制。可以在有亲缘关系(父子进程或者是兄弟进程之间)进行通信,管道的数据只能单向流动,如果想双向流动
3、,必须创建两个管道。管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信。后来以管道为基础提出命名管道(namedpipe,FIFO)的概念,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(firstinfirstout)规则
4、,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。【程序代码】1、lucy.c#include#include#include#include#include#include#include#includecharwrite_fifo_name[]="ltop_fifo";charread_fifo_n
5、ame[]="ptol_fifo";charwriter[]="Lucy";charreader[]="Peter";intmain(intargc,char*argv[]){intwrite_fd,read_fd;mkfifo(write_fifo_name,S_IRUSR
6、S_IWUSR);mkfifo(read_fifo_name,S_IRUSR
7、S_IWUSR);printf("hello,Iamlucy!");write_fd=open(write_fifo_name,O_WRONLY);if(write_fd<0){
8、perror("open_w");exit(-1);}read_fd=open(read_fifo_name,O_RDONLY);if(read_fd<0){perror("open_r");exit(-1);}pid_tpid;pid=fork();if(pid==0){while(1){charbufw[256]="";printf("%s:",writer);if(fgets(bufw,256,stdin)==NULL)exit(1);bufw[strlen(bufw)-1]=' ';write(write_fd,bufw,
9、strlen(bufw));if(strncmp(bufw,"bye",3)==0){close(write_fd);unlink(write_fifo_name);exit(1);}}}else{while(1){charbufr[256]="";read(read_fd,bufr,256);printf("r%s:%s",reader,bufr);if(strncmp(bufr,"bye",3)==0){write(write_fd,"bye",4);close(read_fd);unlink(read_fifo_name
10、);exit(1);}printf("%s:",writer);fflush(stdout);}}return0;}2、peter.c#include#include#include