/** * 低级管道操作 * 建立低级管道用pipe函数。 * 建立管道后Linux会同时为该进程建立两个文件描述副pipe_fd[0],pipe_fd[1]. * pipe_fd[0]用来读数据,pipe_fd[1]用来写数据 * * 只要使用write、read即可读写数据,对管道而言,用write函数把数据从管道写入 * pipe_fd[0],用read函数从pipe_fd[1]读取数据到管道。 * */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <string.h> int main() { pid_t result; int r_num; int pipe_fd[2]; char buf_r[100]; memset(buf_r, 0, sizeof(buf_r));//把buf_r所指的内存区域的前sizeof(buf_r)得到的字节置为0 if(pipe(pipe_fd) < 0)//调用pipe创建一个管道 { printf("创建管道失败"); return -1; } result = fork(); if(result < 0) { perror("创建子进程失败"); exit; }else if(result == 0)//返回0代表子进程 { close(pipe_fd[1]); //关闭写操作 if( (r_num = read(pipe_fd[0], buf_r, 100)) > 0) { printf("子进程从管道读取%d个字符,读取的字符串是%s/n",r_num, buf_r); } close(pipe_fd[0]); exit(0); }else{ //返回大于0代表父进程 close(pipe_fd[0]);//关闭读操作 if( write(pipe_fd[1], "第一传文字", 10) != -1) { printf("父进程向管道写入第一传文字/n"); } if( write(pipe_fd[1], "第二传文字", 10) != -1) printf("父进程向管道写入第二传文字/n"); close(pipe_fd[1]); waitpid(result, NULL, 0);//调用waitpid阻塞父进程,等待子进程退出 exit(0); } }