linux进程之间的通信.ppt
![资源得分’ 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进程之间的通信.ppt》由会员分享,可在线阅读,更多相关《linux进程之间的通信.ppt(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、进程之间的通信进程之间的通信2023/1/28Linux内核源代码导读内核源代码导读2v1、实验目的为了理解和掌握UNIX和Linux进程通信系统调用的功能,这里给出了进程通信实现机制中使用的系统调用命令的格式和如何利用系统调用命令进行进程通信编程,以便通过学习,提高学生对进程通信系统调用的编程能力。实验目的和要求实验目的和要求2023/1/28Linux内核源代码导读内核源代码导读3v2、实验要求书写实验报告,应该包括如下内容:(1)实验题目。(2)程序中使用的数据结构及主要符号说明。(3)程序流程图和带有注释的源程序。(4)执行程序名,并打印程序运行时的初值和运行结果。(5)通过实验后的收
2、获与体会及对实验的改进意见和见解。实验目的和要求实验目的和要求2023/1/28Linux内核源代码导读内核源代码导读4通过使用管道实现两个或多个进程之间的通信。所谓管道,就是将一个进程的标准输出与另一个进程的标准输入联系在一起,进行通信的一种方法。同组进程之间可用无名和有名管道进行通信,而不同组进程之间只能通过有名管道进行通信。管道通信是进程之间使用文件系统中的文件,按先进先出方式进行同步传输数据的方法。例如,管道在Linux命令行中的应用如下:$ls|sort|head-5进程之间管道通信机制进程之间管道通信机制2023/1/28Linux内核源代码导读内核源代码导读5该命令行实现将当前目
3、录的文件列表、排序,且只输出前5行。一、无名管道通信v1、创建无名管道的pipe()函数pipe()函数成功时,内核将返回打开文件的两个描述字。一个作为管道的输入端,另一个作为管道的输出端。(1)pipe()函数调用格式如下:#includeint pipe(int fdes2);进程之间管道通信机制进程之间管道通信机制2023/1/28Linux内核源代码导读内核源代码导读6参数:fdes2数组存放返回的两个文件描述符。返回值:正确返回0,错误返回-1。使用无名管道通信时,是使用临时文件的方式实现进程之间的批量数据传输。若通信双方不是父子关系,不能直接建立通信联系。必须由父进程先创建一个管道
4、,再创建需要通信的两个子进程,两者是通过复制父进程映像使两者建立联系的。(2)无名管道pipe()的使用示例使用无名管道pipe(),父子进程之间的通信的源程序如下:进程之间管道通信机制进程之间管道通信机制2023/1/28Linux内核源代码导读内核源代码导读7/*pipe.c源程序*/#include#include#include#includeconst char parent=“A message to pipes communicaton.n”main()int pid,w_n,r_n,chan12;char bufBUFSIZE;pipe(chan1);pid=fork();if
5、(pid0)close(chan10);/*父进程关闭读通道*/w_n=write(chan11,parent,strlen(parent);close(chan11);printf(“parent process waits the child to terminate.n”);wait(0);printf(“parent process terminates.n”);else close(chan11);/*子进程关闭写通道*/r_n=read(chan10,buf,BUFSIZE);printf(“The message read by child process is:%s.reads
6、 bytes is%d.n”,buf,r_n);close(chan10);printf(“child process terminates.n”);进程之间管道通信机制进程之间管道通信机制2023/1/28Linux内核源代码导读内核源代码导读9当父进程首先被调用时,该程序运行结果是:parent process sends 46 bytes message to child.parent process waits child to terminate.然后父进程阻塞等待子进程终止。系统调用子进程运行,输出如下信息:The message read by child process is:
7、A message to pipes communication.Reads bytes is 46.child process terminates.然后父进程被唤醒调度运行,输出如下信息后程序退出:parent process terminates.进程之间管道通信机制进程之间管道通信机制2023/1/28Linux内核源代码导读内核源代码导读10v本例中,父进程使用pipe(chan1)系统调用打开一个无名管道,之后创建一个子进程,子进程复制父进程的打开文件表。为了正确通信,父进程关闭读通道close(chan10),子进程关闭写通道close(chan11)。父进程向管道写,子进程从管
8、道读。完成一次通信后,父子进程分别关闭自己的写/读通道,管道文件消失。思考:试分析该程序运行可能产生的其他结果。进程之间管道通信机制进程之间管道通信机制2023/1/28Linux内核源代码导读内核源代码导读11v2、popen()和pclose()函数系统提供了创建管道的简单函数popen()和pclose()。当使用这两个函数对管道操作时,所有复杂的操作,如创建管道、fork()子进程、关闭管道的无用端,执行一个shell命令,等待命令执行完成后返回等操作都在系统内部自动完成。(1)popen()和pclose()函数的调用格式如下:#includeFILE popen(const cha
9、r cmdstring,const char*open_mode);int pclose(FILE*fp);其中,cmdstring是shell要求的包括参数和选项的一个完整的命令行。open_mode指出管道访问方式:读(“r”)或写(“w”)。进程之间管道通信机制进程之间管道通信机制2023/1/28Linux内核源代码导读内核源代码导读12返回值:popen()函数正确返回文件结构的指针,错误返回空指针NULL;pclose()函数正确返回cmdstring结束时的退出状态,错误返回-1。popen()函数先执行fork()函数创建一个子进程,然后调用exec()函数执行命令cmdstr
10、ing,并且返回一个标准I/O文件指针。若open_mode为“r”,那么管道的输入端与命令行cmdstring的标准输出端相连,即父进程以“r”方式打开管道并成功获得管道文件的指针,用于从管道读。被创建的子进程执行cmdstring命令行,向管道输出,具体可见下图1所示。进程之间管道通信机制进程之间管道通信机制2023/1/28Linux内核源代码导读内核源代码导读13若open_mode为“w”,那么管道的输出端与命令行cmdstring的标准输入端相连,即父进程以“w”方式打开管道并成功地获得管道文件的指针,用于向管道写,被创建的子进程从管道读入,以完成命令行的执行,如图2所示。进程之间
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 进程 之间 通信
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内