管道作用于有血缘关系的进程之间,通过fork来传递
调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个 写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读 端,filedes[1]指向管道的写端(很好记,就像0是标准输入1是标准输出一样)。
所以管道 在用户程序看起来就像一个打开的文件,通过read(filedes[0]);或者write(filedes[1]);向这个文件读写数据其实是在读写内核缓冲区。
pipe函数调用成功返回0,调用失败返 回-1。
//调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信, //它有一个读端一个 写端,然后通过filedes参数传出给用户程 //序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指 //向管道的写端 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { int fd[2]; pid_t tid; char buf[1024]; //用来当做一个缓冲区 int ifp; ifp = pipe(fd); //创建一个pipe管道 if(ifp == -1){ //判读是否创建成功,(pipe成功返回 0 失败返回 -1) printf("error 18行\n"); exit(1); } tid = fork(); if(tid == -1){ //判读子进程是否创建成功 printf("子进程没有创建成功,在24行\n"); exit(1); }else if(tid > 0){ //如果tid大于0 那么这个就是父进程 //父进程执行以下代码 close(fd[1]); //父进程关闭写端 read(fd[0], buf, sizeof(buf)); //从管道的读端读取内容 存放到buf变量里面 printf("这是父进程读到的内容: %s\n",buf); //将读到内容 打印出来 }else if(tid == 0){ //如果tid等于0, 那么这个进程就是子进程 sleep(2);//首先睡眠两秒 等待父进程就绪 close(fd[0]); //子进程关闭读端 write(fd[1], "www.zploo.com", sizeof("www.zploo.com")); } return 0; }