LINUX进程间通信
linux中ipc机制

linux中ipc机制
Linux IPC(Inter-Process Communication)机制
1、什么是IPC
Inter-Process Communication,即进程间通信,是操作系统中提供的一种机制,它允许多个进程在没有同时运行的情况下,能够进行通信、协作和共享数据。
Linux提供了五种IPC机制:信号量、管道、消息队列、共享内存、Socket。
2、信号量
信号量是用于同步的一种技术,它主要用于解决两个以上进程同时访问同一资源的问题,即资源竞争问题。
信号量是一个计数锁,可以用它来保护共享资源,它可以阻止多个进程同时进入临界区,以保护临界资源。
3、管道(pipe)
管道的创建是由内核完成的,管道是一种半双工的通信方式,它具有一端数据输入,另一端负责数据输出。
管道只能用于具有公共祖先的两个进程之间的通信。
4、消息队列
消息队列是一种异步的IPC机制,它允许多个进程之间在内核中传递消息。
消息队列在缓存中存储消息,如果消息队列满了,则写入消息失败,如果消息队列空了,则读取消息失败。
5、共享内存
共享内存是一种实时的IPC机制,它比消息队列的通信速度快得
多,因为它不需要内核处理。
共享内存可用于多个进程之间的共享数据,这样多个进程可以访问该共享内存区域的数据,从而减少数据传输时间。
6、 Socket
Socket是一种进程间通信技术,它允许两个或多个进程之间通过网络进行通信。
Socket也可以用作本地进程间的通信,它在多个不同的操作系统中可以使用,甚至可以在不同操作系统之间通信。
详解linux进程间通信-消息队列

详解linux进程间通信-消息队列前⾔:前⾯讨论了信号、管道的进程间通信⽅式,接下来将讨论消息队列。
⼀、系统V IPC 三种系统V IPC:消息队列、信号量以及共享内存(共享存储器)之间有很多相似之处。
每个内核中的 I P C结构(消息队列、信号量或共享存储段)都⽤⼀个⾮负整数的标识符( i d e n t i f i e r )加以引⽤。
⽆论何时创建I P C结构(调⽤m s g g e t、 s e m g e t或s h m g e t) ,都应指定⼀个关键字(k e y),关键字的数据类型由系统规定为 k e y _ t,通常在头⽂件< s y s / t y p e s . h >中被规定为长整型。
关键字由内核变换成标识符。
以上简单介绍了IPC,对接下来介绍的消息队列、信号量和共享内存有助于理解。
⼆、消息队列 1、简介 消息队列是消息的链接表 ,存放在内核中并由消息队列标识符标识。
我们将称消息队列为“队列”,其标识符为“队列 I D”。
m s g g e t⽤于创建⼀个新队列或打开⼀个现存的队列。
m s g s n d⽤于将新消息添加到队列尾端。
每个消息包含⼀个正长整型类型字段,⼀个⾮负长度以及实际数据字节(对应于长度),所有这些都在将消息添加到队列时,传送给 m s g s n d。
m s g r c v⽤于从队列中取消息。
我们并不⼀定要以先进先出次序取消息,也可以按消息的类型字段取消息。
2、函数介绍ftok函数#include <sys/types.h>#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);//“/home/linux” , 'a'功能:⽣成⼀个key(键值)msgget函数#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>int msgget(key_t key, int msgflg);功能:创建或取得⼀个消息队列对象返回:消息队列对象的id 同⼀个key得到同⼀个对象格式:msgget(key,flag|mode);flag:可以是0或者IPC_CREAT(不存在就创建)mode:同⽂件权限⼀样msgsnd函数int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);功能:将msgp消息写⼊标识为msgid的消息队列msgp:struct msgbuf {long mtype; /* message type, must be > 0 */消息的类型必须>0char mtext[1]; /* message data */长度随意};msgsz:要发送的消息的⼤⼩不包括消息的类型占⽤的4个字节msgflg:如果是0 当消息队列为满 msgsnd会阻塞如果是IPC_NOWAIT 当消息队列为满时不阻塞⽴即返回返回值:成功返回id 失败返回-1msgrcv函数ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);功能:从标识符为msgid的消息队列⾥接收⼀个指定类型的消息并存储于msgp中读取后把消息从消息队列中删除msgtyp:为 0 表⽰⽆论什么类型都可以接收msgp:存放消息的结构体msgsz:要接收的消息的⼤⼩不包含消息类型占⽤的4字节msgflg:如果是0 标识如果没有指定类型的消息就⼀直等待如果是IPC_NOWAIT 则表⽰不等待msgctl函数int msgctl(int msqid, int cmd, struct msqid_ds *buf);msgctl(msgid,IPC_RMID,NULL);//删除消息队列对象 程序2-2将简单演⽰消息队列: --- snd.c ---#include "my.h"typedef struct{long type;char name[20];int age;}Msg;int main(){key_t key = ftok("/home/liudw",'6');printf("key:%x\n",key);int msgid = msgget(key,IPC_CREAT|O_WRONLY|0777);if(msgid<0){perror("msgget error!");exit(-1);}Msg m;puts("please input your type name age:");scanf("%ld%s%d",&m.type,,&m.age);msgsnd(msgid,&m,sizeof(m)-sizeof(m.type),0);return0;} --- rcv.c ---#include "my.h"typedef struct{long type;char name[20];int age;}Msg;int main(){key_t key = ftok("/home/liudw",'6');printf("key:%x\n",key);int msgid = msgget(key,O_RDONLY);if(msgid<0){perror("msgget error!");exit(-1);}Msg rcv;long type;puts("please input type you want!");scanf("%ld",&type);msgrcv(msgid,&rcv,sizeof(rcv)-sizeof(type),type,0);printf("rcv--name:%s age:%d\n",,rcv.age);msgctl(msgid,IPC_RMID,NULL);return0;} 运⾏演⽰: 三、详解ftok函数 ftok根据路径名,提取⽂件信息,再根据这些⽂件信息及project ID合成key,该路径可以随便设置。
linux dbus协议标准

