一、基本概念

进程间通信IPC:进程之间交换数据的过程叫进程间通信

进程间同性的方式:

简单的进程间的通信:

命令行:父进程通过exec函数创建子进程是可以附加一些数据

环境变量表:父进程通过exec函数创建子进程顺便传递一张环境变量表

信号:父子进程之间可以根据进程号相互发送信号,进行简单通信

文件:一个进程向文件中写入数据,另一个进程从文件读3出来

命令行、环境变量只能单向传递,信号太过于简单,文件不能实时。

传统的进程之间通信方式:管道

二、管道

1.管道是一种古老的通信方式(基本上不再使用)

2.早期的管道是一种半双工,现在基本上是全双工的

3.有名管道(这种管道是文件方式存在的)

创建管道文件:

命令:mkfifo

函数:int mkfifo(const char *pathname, mode_t mode);

管道通信的编程模式:

进程a                        进程b

创建管道mkfifo

打开管道文件open               打开管道open

写/读数据read/write           读/写数据read/write

关闭管道                      关闭管道

4.无名管道:由内核帮助创建,只返回管道的文件描述符,看不到管道文件。但这种管道只能使用于fork()创建的父子进程之间。

int pipe(int pipefd[2])

pipefd[0] 用来读数据

pipefd[1] 用来写数据

XSI通信方式:X/open 计算机制造商组织。

共享内存、消息队列、信号量

三、XSI IPC进程间通信

1.XSI通信是靠内核的IPC对象进程通信

2.每一个IPC对象都有一个IPC标示(类似文件描述符),它是一个非负整数。

3.IPC对象必须要先创建,创建完才能进行获取、设置、操作、删除。

4.创建IPC对象必须要提供一个健值(key_t),健值是创建、获取IPC对象的依据。

5.产生健值的方式:

固定的字面符:1980014

使用函数计算:健值 = ftok(项目路径,项目id)   ftok(const char *pathname,int proj_id);

使用宏让操作系统随机分配:IPC_PRIVTE

必须把获取到IPC对象标示符记录下来,告诉其他进程

6.XSI可以创建的IPC对象:共享内存、消息队列、信号量

四、共享内存

1、由内核维护一块共享的内存区域,其他进程把自己的虚拟地址映射到这块内存,然后多个进程之间就可以共享这块内存

2、这种进程间通信的好处是不需要信息复制,是进程间通信最快的一种方式。

3、但这种通信方式会面临同步的问题。需要与其他的通信配合,最合适的就是信号。

共享内存的编程模式:

1.进程之间要约定一个健值

进程A                                   进程B

创建共享内存

加载共享内存                     加载共享内存

卸载共享内存                     卸载共享内存

销毁共享内存

int shmget(key_t  key,size_t  size,int shmflg)

功能:创建共享内存

size:共享大小  尽量是4096的倍数

shmflg:IPC_CREAT|IPC_EXCL

返回值:IPC对象标志符

void *shmat(int shmid,const void * shmaddr,int shmflg)

功能:加载共享内存(进程的虚拟地址与共享的内存映射)

shmid:shmget的返回值

shmaddr:进程提供的虚拟地址,如果为NULL,操作系统会自动选择

shmflg:

SHM_RDONLY:限制内存的权限为只读

SHM_REMAP:映射已经存的共享

SHM_RND:当shmaddr为空时自动分配

SHMLBA:shmaddr的值不能为空

返回值:映射后的虚拟地址

int shmdt(const void* shmaddr);

功能:卸载共享内存(进程的虚拟地址与共享的内存取消映射关系)

int shmctl(int shmid,int cmd,struct shmid_ds* buf)

功能:控制/销毁共享内存

cmd:

IPC_STAT:获取共享内粗的属性

IPC_SET:设置共享内存的属性

IPC_RMID:删除共享内存

IPC_INFO:获取贡献内存的信息

共享内存是进程见通信最快的一种,因此数据没有复制过程,但是无法得知进程之间的数据写入和读取,需要其他的通信方式的配额

五、消息队列

1.消息队列是一个由系统内核负责存储和管理、并通过IPC对象标示符获取的数据链表。

int msgget(key_t key, int msgflg);

功能:创建或获取消息队列

msgflg:

创建:IPC_CREAT|IPC_EXCL|0777

获取:0

返回:IPC对象标志符

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

功能:向消息队列发送消息

msqid:msgget的返回值

msgp:消息(消息类型加消息内容)的首地址

msgsz:消息内容的长度

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

功能:从消息队列接受消息

msgp:存储消息的缓冲区

msgsz:要接受的消息长度

msgtyp:消息的类型,包含在消息的前4个字节。

msgflg:

MSG_NOERROR:当消息的实际长度比msgsz还要长的话,

则按照msgsz长度截取再发送。否则产生错误。

MSG_NOWAIT:如果要接的消息不存在,直接返回

否则阻塞等待。

MSG_EXCEPT:从消息队列中接受第一个不

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

功能:控制/销毁消息队列

cmd:

IPC_STAT:获取消息队列的属性

IPC_SET:设置消息队列的属性

IPC_RMID:删除消息队列

六、IPC相关命令:

ipcs -m  察看共享内存

ipcrm -m id 删除共享内存

ipcs -q  察看消息队列

ipcrm -q  id  删除消息队列

7、信号量

信号量(信号灯),可以当作进程与进程之间共享的全局变量。一般用来为共享的资源计数。

信号量的使用方式:

