进程间通信方式(1)---管道
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
存在于内存中的特殊文件,不支持 lseek 操作,是一种半双工通信,有固定的读端和写端, 它分为无名管道和有名管道,无名管道可用于具有亲缘关系的进程间通信,有名管道 则除无名管道特点外,还可用于无亲缘关系的进程间通信。 无名管道 int pipeFd[2];//pipeFd[0]读,pipeFd[1]写 if(pipe(pipeFd) < 0) {
打开有名管道文件 如果一个进程以只写方式打开一个有名管道,也会堵塞,直到另一个进程以只读方式打开有 名管道文件 读写规则:同无名管道
Байду номын сангаас
perror("fail to pipe"); exit(EXIT_FAILURE); } 读写规则: A;读端存在,写管道 只要管道有空闲的空间,数据就会写到管道中 如果管道满,写管道堵塞 B:读端不存在,写管道 此时没有意义,写管道时内核会向这个进程发送 SIGPIPE,此信号默认杀死进程 C:写端存在,读管道 如果管道中的数据 < 要求读的数据的大小,此时读取管道中实际的数据 如果管道中的数据 > 要求读的数据的大小,此时读取要求读出的数据的大小 如果管道中没有数据,读管道会堵塞 D:写端不存在,读管道 如果管道中有数据,读取实际数据 如果管道中没有数据,读管道不会阻塞,此时立即返回0(读到的全部是0) 有名管道 if(mkfifo("/home/linux/FIFO",0666) < 0 && errno != EEXIST) { perror("fail to mkfifo"); exit(EXIT_FAILURE); } 注意:如果一个进程以只读方式打开一个有名管道,就会堵塞,直到另一个进程以只写方式
打开有名管道文件 如果一个进程以只写方式打开一个有名管道,也会堵塞,直到另一个进程以只读方式打开有 名管道文件 读写规则:同无名管道
Байду номын сангаас
perror("fail to pipe"); exit(EXIT_FAILURE); } 读写规则: A;读端存在,写管道 只要管道有空闲的空间,数据就会写到管道中 如果管道满,写管道堵塞 B:读端不存在,写管道 此时没有意义,写管道时内核会向这个进程发送 SIGPIPE,此信号默认杀死进程 C:写端存在,读管道 如果管道中的数据 < 要求读的数据的大小,此时读取管道中实际的数据 如果管道中的数据 > 要求读的数据的大小,此时读取要求读出的数据的大小 如果管道中没有数据,读管道会堵塞 D:写端不存在,读管道 如果管道中有数据,读取实际数据 如果管道中没有数据,读管道不会阻塞,此时立即返回0(读到的全部是0) 有名管道 if(mkfifo("/home/linux/FIFO",0666) < 0 && errno != EEXIST) { perror("fail to mkfifo"); exit(EXIT_FAILURE); } 注意:如果一个进程以只读方式打开一个有名管道,就会堵塞,直到另一个进程以只写方式