linux dbus协议标准
DBus(D-Bus)是Linux系统下的一种进程间通信协议,它允许应用程序在系统级别进行通信。
DBus协议是一种基于消息传递的协议,类似于Unix中的Unix Domain Sockets。
DBus协议定义了一组标准的消息格式和消息传递规则,以确保不同应用程序之间的通信能够正常进行。
DBus协议标准包括以下几个方面:
1. 消息格式:DBus消息由一系列字节组成,其中包括消息类型、消息ID、目标地址、数据长度和数据内容等信息。
DBus消息分为三种类型:消息、方法调用和方法响应。
2. 消息传递规则:DBus协议规定了消息传递的规则,包括消息的发送和接收顺序、消息的传递方式、消息的传递超时时间等。
DBus协议还规定了一些特殊情况下的消息传递规则,如消息的重复发送和接收等。
3. 地址和对象路径:DBus协议中的消息是通过地址和对象路径来指
定目标应用程序或对象的。
DBus地址分为两种类型:名称和ID。
DBus 对象路径是指应用程序或对象在系统中的路径,通常由多个部分组成。
4. 认证和授权:DBus协议中的应用程序可以通过认证和授权机制来保护通信的安全性。
DBus协议提供了一些认证和授权机制,如基于密码的认证和基于权限的授权等。
5. 错误处理:DBus协议中的应用程序可以通过错误处理机制来处理通信中的错误。
DBus协议提供了一些错误处理机制,如消息丢失和消息重复等。
总之,DBus协议是Linux系统下的一种重要的进程间通信协议,它定义了一组标准的消息格式和消息传递规则,以确保不同应用程序之间的通信能够正常进行。
L-IPC

25
有名管道的创建可以使用函数 mkfifo(),该函 数类似文件中的open()操作,可以指定管道的路 径和打开的模式。 在创建管道成功之后,就可以使用open、read、 write这些函数了。与普通文件的开发设置一样, 对于为读而打开的管道可在open中设置 O_RDONLY,对于为写而打开的管道可在open中设 置 O_WRONLY,在这里与普通文件不同的是阻塞 问题。由于普通文件的读写时不会出现阻塞问题, 而在管道的读写中却有阻塞的可能,这里的非阻 塞标志可以在open函数中设定为 O_NONBLOCK。
26
对于读进程 若该管道是阻塞打开,且当前 FIFO 内没有数 据,则对读进程而言将一直阻塞直到有数据写 入。 若该管道是非阻塞打开,则不论 FIFO 内是否 有数据,读进程都会立即执行读操作。 对于写进程 若该管道是阻塞打开,则写进程而言将一直阻 塞直到有读进程读出数据。 若该管道是非阻塞打开,则当前 FIFO 内没有 读操作,写进程都会立即执行读操作。
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGIOT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 在Alpha AXP Linux系统上,信号的编号有些不同。
linux进程间通讯的几种方式的特点和优缺点

