Linux 进程间通信知识点总结

Linux 进程间通信知识点总结进程间通信(IPC)是指在不同进程之间传播或交换信息。

进程间通信的方式主要有以下6钟:(1)管道(Pipe)(2)信号(Singal)(3)信号量(Semaphore)(4)共享内存(shared memory)(5)消息队列(Message Queue)(6)套接字(Socket)下面对6种方式进行详细介绍:管道1、管道分为有名管道和无名管道,通常指无名管道。

2、无名管道特点:(1)它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。

(2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。

(3)对于它的读写也可以使用普通的read、write 等函数。

但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

3、缺点:速度慢,容量有限,只有父子进程能通讯。

4、管道的创建及使用:调用pipe()函数创建一个管道,再通过fork()函数创建一个子进程,该子进程继承父进程所创建的管道,为实现父子进程间的读写,只需把无关的读端或写端的文件描述符关闭即可。

若要数据流从父进程流向子进程,则关闭父进程的读端(fd[0])与子进程的写端(fd[1]);反之,则可以使数据流从子进程流向父进程。

5、父子进程在运行时,先后顺序并不能保证。

可以在进程中添加sleep()函数。

6、标流管道:管道的操作也支持基于文件流的模式,这种基于文件流的管道主要是用来创建一个连接到另一个进程的管道,这里的“另一个进程”也就是一个可以进行一定操作的可执行文件。

7、因此标准流管道就将一系列的创建过程合并到一个函数popen()中完成。

它所完成的工作有以下几步:(1)创建一个管道(2)fork()一个子进程(3)在父进程中关闭不必要的文件描述符(4)执行exec函数族调用(5)执行函数中所指定的命令8、popen()函数的使用减少了代码的编写量,但是灵活性不如pipe()函数所创建的管道,并且使用popen()创建的管道必须使用标准I/O函数进行操作,但不能使用read()、write()一类不带缓冲的I/O函数。

open()创建的流管道必须使用函数pclose()来关闭该管道流。

9、有名管道特点:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

它是一个设备文件,提供一个路径名与FIFO关联。

10、有名管道缺点:任何进程间都能通讯,但速度慢。

11、使用有名管道需先调用open函数将其打开,设置读写端的权限,若只是以只读或只写方式打开,会阻塞到有读或写方式打开管道为止。

若同时以读写方式打开,一定不阻塞。

12、有名管道的阻塞打开和非阻塞打开:(1)读进程①若管道阻塞打开,且当前FIFO内没有数据,则读进程一直阻塞到有数据写入。

②若管道非阻塞打开,不论FIFO内是否有数据,读进程都立刻执行读操作。

即FIFO内没有数据,该函数就立刻返回0。

(2)写进程①若管道阻塞打开,写操作一直阻塞到有数据可以被写入。

②若管道是非阻塞打开且不能写入全部数据,读操作进行部分写入或者调用失败。

13、除了调用myfifo()函数之外,有名管道还可以通过“mknod 管道名p”的方式创建。

信号1、信号是软件层次上对中断机制的模拟,是一种异步通信方式。

2、信号值在32之前有不同的名称,在32后都是以“SIGRTMIN”和“SIGRTMAX”开头的,这是两类典型的信号量。

3、信号主要作为进程间以及同一进程不同线程之间的同步手段。

4、一个完整的信号生命周期可以分为3个阶段,这个3个阶段由4个重要事件来表示:信号的产生、信号在进程中注册、信号在进程中注销、执行信号处理函数。

5、发送信号的函数主要有kill()、raise()、alarm()以及pause()。

kill()函数:中止进程,向进程发送其他信号。

raise()函数:允许进程向自身发送信号。

alarm()函数:在进程中设置一个定时器,当定时器指定时间到时,就会向进程发送SIGALARM信号。

pause()函数:将调用进程挂起直至捕捉到信号为止,通常用于判断信号是否移到。

6、信号的处理方法:(1)Singal():可以用函数signal注册一个信号捕捉函数。

原型为:#includetypedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);signal 的第1个参数signum表示要捕捉的信号,第2个参数是个函数指针,表示要对该信号进行捕捉的函数,该参数也可以是SIG_DEF(表示交由系统缺省处理,相当于白注册了)或SIG_IGN(表示忽略掉该信号而不做任何处理)。

signal如果调用成功,返回以前该信号的处理函数的地址,否则返回SIG_ERR。

sighandler_t是信号捕捉函数,由signal函数注册,注册以后,在整个进程运行过程中均有效,并且对不同的信号可以注册同一个信号捕捉函数。

该函数只有一个参数,表示信号值。

(2)Sigaction():函数原型:#include <signal.h>int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); sigaction也用于注册一个信号处理函数。

参数signum为需要捕捉的信号;参数 act是一个结构体,里面包含信号处理函数地址、处理方式等信息。

参数oldact是一个传出参数,sigaction函数调用成功后,oldact里面包含以前对signum的处理方式的信息。

如果函数调用成功,将返回0,否则返回-1。

●信号量1、信号量是一个计数器,用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

2、信号量的值是指当前可用资源的数量,通常是对信号量进行PV操作。

P操作:有资源时候(信号量值 > 0)则占用一个资源(信号量减1);若没有资源(信号量 = 0),则被阻塞直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。

V操作:若等待队列中有进程在等待资源,则唤醒一个阻塞进程。

如果没有进程等待它,则释放一个资源(给信号量值加1)。

3、缺点:不能传递复杂消息,只能用来同步。

4、信号量的应用步骤:(1)创建信号量或获得在系统中已存在的信号量--semget()(2)初始化信号量--semctl()的SETVAL操作,信号量初始化为1(3)对信号量进行PV操作--semop()(4)删除无用的信号量--semclt()的IPC_RMID操作5、在实例中,通常是先对父进程执行操作,但由于信号量处置为0父进程阻塞,转至执行子进程,在子进程执行结束后方可执行父进程操作。

如果不加信号量,则父进程会先执行完毕。

●共享内存1、共享内存是指两个或多个进程共享一个给定的存储区。

是进程间通信最快的方式。

2、特点:(1)共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。

(2)因为多个进程可以同时操作,所以需要进行同步。

(3)信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

3、使用流程(1)创建共享内存 shmget()(2)映射共享内存 shmat()(3)撤销映射 shmdt()4、使用实例:首先创建一个共享内存区,之后创建子进程,在父子进程中将共享内存分别映射到各自的进程地址空间中。

父进程等待用户输入,将键入的数据写入到共享内存中,之后往共享内存的头部写入标识字符串表示父进程成功写入数据。

子进程一直等到共享内存的头部字符串为标识字符,然后将其打印在屏幕上。

父子进程完成以上操作后,分别解除与共享内存的映射关系。

最后在子进程中删除共享内存。

●消息队列1、消息队列就是消息的列表,用户可以从中添加消息和读取消息。

消息存在于内核中,由队列ID来标识。

它在系统内核中是以消息链表的形式出现,消息链表中节点的结构用msg声明。

2、消息队列的实现包括打开消息队列、添加消息、读取消息和控制消息队列这4种操作。

(1)创建或打开消息队列 msgget()(2)添加消息 msgsnd()(3)读取消息msgrcv() ----同FIFO不同的是,这里可以指定取走某一条消息(4)控制消息队列msgctl()3、消息的发送端和接收端不需要额外的实现进程间的同步。

发送端发送的消息类型设置为该进程的进程号,接收端根据消息类型确定消息发送者的类型号。

4、优点:消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

5、缺点:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题●套接字1、socket是一种文件描述符,不仅可实现本机上进程的通信,还可以实现不同机器间的进程通信。

2、套接字的特性有三个属性确定,它们是:域(domain),类型(type),和协议(protocol)。

3、套接字域指定套接字通信中使用的网络介质。

最常见的套接字域是 AF_INET(IPv4)或者AF_INET6(IPV6),它是指 Internet 网络。

4、套接字类型:流套接字、数据报套接字、原始套接字。

5、套接字协议有TCP协议和UDP协议。

TCP协议可靠性高可减少错误发生的概率,UDP协议灵活性高可减少网络负荷。

6、通信机制:首先服务端建立socket套接字可使得其可接受客户端socket套接字请求,然后调用bind绑定函数,将本机IP地址和本地监听与客户端相连的端口号绑在一起,形成半相关的套接字。

再运行客户端,也使得本机IP地址和端口号绑定,可向服务端发送请求。

然后即可监听客户端向服务端发送的连接请求,若有请求accept,无请求则一直监听。

此时服务端和客户端可进行双向通信。

通信结束后关闭通道。

7、网络高级编程:(1)作用:解决I/O多路复用(2)fcntl():fcntl可实现对指定文件描述符的各种操作,其函数原型如下:int fcntl(int fd, int cmd, ... /* arg */ );操作类型由cmd决定。

cmd可取如下值:F_DUPFD:复制文件描述符F_DUPFD_CLOEXEC:复制文件描述符,新文件描述符被设置了close-on-execF_GETFD:读取文件描述标识F_SETFD:设置文件描述标识F_GETFL:读取文件状态标识F_SETFL:设置文件状态标识F_GETLK:如果已经被加锁,返回该锁的数据结构。

如果没有被加锁,将l_type设置为F_UNLCKF_SETLK:给文件加上进程锁F_SETLKW:给文件加上进程锁,如果此文件之前已经被加了锁,则一直等待锁被释放。

合集下载

linux socket进程间通信的几种方法 -回复

linux socket进程间通信的几种方法 -回复

linux socket进程间通信的几种方法-回复Linux socket是一种用于实现进程间通信的重要机制。

它允许在不同进程之间传递数据,从而实现数据共享和协作。

本文将详细介绍Linux socket 进程间通信的几种方法,并逐步解释每种方法的实现原理和使用方式。

第一部分:什么是Linux socket在开始探讨进程间通信方法之前,我们需要先了解什么是Linux socket。

Socket是一种编程接口,允许进程通过网络进行通信。

它是一种基于网络的进程间通信机制,可以在不同主机之间传递数据。

Socket提供了一种抽象层,使得我们可以像对待普通文件一样对待网络上的数据。

通过使用Socket,进程可以创建、连接、发送和接收数据。

在Linux中,Socket是一种核心技术,被广泛应用于进程间通信。

第二部分:基于TCP/IP的Socket通信基于TCP/IP的Socket通信是Linux中最常用的进程间通信方法之一。

它通过使用TCP/IP协议栈在网络上传输数据。

传输控制协议(TCP)提供了可靠的、面向连接的通信,而互联网协议(IP)提供了路由和地址解析功能。

在基于TCP/IP的Socket通信中,两个进程分别充当客户端和服务器端。

客户端进程通过调用socket()函数创建一个套接字,然后调用connect()函数连接到服务器端的套接字。

服务器端进程则调用socket()函数创建套接字,并调用bind()函数将套接字与特定的地址和端口绑定。

之后,服务器进程调用listen()函数开始监听客户端连接请求,并通过accept()函数接受客户端的连接请求。

一旦连接建立,客户端和服务器端可以使用send()和recv()函数来发送和接收数据。

send()函数将数据发送给套接字缓冲区,而recv()函数从缓冲区接收数据。

通过循环调用这两个函数,进程之间可以实现数据的交换。

第三部分:基于UNIX域的Socket通信除了基于TCP/IP的Socket通信,Linux还提供了基于UNIX域的Socket 通信。

(完整版)试验三、linux的进程间通信

(完整版)试验三、linux的进程间通信

试验三、linux的进程间通信试验目的:1、理解linux的进程间通信机制2、掌握和使用消息队列实现进程间通信3、掌握和使用共享主存实现进程间通信4、掌握何使用信号量实现进程同步背景知识介绍:linux继承了unix v的进程间通信机制,即消息队列、信号量和共享主存。

通常把消息、信号量和共享主存统称为system v ipc对象或ipc资源。

系统在进程请求ipc对象时在内核动态创建一个ipc数据结构并初始化,该结构定义了对该ipc对象访问的许可权,每个对象都具有同样类型的接口-函数,这组函数为应用程序提供3种服务:通过信号量实现与其他进程的同步通过消息队列以异步方式为通信频繁但数据量少的进程间通信提供服务通过共享主存,为大数据量的进程间通信提供服务1、共性描述1.1、公有的数据结构每一类ipc资源都有一个ipc_ids结构的全局变量用来描述同一类资源的共用数据,三种ipc对象对应的三个全局变量分别是semid_ds,msgid_ds 和shmid_ds。

ipc_ids结构定义如下:struct ipc_ids{int size; /*entries数组的大小*/int in_use; /*entries数组已使用的元素个数*/int max_id;unsigned short seq;unsigned short seq_max;struct semaphore sem; /*控制对ipc_ids结构的访问*/spinlock_t ary; /*自旋锁控制对数组entries的访问*/struct ipc_id* entries;};struct ipc_id{ struct ipc_perm *p;};每个ipc对象都有一个ipc_perm数据结构,用于描述其属性。

struct ipc_perm{__key_t __key; /* ipc键*/__uid_t uid; /* Owner's user ID. */__gid_t gid; /* Owner's group ID. */__uid_t cuid; /* Creator's user ID. */__gid_t cgid; /* Creator's group ID. */unsigned short int mode;/* Read/write permission. */unsigned short int __seq;/* Sequence number. */};每一个ipc对象都有一个32位的ipc键和一个ipc标识符,ipc标识符由内核分配给ipc对象,在系统内部惟一,IPC机制提供了相应的编程接口根据IPC键值获取标识符。

linux进程间通信

linux进程间通信
与之相对应,关闭用popen()创建的流管道必须使用函数 pclose()来关闭该管道流。该函数关闭标准I/O流,并等
待命令执行结束。
标准流管道 (3)
命名管道 (1)
父进程
fd[0]
fd[1]
子进程
fd[0]fd[1]Fra bibliotek内核 管道
父子进程之间的管道通信(2)
父子进程分别拥有自己的读写通道,为了实现父子进程之 间的读写,只需把无关的读端或写端的文件描述符关闭即 可。此时,父子进程之间就建立起了一条“子进程写入父
进程读取”的通道。
父进程
fd[0]
fd[1]
子进程
fd[0]
管道的创建和关闭
创建管道可以通过调用pipe()来实现。 管道关闭时只需使用普通的close()函数逐个关闭
各个文件描述符。
父子进程之间的管道通信(1)
用pipe()函数创建的管道两端处于一个进程中, 由于管道是主要用于在不同进程间通信的,因此 这在实际应用中没有太大意义。实际上,通常先 是创建一个管道,再通过fork()函数创建一子进 程,该子进程会继承父进程所创建的管道 。
• 创建一个管道。 • fork()一个子进程。 • 在父子进程中关闭不需要的文件描述符。 • 执行exec函数族调用。 • 执行函数中所指定的命令。
标准流管道 (2)
标准流管道的使用可以大大减少代码的编写量,但同时也 有一些不利之处,例如,它不如前面管道创建的函数那样 灵活多样,并且用popen()创建的管道必须使用标准I/O 函数进行操作,但不能使用前面的read()、write()一类 不带缓冲的I/O函数。
(6)套接字(Socket):这是一种更为一般的进程间通信 机制,它可用于本机或网络中不同机器之间的进程间通信, 应用非常广泛。

Linux进程间通信信号(signal)

Linux进程间通信信号(signal)

Linux进程间通信信号(signal)1. 概念: 1)信号是在软件层次上对中断机制的⼀种模拟,是⼀种异步通信⽅式 2)信号可以直接进⾏⽤户空间进程和内核进程之间的交互,内核进程也可以利⽤它来通知⽤户空间进程发⽣了哪些系统事件。

