利用管道实现ls -l| wc -l 命令

思路:子进程实现ls -l命令将结果返回给父进程,父进程再实现wc -l命令

在具体实现之前需要弄清一个dup函数:

int dup(int oldfd)

作用:文件描述符的复制,可以实现文件共享

实现:从小到大找第一个未使用的文件描述符, 让他和oldfd指向同一个文件表,操作任何一个都是访问同一个文件

返回值:调用成功返回新的文件描述符,失败返回-1

具体使用代码:

  1 #include<stdio.h>
  2 #include<fcntl.h>
  3 #include<unistd.h>
  4 int main()
  5 {
  6     int fd=open("abc.txt",O_WRONLY);
  7     printf("fd=%d\n",fd);                                                                                                                                
  8     close(1);
  9     dup(fd);
 10     write(1,"hehe",4);
 11 
 12 }

这里我们用close(1)关闭了文件描述符,当调用dup时,它会找第一个未使用的文件描述符也就是我们刚关闭的标准输出,这时文件描述符fd与标准输出文件描述符指向同一个文件表,我们调用write往标准输出里写的时候,也就时写到了文件abc.txt里。为了验证,我们cat以下abc.txt。

ok,理解了这个之后我们返回看ls -l|wc -l命令的实现,我们只需要调用dup将子进程的输出与父进程的输入指向同一个文件描述符即可,这就起到了类似于管道的作用。对于命令的执行,我们需要调用execlp函数,它会从PATH环境变量所指的目录中查找符合参数“ls” 以及“wc”的文件名,找到后变执行该文件。

具体实现代码:

1 //子进程执行ls -l 父进程执行 wc- l
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<fcntl.h>                                                                                                                                        
  5 #include<unistd.h>
  6 
  7 int main()
  8 {
  9     int fds[2];
 10     pipe(fds);
 11     pid_t pid=fork();
 12     if(pid==0)
 13     {
 14         close(1);
 15         dup(fds[1]);
 16         close(fds[1]);
 17         close(fds[0]);
 18         execlp("ls","ls","-l",NULL);
 19         exit(1);
 20     }
 21     else
 22     {
 23         close(0);
 24         dup(fds[0]);
 25         close(fds[0]);
 26         close(fds[1]);
 27         execlp("wc","wc","-l",NULL);
 28         exit(1);
 29     }
 30 }

实现结果:

猜你喜欢

转载自blog.csdn.net/enjoymyselflzz/article/details/81513855
l