linux进程间通讯的几种方式的特点和优缺点Linux进程间通讯的方式有多种,其优缺点也不尽相同,接受者依赖发送者之时间特性可承载其优端。
下面就讨论几种典型的方式:1、管道(Pipe):是比较传统的方式,管道允许信息在不同进程之间传送,由一端输入,另一端输出,提供全双工式劝劝信息传送,除此之外,伺服端也可以将其服务转换为管道,例如说Web服务程序。
管道的优点:简单易懂、可靠、灵活、容易管理,可以控制发送端和接收端的信息流量。
管道的缺点:线程之间的信息量不能太大,也只能在本机上使用,不能通过网络发送信息。
2、消息队列(Message queue):消息队列主要应用在大型网络中,支持多种消息队列协议,广泛用于在远程机器上的进程间的交互、管理进程间的数据和同步问题。
消息队列的优点:主要优点是这种方式可以将消息发送给接收端,然后接收端可以从距离发送端远的地方网络上接收消息,通过消息队列可以较好的管理和控制进程间的数据流量和同步问题。
消息队列的缺点:缺点是消息队里的管理复杂,并且有一定的延迟,而且它使用时应避免共享内存,对于多处理器和跨网络环境, TCP 传输数据时也比不上消息队列的传输效率高。
3、共享内存(Share Memory):是最高效的进程间通信方式,也是最常用的,它使进程在通信时共享一个存储地址,双方都可以以该存储地址作为参数进行读写操作。
共享内存的优点:实现高性能,数据同步操作快、数据可以高速传输,可以解决多处理器以及跨网络环境的通信。
共享内存的缺点:由于进程间直接使用物理内存,没有任何保护,所需要使用较复杂的同步机制来完成数据的可靠传输。
总的来说,每种进程通讯方式都有各自的优缺点,不同的系统需求也许需要多种方案的相互配合才能有效的处理系统间通信的问题。
系统设计者应根据具体系统需求,选择合适的进程通信方式来实现更好的进程间通信。
进程通讯管理实验报告(3篇)

第1篇一、实验目的1. 理解进程通信的概念和原理;2. 掌握进程通信的常用机制和方法;3. 能够使用进程通信机制实现进程间的数据交换和同步;4. 增强对操作系统进程管理模块的理解。
二、实验环境1. 操作系统:Linux2. 编程语言:C3. 开发环境:GCC三、实验内容1. 进程间通信的管道机制2. 进程间通信的信号量机制3. 进程间通信的共享内存机制4. 进程间通信的消息队列机制四、实验步骤1. 管道机制(1)创建管道:使用pipe()函数创建管道,将管道文件描述符存储在两个变量中,分别用于读和写。
(2)创建进程:使用fork()函数创建子进程,实现父子进程间的通信。
(3)管道读写:在父进程中,使用read()函数读取子进程写入的数据;在子进程中,使用write()函数将数据写入管道。
(4)关闭管道:在管道读写结束后,关闭对应的管道文件描述符。
2. 信号量机制(1)创建信号量:使用sem_open()函数创建信号量,并初始化为1。
(2)获取信号量:使用sem_wait()函数获取信号量,实现进程同步。
(3)释放信号量:使用sem_post()函数释放信号量,实现进程同步。
(4)关闭信号量:使用sem_close()函数关闭信号量。
3. 共享内存机制(1)创建共享内存:使用mmap()函数创建共享内存区域,并初始化数据。
(2)映射共享内存:在父进程和子进程中,使用mmap()函数映射共享内存区域。
(3)读写共享内存:在父进程和子进程中,通过指针访问共享内存区域,实现数据交换。
(4)解除映射:在管道读写结束后,使用munmap()函数解除映射。
4. 消息队列机制(1)创建消息队列:使用msgget()函数创建消息队列,并初始化消息队列属性。
(2)发送消息:使用msgsnd()函数向消息队列发送消息。
(3)接收消息:使用msgrcv()函数从消息队列接收消息。
(4)删除消息队列:使用msgctl()函数删除消息队列。
简述linux中进程间各种通信方式特点