3)如果该进程当前并未处于执⾏态,则该信号就由内核保存起来,直到该进程恢复执⾏再传递给它;如果⼀个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

2.⽤户进程对信号的响应⽅式: 1)忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。

2)捕捉信号:定义信号处理函数,当信号发⽣时,执⾏相应的处理函数。

3)执⾏缺省操作:Linux对每种信号都规定了默认操作3.信号: SIGINT:ctrl+c 终⽌信号 SIGQUIT:ctrl+\ 终⽌信号 SIGTSTP:ctrl+z 暂停信号 SIGALRM:闹钟信号收到此信号后定时结束,结束进程 SIGCHLD:⼦进程状态改变,⽗进程收到信号 SIGKILL:杀死信号4.相关函数:1)int kill(pid_t pid, int sig); 功能:信号发送 参数:pid:指定进程 sig:要发送的信号 返回值:成功 0;失败 -12)int raise(int sig); 功能:进程向⾃⼰发送信号 参数:sig:信号 返回值:成功 0;失败 -13)unsigned int alarm(unsigned int seconds) 功能:在进程中设置⼀个定时器 参数:seconds:定时时间,单位为秒 返回值:如果调⽤此alarm()前,进程中已经设置了闹钟时间,则返回上⼀个闹钟时间的剩余时间,否则返回0。

