对于普通管道分为四种情况;
1)读端关闭,则写端自动关闭;
2)写端关闭,则读端先读完缓冲区内容再关闭;
3)读端快,写端慢,读端等待写端二者保持同步;
4)读端慢,写端快,将缓冲区写满后停下来;
下面代码是匿名管道代码;
#include<stdio.h>
#include<unistd.h> #include<string.h> #include<errno.h> int main() { int pipefd[2]; int p=pipe(pipefd); if(p==-1) { printf("mkpipe failure\n"); return 1; } pid_t id= fork(); if(id<0) { printf("fork error\n"); return 2; } else if(id==0) {//child int count=0; char* message="a"; close(pipefd[0]); while(count<6) { write(pipefd[1],message,strlen(message)); printf("%d\n",count++); sleep(1); } // close(pipefd[1]); } else {//father int status=0; char buf[10000]; close(pipefd[1]); int ccount=0; //close(pipefd[0]); while(ccount++<5) { ssize_t r=read(pipefd[0],buf,sizeof(buf)); if(r<0) return 3; else if(r==0) return 4; else buf[r]=0; printf("hehe::%s\n",buf); // sleep(100); } close(pipefd[0]); waitpid(id,&status,0); printf("signal:%d,exit:%d\n",status&0Xff,(status>>8)&0Xff); } return 0;}
下面是命名管道的代码;
//server
int main() { mkfifo("./file",S_IFIFO|0666); int fd=open("./file",O_WRONLY); umask(0); char* message="abcd"; write(fd,message,strlen(message)); // printf("%s",message); return 0; }
//clientint main() { int fd=open("./file",O_RDONLY); char buf[100]; ssize_t r=read(fd,buf,sizeof(buf)-1); if(r<0) return 1; else if(r==0) return 2; else { buf[r]=0; printf("%s\n",buf); } return 0; }
匿名管道和命名管道的区别;
匿名管道是在内核中开辟一段缓冲区,可将其看作文件,用户通过文件描述符对其进行读写操作;只能实现有血缘关系的两个进程之间的通信;
命名管道在创建时要指明文件创建路径以及权限的说明;命名管道可以实现无血缘关系的两个进程之间的通信;