简述linux中进程间各种通信方式特点Linux中进程间通信方式有多种,包括管道,命名管道,消息队列,信号量,共享内存和套接字。
每种通信方式都有自己的特点和适用场景。
一、管道1. 特点:- 管道是最简单的进程间通信方式之一,只能用于具有父子关系的进程间通信。
- 管道是一个单向通道,数据只能在一个方向上流动。
- 管道的容量有限,在写度满之前,读进程阻塞;在读度空之前,写进程阻塞。
2. 使用场景:- 父子进程之间需要进行简单的数据传输。
二、命名管道1. 特点:- 命名管道是一种特殊类型的文件,可以实现不相关进程的通信。
- 命名管道是半双工的,只能在一个方向上传输数据。
- 命名管道是顺序读写的,进程可以按照顺序读取其中的数据。
2. 使用场景:- 不相关的进程需要进行数据传输。
- 需要按照顺序进行传输的场景。
三、消息队列1. 特点:- 消息队列是一组消息的链表,具有特定的格式和标识符。
- 消息队列独立于发送和接收进程的生命周期,可以实现不相关进程间的通信。
- 消息队列可以根据优先级进行消息的传输。
2. 使用场景:- 需要实现进程间相对复杂的数据传输。
- 数据传输具有优先级。
四、信号量1. 特点:- 信号量是一个计数器,用于实现多个进程之间的互斥和同步。
- 信号量有一个整数值,只能通过定义的操作进行访问。
- 信号量可以用于控制临界区的访问次数。
2. 使用场景:- 多个进程需要共享公共资源。
- 需要进行互斥和同步操作。
五、共享内存1. 特点:- 共享内存是一块可以被多个进程共同访问的内存区域。
- 共享内存是最快的进程间通信方式,因为数据不需要在进程之间拷贝。
- 共享内存需要通过同步机制(如信号量)进行互斥访问。
2. 使用场景:- 需要高效地进行大量数据传输。
- 数据读写频繁,需要最小化数据拷贝的开销。
六、套接字1. 特点:- 套接字是一种网络编程中常用的进程间通信方式。
- 套接字支持不同主机上的进程进行通信。
实验六 进程间通信