注意:⼀个进程只能有⼀个闹钟时间。

如果在调⽤alarm时已设置过闹钟时间,则之前的闹钟时间被新值所代替4)int pause(void); 功能:⽤于将调⽤进程挂起直到收到信号为⽌。

进程间通信之:Linux下进程间通信概述

进程间通信之:Linux下进程间通信概述

进程间通信之:Linux下进程间通信概述8.1Linux 下进程间通信概述在上一章中,读者已经知道了进程是一个程序的一次执行。

这里所说的进程一般是指运行在用户态的进程,而由于处于用户态的不同进程之间是彼此隔离的,就像处于不同城市的人们,它们必须通过某种方式来进行通信,例如人们现在广泛使用的手机等方式。

本章就是讲述如何建立这些不同的通话方式,就像人们有多种通信方式一样。

Linux 下的进程通信手段基本上是从UNIX 平台上的进程通信手段继承而来的。

而对UNIX 发展做出重大贡献的两大主力ATT 的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同。

前者是对UNIX 早期的进程间通信手段进行了系统的改进和扩充,形成了“systemVIPC”,其通信进程主要局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。

而Linux 则把两者的优势都继承了下来,如图8.1 所示。

图8.1 进程间通信发展历程n UNIX 进程间通信(IPC)方式包括管道、FIFO 以及信号。

