Linux系统编程(第六章进程间通信).pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《Linux系统编程(第六章进程间通信).pdf》由会员分享,可在线阅读,更多相关《Linux系统编程(第六章进程间通信).pdf(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章:进程间通信第六章:进程间通信目标目标:本章旨在向学员介绍本章旨在向学员介绍LinuxLinux系统系统下进程间通信及同步的机制及方下进程间通信及同步的机制及方法:法:1)掌握进程间通信的主要方法掌握进程间通信的主要方法:管道、命名管道、共享内存等管道、命名管道、共享内存等2)掌握进程间同步的主要方法掌握进程间同步的主要方法:信号量等:信号量等时间:时间:6 学时学时教学方法:讲授教学方法:讲授PPT、实例练习实例练习6.1 关于进程间通信与同步关于进程间通信与同步功能提供几种机制方便进程之间进行数据交换或提供几种机制方便进程之间进行数据交换或者进程之间的同步者进程之间的同步方法进程间通
2、信及同步的方式有:进程间通信及同步的方式有:pipe、fifo、共、共享内存、信号量、享内存、信号量、socket通信通信6.1.1 最简单的进程通信最简单的进程通信在两个程序间最简单的数据传递方法是利用popen及pclose函数了。command参数:要运行的程序名和相应的参数open_mode参数:必须是“r”或者“w”#include FILE*popen(const char*command,const char*open_mode);int pclose(FILE*stream_to_close);6.1.1 最简单的进程通信最简单的进程通信例程:读取外部程序的输出int main
3、()FILE*read_fp;char bufferBUFSIZ+1;int chars_read;memset(buffer,0,sizeof(buffer);read_fp=popen(“uname a”,“r”);if(read_fp!=NULL)chars_read=fread(buffer,sizeof(char),BUFSIZ,read_fp);if(chars_read 0)printf(“Output was:-n%sn”,buffer);pclose(read_fp);exit(EXIT_SUCCESS);exit(EXIT_FAILURE);#include#include
4、#include#include 6.1.1 最简单的进程通信最简单的进程通信例程:将输出送往外部程序#include#include#include int main()FILE*write_fp;char bufferBUFSIZ+1;sprintf(buffer,“Once upon a time,there wasn”);write_fp=popen(“od c”,“w”);if(write_fp!=NULL)fwrite(buffer,sizeof(char),strlen(buffer),write_fp);pclose(write_fp);exit(EXIT_SUCCESS);e
5、xit(EXIT_FAILURE);6.2 进程间通信机制进程间通信机制(IPC)进程间通信机制(IPC机制)有五类:信号量信号量1共享内存共享内存2消息传递消息传递3管道管道4命名管道命名管道56.2.1 管道管道父进程父进程pipes1管道管道pipes0子进程子进程功能两个或多个进程间通过管道,可以互相传递两个或多个进程间通过管道,可以互相传递信息,利用信息,利用readread和和writewrite系统调用函数来进行系统调用函数来进行读写操作。读写操作。6.2.1 管道管道pipe调用filedes是一个有两个成员的整形数组,用来保存管道的文件描述符,如果调用成功。filedes0将
6、用来从管道读取数据filedes1用来向管道写入数据。errno返回的错误说明:EMFILE:进程使用的文件描述符过多ENFILE:系统的文件表已满EFAULT:文件描述符无效#include int pipe(int filedes2);6.2.1 管道管道例程:pipe调用#include#include#include#include int main()int data_processed;int file_pipes2;const char some_data=“123”;char bufferBUFSIZ+1;memset(buffer,0,sizeof(buffer);if(pi
7、pe(file_pipes)=0)data_processed=write(file_pipes1,some_data,strlen(some_data);printf(“Wrote%d bytesn”,data_processed);data_processed=read(file_pipes0,buffer,BUFSIZ);printf(“Read%d bytes:%sn”,data_processed,buffer);exit(EXIT_SUCCESS);exit(EXIT_FAILURE);6.2.1 管道管道实验:pipe与fork父进程父进程pipes1管道管道pipes0子进程子
8、进程父进程父进程pipes0pipes1管道管道pipes1pipes0子进程子进程调用调用forkfork之后之后进行进行pipepipe通信通信6.2.1 管道管道例程:跨越fork调用的pipe#include#include#include#include int main()int data_processed;int file_pipes2;const char some_data=“123”;char bufferBUFFSIZ+1;pid_t fork_result;memset(buffer,0,sizeof(buffer);if(pipe(file_pipes)=0)for
9、k_result=fork();if(fork_result=-1)fprintf(stderr,“Fork failure”);exit(EXIT_FAILURE);if(fork_result=0)close(file_pipes1);data_processed=read(file_pipes0,buffer,BUFSIZ);printf(“Read%d bytes:%sn”,data_processed,buffer);exit(EXIT_SUCCESS);else close(file_pipes0);data_processed=write(file_pipes1,some_dat
10、a,strlen(some_data);printf(“Wrote%d bytesn”,data_processed);exit(EXIT_SUCCESS);6.2.2 命名管道命名管道FIFO功能提供进程间数据交换的一种机制提供进程间数据交换的一种机制区别与与pipe不同的是,命名管道不需要程序由一不同的是,命名管道不需要程序由一个共同的祖先进程启动个共同的祖先进程启动特点命名管道是一种特殊类型的文件,因为是文件,具备了和文件相同的特点,有文件名、所有者,访问权限等,但行为和管道相同6.2.2 命名管道命名管道FIFO命令行方式创建FIFO管道$mknod filename p$mkfifo
11、 filename6.2.2 命名管道命名管道FIFO程序中创建FIFO管道参数filename为指定管道文件的名字参数mode给出了FIFO的访问权限#include#include int mkfifo(const char*filename,mode_t mode);int mknod(const char*filename,mode_t mode|S_IFIFO,(dev_t)0);6.2.2 命名管道命名管道FIFO例程:创建命名管道FIFO#include#include#include#include int main()int res=mkfifo(“/tmp/my_fifo”
12、,0777);if(res=0)printf(“FIFO createdn”);exit(EXIT_SUCCESS);6.2.2 命名管道命名管道FIFO命令行访问FIFO总结:$cat /tmp/my_fifo与通过pipe调用创建管道不同,FIFO是以命名文件的形式存在,而不是打开的文件描述符,所以对它进行读写操作之前必须先打开它。FIFO也用open和close函数打开和关闭,但多了额外的功能6.2.2 命名管道命名管道FIFO例程:打开FIFO文件#include#include#include#include#define FIFO_NAME“/tmp/my_fifo”int mai
13、n()int res;int open_mode=0;open_mode=O_RDONLY|O_NONBLOCK;res=open(FIFO_NAME,open_mode);if(res=-1)perror(“Failed tp open FIFO file”);exit(1);printf(“FIFO file is openedn”);close(res);return 0;注意:打开管道文件,可以选择阻塞与非阻塞两种方式,用O_NONBLCOK表示.open(chonst char*path,O_RDONLY)-open调用将阻塞,除非有一个进程以写方式打开同一个FIFO,否则它不会返回
14、。open(chonstchar*path,O_RDONLY|O_NONBLOCK)-即使没有其他进程以写方式打开FIFO,这个open用也将成功并立即返回。open(chonst char*path,O_WRONLY)-open调用将阻塞,除非有一个进程以读方式打开同一个FIFO,否则它不会返回。open(chonstchar*path,O_WRONLY|O_NONBLOCK)-调 用总是立即返回,但如果没有其他进程以读方式打开FIFO,将返回一个错误-1并且FIFO也不会被打开。打开FIFO的主要限制是程序不能使用O_RDWR模型打开FIFO文件。6.2.2 命名管道命名管道FIFO例程:
15、FIFO读、写程序#include#include#include#include#include#define FIFO_NAME/tmp/my_fifo“int main()char buf100;int fd;int nread;fd=open(FIFO_NAME,O_RDONLY);if(fd=-1)perror(open);exit(1);memset(buf,0,sizeof(buf);if(nread=read(fd,buf,100)=-1)perror(read);exit(1);printf(read%s from FIFOn,buf);return 0;#include#i
16、nclude#include#include#include#define FIFO_NAME/tmp/my_fifo“int main()int fd;int nwrite;char buf100;fd=open(FIFO_NAME,O_WRONLY);if(fd=-1)perror(Failed to open FIFO file);exit(1);printf(FIFO file is openedn);strcpy(buf,helloworld);if(nwrite=write(fd,buf,100)=-1)perror(write);exit(1);close(fd);return
17、0;6.2.2 命名管道命名管道FIFO练习:使用fork创建2个进程,一个用于读FIFO操作,另一个写FIFO操作,读写数据的内容与大小不做要求。6.2.3 关于信号量关于信号量功能确保程序对某个特定的资源具有独占式的访确保程序对某个特定的资源具有独占式的访问的机制问的机制区别与线程信号量不一样与线程信号量不一样特点信号量是特殊的变量,只能取正整数并且只允许有两种操作:等待P和信号V6.2.3 关于信号量关于信号量信号量原理1-000-111-006.2.3 信号量信号量IPC机制关键值函数的作用是以path相关的信息为基础返回一个关键值,利用此关键值实现IPC同步和通信机制,也可使用IPC
18、_PRIVATE作为参数由系统自动生成。#include key_t ftok(const char*path,int id);6.2.3 信号量信号量ftok与IPC_PRIVATE的区别:ftok借助文件实现功能,常在不同的进程中使用,尤其是两个进程不是父子进程时,但因为是借助文件实现,一旦文件被删除后重新创建,获得的key就会发生变化,影响两个进程同步及通信机制的实现IPC_PRIVATE由系统自动生成键值,常用于父子进程中,如要运行非父子进程关系的两个进程间,需要传值才能让另外的进程获得IPC_PRIVATE的值6.2.3 信号量信号量semget函数:功能为创建信号量参数key:整数
19、,相关进程可以通过它访问一个信号量参数nsems:指定需要的信号量数量。它几乎总是取值1参数sem_flags:是一组标志,与open函数的标志相似,具体如下:IPC_CREAT:如果信号量集在系统内核中不存在,则创建信号量集。如果单独使IPC_CREAT,则semget()要么返回新创建的信号量集的标识符,要么返回系统中已经存在的同样的关键字值的信号量的标识符。IPC_EXCL:单独使用没有意义。如果IPC_EXCL和IPC_CREAT一同使用,则要么返回新创建的信号量集的标识符,要么返回-1。#include int semget(key_t key,int nsems,int sem_f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 系统 编程 第六 进程 通信
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内