进程间的七大通信方式
signal、file、pipe、shm、sem、msg、socket
1,signal
信号通信的目的:某某事件发生!此时需要处理什么,进程间(可以是不相关的进程)传递信号
场景:信号又被称之为中断,需要处理什么对应的是中断处理函数,此时设置断点,形参入栈,保存现场信息,然后去执行中断处理函数,当处理完成之后,恢复现场信息,程序继续往下执行
Linux下可以通过kill -l查看其所有信号(其一共64种信号)
发送信号:kill(pid, 信号) //对指定的进程发送什么信号
raise(信号) <==> kill(getpid(), 信号) //就是给自己发送指定的信号
alarm(秒数) :定时产生一个SIGALRM信号,调用alarm方法之后,只会产生一次该信号
接收信号:signal(信号,函数指针) //对该信号接收,并调用自己的函数指针进行处理
信号通信方式的局限性:不能够传递复杂的、有效的、具体的数据
2,file
每打开一个文件,就会产生一个文件控制块,而文件控制块与文件描述符是一一对应的,通过对文件描述符的操作进而对文件进行操作
文件描述符的分配原则:编号的连续性(节省编号的资源)
通过文件系统对文件描述符的读/写控制,进程间一方对文件写,一方对文件读,达到文件之间的通信;可以是不相关进程间的通信
使用的API:write()和read()
为了能够实现两个进程通过文件进行有序的数据交流,还得借助于信号的处理机制
(1)、通过pause()等待对方发起一个信号,已确认可以开始执行下一次读/写操作;
pause():只要接受到任何的信号,立马就可以往下执行
(2)、通过kill(,SIGUSR1)方法向对方发出明确的信号:可以开始下一步执行(读、写)
缺点:i、文件通信没有访问规则,ii、(因为CPU > 内存 > 文件)是低速的
3,pipe
在通信的进程间构建一个单向的数据流动的通道,数据通过管道从一个进程流向另一个进程是具有时间先后顺序的,所以是半双工通信;管道文件是一种临时文件,不是磁盘上真真正正的文件,是一块内存区域
分为:
fd[0]:读出数据
fd[1]:写入数据
无名管道:只能用于亲缘关系的父子进程,fd = pipe(),得到的是管道文件描述符,通过fd,用的是write()和read()读写数据;
达到双方通信:得用2个管道,达到可以发多句话,的fork()子进程处理
有名管道:非父子进程间通信mkfifo()
mkfifo会在文件系统中创建一个管道文