n SystemV 进程间通信(IPC)包括SystemV 消息队列、SystemV 信号量以及SystemV 共享内存区。

n Posix 进程间通信(IPC)包括Posix 消息队列、Posix 信号量以及Posix 共享内存区。

现在在Linux 中使用较多的进程间通信方式主要有以下几种。

(1)管道(Pipe)及有名管道(namedpipe):管道可用于具有亲缘关系进程间的通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进。

linux下进程通信的八种方法

linux下进程通信的八种方法

linux下进程通信的八种方法在Linux下,有多种方法可以实现进程间的通信。

以下是八种常用的进程通信方法:
1. 管道(Pipe):管道是一种半双工通信方式,可用于具有亲缘关系的父子进程之间进行通信。

2. 命名管道(Named Pipe):命名管道也称为FIFO(First In, First Out),它可以在无亲缘关系的进程之间进行通信。

3. 信号(Signal):进程通过发送信号给其他进程来进行通信,例如,某些特定事件发生时,一个进程可以向另一个进程发送一个信号。

4. 消息队列(Message Queue):进程可以通过消息队列发送和接收消息,消息队列提供了一种先进先出的消息传递机制。

5. 共享内存(Shared Memory):多个进程可以共享同一块内存区域,进程可以直接读写该内存区域来进行通信。

