管道

xiaoxiao2021-02-28  107

对于普通管道分为四种情况;

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; }

//client

int 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; }

匿名管道和命名管道的区别;

匿名管道是在内核中开辟一段缓冲区,可将其看作文件,用户通过文件描述符对其进行读写操作;只能实现有血缘关系的两个进程之间的通信;

命名管道在创建时要指明文件创建路径以及权限的说明;命名管道可以实现无血缘关系的两个进程之间的通信;

转载请注明原文地址: https://www.6miu.com/read-35322.html

最新回复(0)