本文主要是介绍Linux系统编程实现ls -l | wc -l指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
由于该指令是通过管道的形式实现的,所以我们要使用系统函数pipe。ls -l |wc -l的作用就是统计当前目录有多少文件。如果又父进程实现ls -l,子进程实现wc -l指令,代码如下:
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<sys/wait.h>
int main()
{int pipefd[2]={0};if(pipe(pipefd)==-1)perror("创建管道失败");int pid=fork();if(pid==0){close(pipefd[1]);dup2(pipefd[0],STDIN_FILENO);//将wc指令的输入文件描述符重定向为管道的读入端文件描述符execlp("wc","wc","-l",NULL);close(pipefd[0]);}else if(pid>0){ close(pipefd[0]);//将读端关闭dup2(pipefd[1],STDOUT_FILENO);//将标准输入的文件描述符重定向为管道的写入端文件描述符execlp("ls","ls","-l",NULL);close(pipefd[1]);}else{perror("创建进程失败");}return 0;
}
由于父子间通过管道实现,所以存在读写阻塞问题,不用担心僵尸进程的产生,所以可以不用调用wait函数回收子进程。
运行结果如下:
如果是兄弟进程实现上面的程序,代码如下
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<sys/wait.h>
int main()
{int pipefd[2]={0};if(pipe(pipefd)==-1)perror("创建管道失败");int pid;int i=0;for(;i<2;i++){if((pid=fork())==0)break;}if(i==0){close(pipefd[1]);dup2(pipefd[0],STDIN_FILENO);//将wc指令的输入文件描述符重定向为管道的读入端文件描述符execlp("wc","wc","-l",NULL);close(pipefd[0]);}else if(i==1){ close(pipefd[0]);//将读端关闭dup2(pipefd[1],STDOUT_FILENO);//将标准输入的文件描述符重定向为管道的写入端文件描述符execlp("ls","ls","-l",NULL);close(pipefd[1]);}else{close(pipefd[0]);close(pipefd[1]);//关闭父进程的读写端,保证兄弟进程间进行数据传输时,管道数据单向流通for(int i=0;i<2;i++){wait(NULL);}}return 0;
}
运行结果一样:
这篇关于Linux系统编程实现ls -l | wc -l指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!