自学内容网 自学内容网

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;
}

 运行结果一样:

 


原文地址:https://blog.csdn.net/weixin_74027669/article/details/141969895

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!