进程间通信方式

1>内核提供的原始通信方式有三种

1)无名管道

2)有名管道

3)信号

2>System V提供了三种通信方式

4)消息队列

5)共享内存

6)信号量(信号灯集)

3>套接字通信

7)socket

1)无名管道

1> 无名管道,就是没有名字的管道,是一个特殊的文件,并且存储在内存上,不在文件系统中展示

2> 无名管道打开后,会返回两个文件描述符,分别是读端和写端,当一个无名管道文件的两端全部被关闭后,管道文件在内存上消失

3> 由于无名管道在文件系统中没有真实的名字存在,所以不能使用open函数来打开,需要使用特殊的api进行打开

4> 无名管道只能适用于亲缘进程间的通信,需要在fork之前将管道文件打开,创建子进程后,子进程继承一份管道的文件描述符才能使用该管道

5> 无名管道的api

int pipe(int pipefd[2]);

2)有名管道

1> 有名管道,有名字的管道文件,会在文件系统创建一个管道文件,类型为 p

2> 该管道文件,仅仅只是用来进行进程间通信,不用于存储数据

3> 对管道文件的操作,可以使用open函数进行打开,所以,有名管道既可以用于亲缘进程间通信,也可以用于非亲缘进程间通信

4> 有名管道的api

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

3)信号

1> 信号是软件模拟底层硬件的中断操作,中断:打断当前正在进行的事情,去做另一件事

2> 信号是软件实现的,中断是硬件实现的

3> 信号是linux内核实现的,没有linux,就没有信号的概念

4> 用户可以给某个进程发送信号,一个进程也能给另一个进程发送信号,内核也可以给某个进程发送信号

5> 当一个进程收到信号后的操作有三种:默认(一般是杀死进程)、捕获、忽略

6>API

typedef void (*sighandler_t)(int);         //自定义函数类型

sighandler_t signal(int signum, sighandler_t handler);

 4)消息队列

消息队列API(ftok、msgget、msgsnd、msgrcv、msgctl)

key_t ftok(const char *pathname, int proj_id);                //ftok("/", 'k');
功能:通过给定的数据,创建出一个用于IPC通信的key值
 
int msgget(key_t key, int msgflg);
功能:通过给定的key值,以及消息队列的标识,创建一个消息队列

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:向消息队列中存放数据

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
功能:从消息队列中去一个消息

int msgctl(int msqid, int cmd, struct msqid_ds *buf);
功能:控制消息队列相关属性

5)共享内存

共享内存的操作不是一次性的,当共享内存段中的数据被读取后,依然存在,共享内存是所有进程间通信方式中效率最高的,原因是,操作共享内存段时,无需进行用户空间和内核空间的切换

共享内存的API(shmget、shmat、shmdt、shmctl)

int shmget(key_t key, size_t size, int shmflg);
功能:获取共享内存段的ID 

void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:映射共享内存到用户空间 

int shmdt(const void *shmaddr);
功能:撤销映射

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:操作共享内存

6)信号量(信号灯集)

信号量是完成多个进程之间同步问题的

信号灯集的API(semget、semctl、semop)

int semget(key_t key, int nsems, int semflg);
功能:创建信号灯集,并返回该信号灯集的id

int semctl(int semid, int semnum, int cmd, ...);
功能:初始化信号灯集中信号灯的值或者删除信号灯集

int semop(int semid, struct sembuf *sops, unsigned nsops);
功能:完成PV操作 

7)socket

socket(网络通信中信息的载体)

1> socket最原始时期也是用来完成同一主机之间的两个进程间的通信,随着TCP/IP协议族的引入,也能完成跨主机之间进程的通信

2> socket本质上是一个套接字文件,操作该文件时,使用的是文件io操作,实际操作的还是文件描述符

3> socket也是一个函数,用于创建一个套接字

既可以创建TCP通信的套接字,也适用于创建UDP通信的套接字

4> socket是系统给我们提供的函数,他会将复杂的网络通信过程转换成我们熟悉的IO操作,TCP/IP协议已经被集成到操作系统的内核中,

使用socket进行通信,相当于一种新型的IO操作

5> 通过传参的形式,来指定想要使用的协议

具体实现,会根据我们传入的参数的不同来完成

对于该文件操作方式:打开文件 --> 读写文件 --> 关闭文件

相关推荐

  1. 进程通信方式

    2024-02-04 22:26:02       32 阅读
  2. Python进程通信

    2024-02-04 22:26:02       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-04 22:26:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-04 22:26:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-04 22:26:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-04 22:26:02       18 阅读

热门阅读

  1. 深度学习的数据集制作、标注、处理相关软件

    2024-02-04 22:26:02       26 阅读
  2. 一文了解Go泛型

    2024-02-04 22:26:02       32 阅读
  3. LaTex字体加粗的方法

    2024-02-04 22:26:02       35 阅读
  4. 【从零开始学设计模式】第二章_单例模式

    2024-02-04 22:26:02       28 阅读
  5. 点灯科技esp32 idfv5.1组件库

    2024-02-04 22:26:02       36 阅读
  6. 河道多参数浮标水质监测站在线分析仪

    2024-02-04 22:26:02       24 阅读
  7. ffmpeg 输入rtsp 输出rtsp

    2024-02-04 22:26:02       27 阅读
  8. 整数二分查找

    2024-02-04 22:26:02       28 阅读
  9. 【国产MCU】-CH32V307-GPIO控制-外部中断

    2024-02-04 22:26:02       31 阅读