linux系统编程之进程间通信
chocolatemo
这个作者很懒,什么都没留下…
展开
-
16.信号量概述
1.信号量信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。特点: (1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。 (2)信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。 (3)每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。 (4)支持信号量组。...原创 2021-08-18 21:48:22 · 219 阅读 · 0 评论 -
14.信号携带信息(信号注册函数——高级版)
1.信号注册函数——高级版sigaction 的函数原型:#include <signal.h>int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);struct sigaction { void (*sa_handler)(int); //信号处理程序,不接受额外数据,SIG_IGN 为忽略,SIG_DFL 为默认动作 void原创 2021-08-18 20:12:42 · 389 阅读 · 0 评论 -
12.信号概述
1.信号是什么信号其实就是一个软件中断。对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。信号,为 Linux 提供了一种处理异步事件的方法。比如,终端用户输入了 ctrl+c 来中断程序,会通过信号机制停止一个程序2.信号的名字和编号:每个信号都有一个名字和编号,这些名字都以“SIG”开头,例如“SIGIO ”、“SIGCHLD”等等。信号定义在signal.h头文件中,信号名都定义为正整数。具体的信号名称可以使用kill -l来查看信号的名字以及序号,信号是从原创 2021-08-18 18:17:08 · 176 阅读 · 0 评论 -
10.共享内存概述
共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。特点:(1)共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。(2)因为多个进程可以同时操作,所以需要进行同步(3)信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。...原创 2021-08-17 20:53:38 · 118 阅读 · 0 评论 -
9.键值生成及消息队列移除
1.ftok函数系统建立IPC通讯 (消息队列、信号量和共享内存) 时必须指定一个ID值。通常情况下,该id值通过ftok函数得到头文件#include <sys/types.h>#include <sys/ipc.h>函数原型:key_t ftok( const char * fname, int id )fname就时你指定的文件名(该文件必须是存在而且可以访问的),一般使用当前目录,如:key_t key;key = ftok(".",原创 2021-08-17 20:39:43 · 108 阅读 · 0 评论 -
8.消息队列收发数据
1.读消息的代码:msgGet.c#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include<stdio.h>#include<string.h>struct msgbuf { long mtype; //消息类型 /* message type, must be > 0 */ char mtext[128]; //原创 2021-08-17 19:51:22 · 182 阅读 · 0 评论 -
6.消息队列的通信原理
消息队列:是消息的链接表,每个节点可能结构体,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。特点:(1)消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级(2)消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除(3)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类 型读取...原创 2021-08-17 18:21:48 · 443 阅读 · 0 评论 -
5.命名管道的数据通信
1.只读 open 要阻塞的代码:#include<stdio.h>#include <sys/stat.h>#include <sys/types.h>#include<errno.h>#include<fcntl.h>int main(){ //int mkfifo(const char *pathname, mode_t mode); if( (mkfifo("./file",0600) ==原创 2021-08-17 18:02:25 · 65 阅读 · 0 评论 -
4.创建命名管道
1.命名管道(FIFO)(1)FIFO常被称为命名管道,以区分管道(pipe)。管道(无名管道)(pipe)只能用于“有血缘关系”的进程间。但通过FIFO,不相关的进程也能交换数据。(2)命名管道提供了一个路径名与之关联,以命名管道的文件形式存在于文件系统中2.函数原型和头文件#include <sys/types.h>#include <sys/stat.h>// 返回值:成功返回0,出错返回-1int mkfifo(const char *pathname, mod原创 2021-08-17 16:55:09 · 839 阅读 · 0 评论 -
3.管道编程实战
无名管道代码:#include<stdio.h>#include <unistd.h>#include<string.h>#include<stdlib.h>int main(){ // int pipe(int pipefd[2]); int fd[2]; int pid; char buf[128]; if(pipe(fd) == -1)//管道创建失败 {原创 2021-08-17 16:00:43 · 122 阅读 · 0 评论 -
2.管道通信原理
一、管道管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。1、特点:(1)它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。(2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。(3)它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。无名管道:没有磁盘节点,仅仅作为一个内存对象,用完就销毁了int pipe(int fd[2]);由参原创 2021-08-17 15:22:39 · 198 阅读 · 0 评论 -
1.进程间通信
1.进程间通信进程间通信就是在不同进程之间传播或交换信息2、常见的通信方式(1)管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。**(2)命名管道FIFO:**有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。**(3)消息队列MessageQueue:**消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。**原创 2021-08-17 14:47:17 · 43 阅读 · 0 评论