标签:
1.在两个进城之间建立数据流通的管道
2.可以单向也可以双向
3.和文件类似,但是数据读出后,管道中就没有信息了
4.匿名半双工管道:
ls | grep * ,ls的输出是grep的输入,匿名半双工管道只是 系统的资源,但是没有实名,不可能在文件系统中以任何文件的形式看到管道
中的内容,进程结束就会被系统清除
5.
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
int fd[2];
if(pipe(fd)==-1)
{
perror("create pipe fail");
exit(-1);
}
char wbuf[] = "Hello,I am pipe!";
if(write(fd[1],wbuf,sizeof(wbuf))==-1)
{
perror("write fail");
}
char rbuf[sizeof(wbuf)];
if(read(fd[0],rbuf,sizeof(wbuf))==-1)
{
perror("read fail");
}
puts(rbuf);
close(fd[0]);
close(fd[1]);
return 0;
}
注意:两个文件描述符没有和任何有名文件相关联,不存在实际意义上的文件
pipe函数原型:
#inlcude<unistd.h>
int pipe(int fd[2])
成功返回0,反之为-1
匿名管道限制:
1.单方向传输信息,fd[1]只能是写入端,fd[0]只能是读取端
2.匿名管道只适用于有血缘关系的进程,比如父子进程和兄弟进程
3.当管道读端关闭,写端依然写入的时候,产生SIGPIPE信号,程序陷入中断
4.当管道写端关闭,读端依然读入的时候,read函数返回从管道中读取的字节数,如果管道中无数据的时候,就返回0,反之返回读取的字
节数
6.管道实现父子进程间通信
父进程向子进程发送信息:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main()
{
int fd[2];
pipe(fd);
pid_t pid = fork();
char buf[6]= "Hello";
char rbuf[6]={0};
if(pid!=0)
{
close(fd[0]);
write(fd[1],buf,6);
close(fd[1]);
}
else if(pid==0)
{
close(fd[1]);
read(fd[0],rbuf,6);
puts(rbuf);
close(fd[0]);
}
return 0;
}
子进程向父进程发送信息:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main()
{
int fd[2];
pipe(fd);
pid_t pid = fork();
char buf[6]= "Hello";
char rbuf[6]={0};
if(pid==0)
{
close(fd[0]);
write(fd[1],buf,6);
close(fd[1]);
}
else if(pid!=0)
{
close(fd[1]);
read(fd[0],rbuf,6);
puts(rbuf);
close(fd[0]);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/ZhangJinkun/p/4561552.html