管道

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

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

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

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值