1、进程间的通讯方式:
①,管道(管道命令,匿名管道,有名管道)
②,消息队列
③,共享内存
④,内存映射
⑤,信号
⑥,信号量
⑦,socket网络通讯
2、管道pipe
管道是内存中的一块临时存储空间,是一个环形队列,空间大小不固定
往管道中写数据:从用户层拷贝到内核层,内核层拷贝到内存空间
从管道中读数据:数据从内存拷贝到内核层,再从内核层拷贝到用户层
①匿名管道:不属于进程,独立于进程,只能用于具有亲缘关系间的进程通讯,如父子进程
int pipefd[2]={0};//对临时空间进行标记,pipefd[0]默认对应读,pipefd[1]默认对应写,匿名描述符
pipe(pipefd);//创建匿名管道,一进一出(一写一读),类似于文件描述符操作
//往管道中写数据
write(pipefd[1], caMsg, strlen(caMsg));
//从管道中读取数据
//默认阻塞读书据,若管道中没有数据,则阻塞,直到管道中有数据到来
read(pipefd[0], caResult, 64);
//最后记得关闭管道(同文件操作一样)
close(pipefd[0]);
close(pipefd[1]);
例子:要实现父子进程相互发送并接收信息,可以在父子各自代码区域进行管道读写,但读写操作间要sleep(1),否则就自己写的,自己读了,因为进程调度运行是基于时间片的,父进程写操作后时间片未用完,就会接着读;sleep是让写操作完就让出cpu给其他进程使用。
②有名管道:是一个特殊的(临时)文件,数据从文件中读取出来之后,就自动清除掉了
采用运行参数传入,mkfifo(argv[1],0664);//创建有名管道,argv[1]是运行时传入的文件名,0664是文件操作权限;
有名管道必须读写同时打开,才能继续往下执行
如果只是都打开或者写打开,则阻塞等待,直到管道被读写打开
有名管道可以完成非亲缘关系进程间通讯,可以一个读打开,一个写打开进行通讯,或对两个有名管道文件进行读写打开,或对一个文件读写打开,进行数据的发送和接收;
创建好有名管道文件后,操作如文件操作一样。