//管道的实现 //当前目录下实现命令"ls | wc -w" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> int main() { int pipefds[2]={0}; //创建匿名管道 if(pipe(pipefds)==-1) { perror("pipe() err"); return -1; } pid_t pid=fork(); if(pid==-1) { perror("fork() err"); return -1; } if(pid==0) { //子进程关闭读文件描述符 close(pipefds[0]); //dup2()函数把匿名管道的读文件描述符赋值给STDIN_FILENO,而STDIN_FILENO原先指向的文件表被关闭 //将ls命令的结果输出到管道中 dup2(pipefds[1],STDOUT_FILENO); //close()只是关闭文件描述符引用 现在pipefds[1]指向的文件表同时被pipefds[1]和STDIN_FILENO引用 //关闭pipefds[1],文件表还在 close(pipefds[1]); execlp("ls","ls",NULL); printf("execlp() failed !\n"); }else if(pid>0) { //关闭写文件描述符 close(pipefds[1]); dup2(pipefds[0],STDIN_FILENO); close(pipefds[0]); //wc可以从终端读取数据,此时终端就是管道 execlp("wc","wc","-w",NULL); printf("execlp() failed !\n"); } return 0; }
时间: 2024-09-29 19:42:31