1.进程A,创建信号量,并设置初始化(设置资源的数)

2.进程B,获取信号量,查询信号量(查询剩余资源的数量)。减少信号量(使用资源),增加信号量(资源使用完毕归还)

3.当一个进程尝试减少信号量时,如果不能减(资源使用完毕),则进程可以进入等待状态。

当信号量能够被减时,(其他进程把资源还回来了),进程会被唤醒。

函数

int semget(key_t key, int nsems, int semflg);

功能:创建信号量或获取信号量

nsems:信号量的数量

semflg:

IPC_CREAT|IPC_EXCL|0644

返回值:IPC对象标志符

int semop(int semid, struct sembuf *sops, unsigned nsops);

功能:对信号量增加或减少

struct sembuf

{

unsigned short sem_num; 信号的编号

short  sem_op;  对信号的处理

short  sem_flg;

如果信号量当前是0,函数立即返回。

IPC_NOWAIT:会阻塞

}

int semctl(int semid,int semnum,int cmd,...);

功能:对信号量控制或释放

semnum:信号量的编号

cmd:

IPC_SET     设置信号量的属性

IPC_STAT    获取信号量的属性

IPC_RMID    删除信号量

IPC_INFO    获取信号量的信息

UNIX标准C - 进程之间的通信的更多相关文章

  1. day34——僵尸进程和孤儿进程、互斥锁、进程之间的通信

    day34 僵尸进程和孤儿进程 基于unix环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻监测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收 ...

  2. Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信

    Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...

  3. c# IPC实现本机进程之间的通信

    IPC可以实现本地进程之间通信.这种用法不是太常见,常见的替代方案是使用wcf,remoting,web service,socket(tcp/pipe/...)等其他分布式部署方案来替代进程之间的通 ...

  4. python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726

    进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数 ...

  5. 进程之间的通信(multiprocess.Queue)

    一.进程间通信 进程之间的数据是相互隔离的,例如 from multiprocessing import Process def task(): global n # 声明全局变量 n = 999 p ...

  6. 《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池

    一.进程间通信---队列和管道(multiprocess.Queue.multiprocess.Pipe) 进程间通信:IPC(inter-Process Communication) 1.队列 概念 ...

  7. python进程之间的通信——Queue

    我们知道进程之间的数据是互不影响的,但有时我们需要在进程之间通信,那怎么办呢? 认识Queue 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息 ...

  8. python网络编程中互斥锁与进程之间的通信

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  9. Linux_进程之间的通信

    一.进程间的通信 1️⃣:进程间通信(IPC:Inter Process Communication) 2️⃣:进程之间通信方式: 同一主机 共享内存 信号:Signal 不同主机 rpc:remot ...

随机推荐

  1. 【神经网络与深度学习】Caffe源码中各种依赖库的作用及简单使用

    1.      Boost库:它是一个可移植.跨平台,提供源代码的C++库,作为标准库的后备. 在Caffe中用到的Boost头文件包括: (1).shared_ptr.hpp:智能指针,使用它可以不 ...

  2. JS ----- 底层原理

    什么是JS JavaScript是一种基于对象的动态.弱类型脚本语言(简称JS),是一种解释型语言,和其他的编程语言不同,如java/C++等编译型语言,这些语言在代码执行前会进行通篇编译,先编译成字 ...

  3. 超详细的CentOS8Linux新功能介绍 镜像iso下载安装

    在这文章中,我们会使用图解的方式演示 CentOS 8 的安装方法. CentOS8中软件和系统管理请参照https://www.cnblogs.com/fusheng11711/p/11809963 ...

  4. 【3.1】【mysql基本实验】mysql复制(主从复制/异步复制/半同步复制,一主一从)

    关键词:mysql复制(异步复制),mysql异步复制 核心原理: mysql 复制流程原理 一个事务在 mysql异步复制中的流程与生命周期 一个事务,在传统半同步的复制流程 #mysql主从基本实 ...

  5. next_permutation() 全排列函数

    next_permutation() 全排列函数 这个函数是STL自带的,用来求出该数组的下一个排列组合 相当之好用,懒人专用 适用于不想自己用dfs写全排列的同学(结尾附上dfs代码) 洛谷oj可去 ...

  6. github标星11600+机器学习课程资源

    github标星11600+:最全的吴恩达机器学习课程资源(完整笔记.视频.python作业) 吴恩达老师的机器学习课程,可以说是机器学习入门的第一课和最热门课程,我在github开源了吴恩达机器学习 ...

  7. vue-element-ui upload组件调用两次接口

    在使用upload中,默认是自动上传,会发现会调用两次接口,一次是Request Method: OPTIONS且不带任何参数(群里大佬说是跨域 预检测),一次是Request Method: POS ...

  8. 聚类算法博客 K-means算法

    最近看到一个 blog 感觉超好.记录下.. http://blog.pluskid.org/?p=17

  9. 如何正确训练一个 SVM + HOG 行人检测器

    这几个月一直在忙着做大论文,一个基于 SVM 的新的目标检测算法.为了做性能对比,我必须训练一个经典的 Dalal05 提出的行人检测器,我原以为这个任务很简单,但是我错了. 为了训练出一个性能达标的 ...

  10. TCP/IP的网络客户端和服务器端程序

    服务器端的过程可以分为以下几个步骤: (1)  初始化套接字的版本信息WSAStartup (2)创建套接字 ,需要两个套接字及客户端和服务器端的套接字 (3)绑定服务器(bind),该函数用于绑定服 ...