linux进程间通信.ppt
《linux进程间通信.ppt》由会员分享,可在线阅读,更多相关《linux进程间通信.ppt(53页珍藏版)》请在三一办公上搜索。
1、linux进程间通信,进程间通信概述管道通信信号共享内存消息队列,1、进程间通信概述,进程间通信有如下一些目的:数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及
2、时知道它的状态改变。,linux进程间通信(IPC)由以下几部分发展而来:早期UNIX进程间通信、基于System V进程间通信、基于Socket进程间通信和POSIX进程间通信。UNIX进程间通信方式包括:管道、FIFO、信号。System V进程间通信方式包括:System V消息队列、System V信号灯、System V共享内存。POSIX进程间通信包括:posix消息队列、posix信号灯、posix共享内存。,现在linux使用的进程间通信方式:(1)管道(pipe)和有名管道(FIFO)(2)信号(signal)(3)消息队列(4)共享内存(5)信号量(6)套接字(socket
3、),2、管道通信,普通的Linux shell都允许重定向,而重定向使用的就是管道。例如:ps|grep vsftpd管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。管道主要用于不同进程间通信。,2.1 管道创建与关闭,创建一个简单的管道,可以使用系统
4、调用pipe()。它接受一个参数,也就是一个包括两个整数的数组。如果系统调用成功,此数组将包括管道使用的两个文件描述符。创建一个管道之后,一般情况下进程将产生一个新的进程。系统调用:pipe();原型:int pipe(int fd2);返回值:如果系统调用成功,返回0。如果系统调用失败返回-1:errno=EMFILE(没有空闲的文件描述符)EMFILE(系统文件表已满)EFAULT(fd数组无效),注意:fd0 用于读取管道,fd1 用于写入管道。,图1 linux中管道与文件描述符的关系,#include#include#include#include int main()int pip
5、e_fd2;if(pipe(pipe_fd)0)printf(pipe create errorn);return-1;else printf(pipe create successn);close(pipe_fd0);close(pipe_fd1);,2.2 管道读写,管道主要用于不同进程间通信。实际上,通常先创建一个管道,再通过fork函数创建一个子进程。,图2 父子进程管道的文件描述符对应关系,子进程写入和父进程读的命名管道:,图 3 关闭父进程fd1 和 子进程0,2.3 管道读写注意事项,可以通过打开两个管道来创建一个双向的管道。但需要在子进程中正确地设置文件描述符。必须在系统调用f
6、ork()中调用pipe(),否则子进程将不会继承文件描述符。当使用半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。因为管道存在于系统内核之中,所以任何不在创建管道的进程的祖先进程之中的进程都将无法寻址它。而在命名管道中却不是这样。,2.4 标准流管道,与linux中文件操作有文件流的标准I/O一样,管道的操作也支持基于文件流的模式。接口函数如下库函数:popen();原型:FILE*popen(char*command,char*type);返回值:如果成功,返回一个新的文件流。如果无法创建进程或者管道,返回NULL。管道中数据流的方向是由第二个参数type控制的。此参数可以是r或
7、者w,分别代表读或写。但不能同时为读和写。在Linux系统下,管道将会以参数type中第一个字符代表的方式打开。所以,如果你在参数type中写入rw,管道将会以读的方式打开。,使用popen()创建的管道必须使用pclose()关闭。其实,popen/pclose和标准文件输入/输出流中的fopen()/fclose()十分相似。库函数:pclose();原型:int pclose(FILE*stream);返回值:返回调用状态。,#include#include#include#include#define BUFSIZE 1024int main()FILE*fp;char*cmd=ps-
8、ef;char bufBUFSIZE;bufBUFSIZE=0;if(fp=popen(cmd,r)=NULL)perror(popen);while(fgets(buf,BUFSIZE,fp)!=NULL)printf(%s,buf);pclose(fp);exit(0);,命名管道(FIFO),基本概念命名管道和一般的管道基本相同,但也有一些显著的不同:命名管道是在文件系统中作为一个特殊的设备文件而存在的。不同祖先的进程之间可以通过管道共享数据。当共享管道的进程执行完所有的I/O操作以后,命名管道将继续保存在文件系统中以便以后使用。管道只能由相关进程使用,它们共同的祖先进程创建了管道。但是
9、,通过FIFO,不相关的进程也能交换数据。,命名管道创建与操作,名管道创建#include#include int mkfifo(const char*pathname,mode_t mode);返回:若成功则为0,若出错则为-1一旦已经用mkfifo创建了一个FIFO,就可用open打开它。确实,一般的文件I/O函数(close、read、write、unlink等)都可用于FIFO。,当打开一个FIFO时,非阻塞标志(O_NONBLOCK)产生下列影响:(1)在一般情况中(没有说明O_NONBLOCK),只读打开要阻塞到某个其他进程为写打开此FIFO。类似,为写而打开一个FIFO要阻塞到某
10、个其他进程为读而打开它。(2)如果指定了O_NONBLOCK,则只读打开立即返回。但是,如果没有进程已经为读而打开一个FIFO,那么只写打开将出错返回,其errno是ENXIO。类似于管道,若写一个尚无进程为读而打开的FIFO,则产生信号SIGPIPE。若某个FIFO的最后一个写进程关闭了该FIFO,则将为该FIFO的读进程产生一个文件结束标志。,FIFO相关出错信息:EACCES(无存取权限)EEXIST(指定文件不存在)ENAMETOOLONG(路径名太长)ENOENT(包含的目录不存在)ENOSPC(文件系统剩余空间不足)ENOTDIR(文件路径无效)EROFS(指定的文件存在于只读文件
11、系统中),信号通信,信号概述信号是软件中断。信号(signal)机制是Unix系统中最为古老的进程之间的通信机制。它用于在一个或多个进程之间传递异步信号。很多条件可以产生一个信号。当用户按某些终端键时,产生信号。在终端上按DELETE键通常产生中断信号(SIGINT)。这是停止一个已失去控制程序的方法。(第11章将说明此信号可被映射为终端上的任一字符。)硬件异常产生信号:除数为0、无效的存储访问等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信号。例如,对执行一个无效存储访问的进程产生一个SIGSEGV。,进程用kill(2)函数可将信号发送给另一
12、个进程或进程组。自然,有些限制:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。用户可用kill(1)命令将信号发送给其他进程。此程序是kill函数的界面。常用此命令终止一个失控的后台进程。当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号。这里并不是指硬件产生条件(如被0除),而是软件条件。例如SIGURG(在网络连接上传来非规定波特率的数据)、SIGPIPE(在管道的读进程已终止后一个进程写此管道),以及SIGALRM(进程所设置的闹钟时间已经超时)。,内核为进程生产信号,来响应不同的事件,这些事件就是信号源。主要的信号源如下:异常:进程运行过程
13、中出现异常;其它进程:一个进程可以向另一个或一组进程发送信号;终端中断:Ctrl-C,Ctrl-等;作业控制:前台、后台进程的管理;分配额:CPU超时或文件大小突破限制;通知:通知进程某事件发生,如I/O就绪等;报警:计时器到期。,Linux 中的信号:,1)SIGHUP 2)SIGINT 3)SIGQUIT 4)SIGILL5)SIGTRAP 6)SIGIOT 7)SIGBUS 8)SIGFPE9)SIGKILL 10)SIGUSR1 11)SIGSEGV12)SIGUSR213)SIGPIPE 14)SIGALRM15)SIGTERM17)SIGCHLD18)SIGCONT 19)SIGS
14、TOP20)SIGTSTP21)SIGTTIN22)SIGTTOU 23)SIGURG24)SIGXCPU25)SIGXFSZ26)SIGVTALRM 27)SIGPROF 28)SIGWINCH 29)SIGIO30)SIGPWR,下面是几个常见的信号。SIGHUP:从终端上发出的挂起信号;SIGINT:来自键盘的中断信号(Ctrl-C);SIGQUIT:来自键盘的退出信号(Ctrl-);SIGFPE:浮点异常信号(例如浮点运算溢出);SIGKILL:该信号结束接收信号的进程;SIGALRM:进程的定时器到期时,发送该信号;SIGTERM:中止信号;kill的默认发出信号;SIGCHLD:标
15、识子进程停止或结束的信号;SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号,可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作。(1)忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是:SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以0),则进程的行为是未定义的。(2)捕捉信号。为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。如果捕捉到SIGCHLD信
16、号,则表示子进程已经终止,所以此信号的捕捉函数可以调用waitpid以取得该子进程的进程ID以及它的终止状态。(3)执行系统默认动作。对大多数信号的系统默认动作是终止该进程。,每一个信号都有一个缺省动作,它是当进程没有给这个信号指定处理程序时,内核对信号的处理。有5种缺省的动作:异常终止(abort):在进程的当前目录下,把进程的地址空间内容、寄存器内容保存到一个叫做core的文件中,而后终止进程。退出(exit):不产生core文件,直接终止进程。忽略(ignore):忽略该信号。停止(stop):挂起该进程。继续(continue):如果进程被挂起,则恢复进程的运行。否则,忽略信号。,3.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 进程 通信

链接地址:https://www.31ppt.com/p-5438164.html