6. 信号量(Semaphore):信号量用于进程间的互斥和同步,可以控制对共享资源的访问。

7. 套接字(Socket):套接字是一种网络编程中常用的通信机制,在本地主机或网络上不同主机的进程之间进行通信。

8. 文件锁(File Locking):进程可以使用文件锁来实现对某个文件或资源的独占访问。

LINUX进程间通信2.


write(fd[1],buf,30);exit . (0);
default:wait(NULL);read(fd[0],s,30);printf(“%s―,s); } }
例2:父进程生成P1,P2两子进程分别向管道写入各自 的字符,父进程读出它们。
main() { int pid1,pid2,fd[2]; char buf[50],s[50]; pipe(fd); pid1=fork(): switch(pid1){ case –1:perror(”fork failed‖);exit(1); case 0:lockf(fd[1],1,0);//锁定写入端 sprintf(buf,”child p1 is sending messages!\n‖); write(fd[1],buf,50); . sleep(5); lockf(fd[1],0,0);//释放写入端 exit(0); default:pid2=fork();
2.有名管道
注意:无名管道 (1)pipe()的调用必须在fork()之前 (2)及时关闭不需要的句柄 (3)管道通信只能用于父子进程间。
有名管道的创建:
#mknod sampleFIFO 或#mkfifo -m 0666 sampleFIFO
.
例子:
#define FIFO-FILE ―sampleFIFO― void main(void) { FILE *fp; char readbuf[80]; mknod(FIFO-FILE,S_IFIFO|0666,0); while(1){ fp=fopen(FIFO-FILE,‖r‖); #define FIFO-FILE ―sampleFIFO― main(int argc,char *argv[]) { FILE *fp;

linux系统的进程间通信有哪几种方式,及优劣?

linux系统的进程间通信有哪几种方式,及优劣?# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。

进程的亲缘关系通常是指父子进程关系。

# 有名管道(named pipe) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

# 信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。

它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。

因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

# 消息队列( message queue ) :消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。

消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

# 信号( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。

共享内存是最快的IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。

它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

# 套接字( socket ) :套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信管道可以用于shell重定向,也就是命令管道类似grep命名管道可以实现通信,通过makefifo传递消息消息队列也可以实现通信,不过相比命名管道有消息过滤的好处信号其实就是KILL的应用信号量是对临界共享资源的合理调度共享内存, 就是字面意思共享的内存。

linux的进程间的通信机制

linux的进程间的通信机制
Linux进程间通信的方式有多种,以下是一些常用的通信机制:
1. 管道(pipe):管道是一种半双工的通信方式,它可以在具
有父子关系的进程间进行通信。

管道有两种类型:普通管道(匿名管道)和命名管道(FIFO)。

2. 消息队列(message queue):消息队列是一种通过消息传
递进行进程间通信的机制。

进程可以通过将消息发送到消息队列中,另一个进程可以从该队列中读取消息。

3. 共享内存(shared memory):共享内存是一种高效的进程
间通信方式,允许多个进程访问同一段内存。

这种通信方式适用于需要大量数据交换的进程。

4. 信号(signal):信号是一种软件中断机制,用于通知进程
发生了一些特定事件。

发送信号的进程可以将信号发送给另一个进程,接收进程可以定义信号的处理函数。

5. 信号量(semaphore):信号量是一种用于进程同步和互斥
的机制。

它允许多个进程共享一个计数器,用于控制对临界资源的访问。

6. 套接字(socket):套接字是一种用于网络通信的机制,它
允许不同机器间的进程进行通信。

套接字提供了一种编程接口,使得进程可以通过互联网进行数据传输。

这些通信机制各有优缺点,应根据具体的需求选择合适的方式。

linux进程通信

一、linux下进程间通信概述AT&T的贝尔实验室,对UNIX早期的进程间通信进行了改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内。

BSD(加州大学伯克利分校伯克利软件发布中心),跳过了该限制,形成了基于套接字(socket)的进程间通信机制。

linux继承了上述所有通信方式:1、传统通信方式无名管道(pipe),有名管道(fifo),信号(signal)2、system V IPC对象共享内存(share memory),消息队列(message queue),信号灯(又叫信号灯集,与线程中的信号灯要区分清楚,semaphore)3、BSD套接字(socket,这个其实主要用于网络间线程通信,所以肯定可以支持本机线程通信)二、每种通信方式的介绍1、无名管道(pipe)无名管道只能用于具有亲缘关系的进程间通信,即父子进程,兄弟进程等。

无名管道由内核来维护,是一种半双工的通信模式,具有固定的读端和写端(读端只能读,写端只能写),可以将其看成文件,使用write和read函数进行读写。

由于子进程完全继承父进程打开的文件描述符,所以父子进程可以通过pipe进行通信创建无名管道pipe需要用到函数:int pipe(int fd[2]);fd[0]固定为读端,fd[1]固定为写端。

举例如下:int fd[2];pipe(fd);这样,一个进程通过fd[1]写入数据,另一个就可以从fd[0]读出来了。

注意无名管道无读者时,写操做将会返回一个信号,如果进程未对此信号进行捕捉,会被信号杀死(即进程退出)。

若无写者,则读操作会返回0无名管道不能保证原子性,既如果有多个进程同时向同一个管道里面写数据,可能会造成数据交错,得不到我们想要的结果,这点希望读者能够在编程时注意。

2、有名管道fifo有名管道可以使互不相关的两个进程之间进行通信,有名管道想普通文件一样在linux文件系统中可见,可以通过路径来指定,用open,write,read等函数进行操作,而且他与无名管道不通,他可以保证写入数据的原子性,而且遵循先进先出的原则。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档