IPC --- 管道
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;}

浙公网安备 33010602011771号