进程间的通信有三大类:1.管道、信号;2IPC对象通信(共享内存,信号量集,共享内存是进程间最快的通信机制);3socket网络通信
1.管道:管道的特性是都是半双工的工作模式,所有的管道文件不支持定位操作(lseek,fseek)
1.读端存在,一直向管道去写数据,超过64k,会写阻塞。
2.写端存在,在管道中去读数据,如果管道为空,会读阻塞。
3管道破裂,读端关闭,写端一直往管道中区写数据
4read 0,写端关闭,读端读管道,如果管道为空的话,读会阻塞。
使用管道的框架为:创建管道-》读写管道-》关闭管道
无名管道:用于有亲缘关系的进程间通信,有固定的读写端。无名管道的建设应该在fork之前。
int pipe(int pipefd[2]);//这是创建管道,pipefd中存放这管道文件的读写秒速符,其中pipefd[0]是固定的读端;pipefd[1]是固定的写端。
有名管道:用于有任何两个单机进程间的通信。
框架为:创建有名管道-》打开有名管道-》读写管道-》关闭管道-》卸载管道
mkfifo(const char *pathname,mode_t mode);在指定的路径下创建一个权限为mode的有名管道文件。
remove():卸载管道。
2.信号:
kill(pid_t,intsig);通过该函数可以给pid进程发送信号为sig的系统信号。
raise(int sig) ;用来给自己发sig信号。
alarm(unsigned int seconds);定时由系统给当前进程发送信号。
pause(void):进程暂停,不再继续执行。除非收到其他信号。
void(*signal(int signum,void (*handler)(int)))(int);信号注册安函数,可以捕获系统发送给进程的信号。
3.共享内存:共享内存的原理是通过向内核空间申请一片空间来进行进程间的通信,两个相互通信的进程间可以使用同一个键值来申请到同一片内核空间,然后通过将这片内核中的共享空间映射到本地内存,通过对本地内存的读写来实现进程间的通信,在进程结束通信后,应当撤销映射,以保证内核空间的回收,最后删除内核空间中的共享内存区域
使用共享内存进行进程间通信的框架为:
创建唯一key值-》申请对象-》映射对象-》读写对象-》撤销映射-》删除对象
ftok(const char *pathname,int proj_id);用于创建唯一的键值
shmget(key_t key,size_t size,int shmflg);使用唯一键值向内核提出共享内存使用申请
shmat(int shmid,const void *shmaddr,int shmflg):将指定shmid对应的共享内存映射到本地内存。shmaddr一般设置为NULL。
shmdt(const void*shmaddr);撤销共享内存与本地内存之间的映射关系。
shmctl(int shmid,int cmd,struct shmid_ds*buf);修改共享内存属性,也可以删除指定的共享内存对象,shmid是要删除的共享内存对象。