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);
功能:创建信号灯集,并返回该信号灯集的idint 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> 通过传参的形式,来指定想要使用的协议
具体实现,会根据我们传入的参数的不同来完成
对于该文件操作方式:打开文件 --> 读写文件 --> 关闭文件