进程可以通过调用函数pipe()创建一个管道。函数pipe()的原型如下:
int pipe(int fildes[2]);
从本质上来说,pipe()函数的功能就是创建一个内存文件,但与创建普通文件的函数不同,函数pipe()将在参数fildes中为进程返回这个文件的两个文件描述符fildes[0]和fildes[1]。
其中,fildes[0]是一个具有“只读”属性的文件描述符,fildes[1]是一个具有“只写”属性的文件描述符,
即进程通过fildes[0]只能进行文件的读操作,而通过fildes[1]只能进行文件的写操作。
管道使用read()和write()函数,采用字节流的方式,具有流动性,读数据时,每读一段数据,则管道内会清除已读走的数据。
读管道时,若管道为空,则被堵塞,直至管道另一端write将数据写入到管道为止。若写段已关闭,则返回0;
写管道时,若管道已满,则被阻塞,直到管道另一端read将管道内数据取走为止。
匿名管道的局限性主要有两点:一是由于管道建立在内存中,所以它的容量不可能很大;
二是管道所传送的是无格式字节流,这就要求使用管道的双方实现必须对传输的数据格式进行约定。
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>
int main()
{
pid_t pid;
char *str = {"hello world!\n"};
int fd[2], i, n;
char buf[1024];
int ret = pipe(fd);
if(ret == -1){
perror("pipe error\n");
exit(1);
}
pid = fork();
if(pid > 0){
wait(NULL);
close(fd[1]); //父进程关闭写端,留读端读取数据
n = read(fd[0],buf,strlen(str)); //从管道中读数据
write(STDOUT_FILENO,buf,n);
printf("the text from son:%s\n",buf);
}else if(pid == 0){
close(fd[0]);
write(fd[1],str, strlen(str));
exit(0);
}
else{
perror("pipe error\n");
exit(1);
}
return 0;
}
学识浅薄,希望可以帮到您