3.2 实验内容(2)
进程的管道通信
编写程序,实现进程的管道通信:父进程使用系统调用pipe() 建立一个管道。创建两个子进程p1和p2,分别向管道个发一 条信息后结束: Child 1 is sending a message to parent. Child 2 is sending a message to parent. 父进程从管道中分别接收两个子进程发来的消息并显示在屏 幕上,然后父进程结束。要求父进程先接受子进程p1发来的 消息,然后再接收子进程p2发来的消息。
实验六 进程间通信
预备知识
Linux进程间通信 进程软中断通信
管道和消息队列
实验指导
软中断通信函数
管道通信的使用
消息队列的应用
实验目的、内容
2.1 软中断通信函数(1)
向一个进程或一组进程发送一个信号: int kill(pid, sig)
pid>0时,核心将信号发送给进程pid
理程序
2.1 软中断通信函数(2)
pid_t wait(int * status)
暂时停止目前进程的执行,直到有信号来或子进程结束
pid_t waitpid(pid_t pid, int * status, int options)
pid的取值 pid=-1时,等待任何一个子进程退出,相当于wait() pid=0时,等待进程组ID与目前进程相同的任何子进程 pid<-1时,等待进程组ID为pid绝对值的任何子进程 options有两个常数参数,可使用或运算,不用时设为0 WNOHANG:即使没有任何子进程退出,它也会立即返回 WUNTRACED:子进程进入暂停执行状态并马上返回,但结束 状态不予以理会
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
父子进程之间的管道通信(1)
用pipe()函数创建的管道两端处于一个进程中,由于管道 是主要用于在不同进程间通信的,因此这在实际应用中没 有太大意义。实际上,通常先是创建一个管道,再通过 fork()函数创建一子进程,该子进程会继承父进程所创建 的管道 。
父进程 fd[0] fd[1] 子进程 fd[0] fd[1]
信号发送与捕捉(2)
示例
阅读并运行示例8-3-2-1。
信号发送与捕捉(3)
alarm()也称为闹钟函数,它可以在进程中设置一个定时器, 当定时器指定的时间到时,它就向进程发送SIGALARM信 号。要注意的是,一个进程只能有一个闹钟时间,如果在 调用alarm()之前已设置过闹钟时间,则任何以前的闹钟时 间都被新值所代替。 pause()函数是用于将调用进程挂起直至捕捉到信号为止。 这个函数很常用,通常可以用于判断信号是否已到。
进程间通信方式的种类(2)
(4)共享内存(Shared memory):可以说这是最 有用的进程间通信方式。它使得多个进程可以访 问同一块内存空间,不同进程可以及时看到对方 进程中对共享内存中数据的更新。这种通信方式 需要依靠某种同步机制,如互斥锁和信号量等。 (5)信号量(Semaphore):主要作为进程之间以 及同一进程的不同线程之间的同步和互斥手段。 (6)套接字(Socket):这是一种更为一般的进程 间通信机制,它可用于网络中不同机器之间的进 程间通信,应用非常广泛。
8.2 管道
管道概述
无名管道是Linux中进程间通信的一种方式。 • 它只能用于具有亲缘关系的进程之间的通信(也就是父 子进程或者兄弟进程之间)。 • 它是一个半双工的通信模式,具有固定的读端和写端。 • 管道也可以看成是一种特殊的文件,对于它的读写也可以 使用普通的read()和write()等函数。但是它不是普通的文 件,并不属于其他任何文件系统,并且只存在于内核的内 存空间中。
标准流管道 (3)
示例
阅读并运行示例8-2-3
有名管道 (1)
前面介绍的管道是无名管道,它只能用于具有亲缘关系的 进程之间,这就大大地限制了管道的使用。有名管道的出 现突破了这种限制,它可以使互不相关的两个进程实现彼 此通信。该管道可以通过路径名来指出,并且在文件系统 中是可见的。在建立了管道之后,两个进程就可以把它当 作普通文件一样进行读写操作,使用非常方便。不过值得 注意的是,FIFO是严格地遵循先进先出规则的,对管道及 FIFO的读总是从开始处返回数据,对它们的写则把数据添 加到末尾,它们不支持如lseek()等文件定位操作。 有名管道的创建可以使用函数mkfifo(),该函数类似文件中 的open()操作,可以指定管道的路径和打开的模式。
示例
阅读并运行示例8-2-3
8.3 信号
信号概述(1)
信号是UNIX中所使用的进程通信的一种最古老的方法。 它是在软件层次上对中断机制的一种模拟,是一种异步通 信方式。信号可以直接进行用户空间进程和内核进程之间 的交互,内核进程也可以利用它来通知用户空间进程发生 了哪些系统事件。它可以在任何时候发给某一进程,而无 需知道该进程的状态。如果该进程当前并未处于执行态, 则该信号就由内核保存起来,直到该进程恢复执行再传递 给它为止;如果一个信号被进程设置为阻塞,则该信号的 传递被延迟,直到其阻塞被取消时才被传递给进程。 不可靠信号和可靠信号
标准流管道 (2)
标准流管道的使用可以大大减少代码的编写量,但同时也 有一些不利之处,例如,它不如前面管道创建的函数那样 灵活多样,并且用popen()创建的管道必须使用标准I/O函数 进行操作,但不能使用前面的read()、write()一类不带缓冲 的I/O函数。 与之相对应,关闭用popen()创建的流管道必须使用函数 pclose()来关闭该管道流。该函数关闭标准I/O流,并等待 命令执行结束。
有名管道 (2)
在创建管道成功之后,就可以使用open()、read()和write() 这些函数了。与普通文件的开发设置一样,对于为读而打 开的管道可在open()中设置O_RDONLY,对于为写而打开 的管道可在open()中设置O_WRONLY,在这里与普通文件 不同的是阻塞问题。
信号概述(3)
用户进程对信号的响应可以有3种方式。 • 忽略信号,即对信号不做任何处理,但是有两个信号不 能忽略,即SIGKILL及SIGSTOP。 • 捕捉信号,定义信号处理函数,当信号发生时,执行相 应的自定义处理函数。 • 执行缺省操作,Linux对每种信号都规定了默认操作。
有名管道 (3)
由于普通文件的读写时不会出现阻塞问题,而在管道的读 写中却有阻塞的可能,这里的非阻塞标志可以在open()函 数中设定为O_NONBLOCK。 对于读进程 • 若该管道是阻塞打开,且当前FIFO内没有数据,则对读 进程而言将一直阻塞到有数据写入。 • 若该管道是非阻塞打开,则不论FIFO内是否有数据,读 进程都会立即执行读操作。即如果FIFO内没有数据,则 读函数将立刻返回0。 对于写进程 • 若该管道是阻塞打开,则写操作将一直阻塞到数据可以 被写入。 • 若该管道是非阻塞打开而不能写入全部数据,则读操作 进行部分写入或者调用失败。
பைடு நூலகம்
信号概述(2)
一个不可靠信号的处理过程是这样的:如果发现该信号已 经在进程中注册,那么就忽略该信号。因此,若前一个信 号还未注销又产生了相同的信号就会产生信号丢失。而当 可靠信号发送给一个进程时,不管该信号是否已经在进程 中注册,都会被再注册一次,因此信号就不会丢失。所有 可靠信号都支持排队,而所有不可靠信号都不支持排队。 一个完整的信号生命周期可以分为3个重要阶段,这3个阶 段由4个重要事件来刻画的:信号产生、信号在进程中注册、 信号在进程中注销、执行信号处理函数
内核 管道
示例
阅读并运行示例8-2-2。
标准流管道 (1)
与Linux的文件操作中有基于文件流的标准I/O操作一样, 管道的操作也支持基于文件流的模式。这种基于文件流的 管道主要是用来创建一个连接到另一个进程的管道,这里 的“另一个进程”也就是一个可以进行一定操作的可执行 文件,例如,用户执行“ls -l”或者自己编写的程序“./pipe” 等。由于这一类操作很常用,因此标准流管道就将一系列 的创建过程合并到一个函数popen()中完成。它所完成的工 作有以下几步。 • 创建一个管道。 • fork()一个子进程。 • 在父子进程中关闭不需要的文件描述符。 • 执行exec函数族调用。 • 执行函数中所指定的命令。
sa_handler是一个函数指针,指定 信号处理函数,这里除可以是用户 自定义的处理函数外,还可以为 SIG_DFL(采用缺省的处理方式) 或SIG_IGN(忽略信号)。它的处 理函数只有一个参数,即信号值。 sa_mask是一个信号集,它可以指 定在信号处理程序执行过程中哪些 信号应当被屏蔽,在调用信号捕获 函数之前,该信号集要加入到信号 的信号屏蔽字中。 sa_flags中包含了许多标志位,是对 信号进行处理的各个选择项。
8.1 Linux下进程间通信概述
Linux下进程间通信概述(1)
Linux下的进程通信手段基本上是从UNIX平台上的进程通 信手段继承而来的。而对UNIX发展做出重大贡献的两大 主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的 伯克利软件发布中心)在进程间的通信方面的侧重点有所 不同。前者是对UNIX早期的进程间通信手段进行了系统 的改进和扩充,形成了“system V IPC”,其通信进程主要 局限在单个计算机内;后者则跳过了该限制,形成了基于 套接口(socket)的进程间通信机制。而Linux则把两者的 优势都继承了下来
本章的要求
第8章、 进程间通信
掌握Linux中管道的创建和读写 掌握Linux中有名管道的创建和读写 掌握Linux中信号的使用 掌握Linux中信号量的使用 掌握Linux中共享内存的使用 掌握Linux中消息队列的使用
本章的主要内容
8.1 Linux下进程间通信概述 8.2 管道 8.3 信号 8.4 信号量 8.5共享内存 8.6 消息队列 8.7 实验
最初UNIX的进程间通信
System V 进程间通信
Socket进程间通信
Linux 进程间 通信
POSIX进程间通信
进程间通信方式的种类(1)
(1)管道(Pipe)及有名管道(named pipe):管道可用于 具有亲缘关系进程间的通信,有名管道,除具有管道所具 有的功能外,它还允许无亲缘关系进程间的通信。 (2)信号(Signal):信号是在软件层次上对中断机制的一 种模拟,它是比较复杂的通信方式,用于通知进程有某事 件发生,一个进程收到一个信号与处理器收到一个中断请 求效果上可以说是一样的。 (3)消息队列(Messge Queue):消息队列是消息的链接 表,包括Posix消息队列SystemV消息队列。它克服了前两 种通信方式中信息量有限的缺点,具有写权限的进程可以 按照一定的规则向消息队列中添加新消息;对消息队列有 读权限的进程则可以从消息队列中读取消息。
进程 ps -ef 进程 grep ntp
内核 管道
管道的创建 和关闭
管道是基于文件描述符的通信方式,当一个管道建立时, 它会创建两个文件描述符fds[0]和fds[1],其中fds[0]固定用 于读管道,而fd[1]固定用于写管道,这样就构成了一个半 双工的通道。 创建管道可以通过调用pipe()来实现。 管道关闭时只需使用普通的close()函数逐个关闭各个文件 描述符。
Linux下进程间通信概述(2)
• UNIX进程间通信(IPC)方式包括管道、FIFO以及信号。 • System V进程间通信(IPC)包括System V消息队列、 System V信号量以及System V共享内存区。 • Posix 进程间通信(IPC)包括Posix消息队列、Posix信号 量以及Posix共享内存区。