用C语言在Linux中实现shell的输入和输出

时间:2017-01-22 17:22:24

标签: c linux shell pipe

嘿大家,我知道这是一个非常受欢迎的实现,所以我想我不需要解释那么多。现在我在shell中做的是管道操作,在我将它复制到我的大shell之前,我希望看到它在“ls -l | tail -n 2”的示例中工作。所以这是我的代码,在我的代码的最后它做什么它只是什么,它没有写任何东西,我没有得到任何分段错误。谢谢佣工! C代码:

#include <unistd.h>
#include <stdio.h>
#include <string.h>

#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>

#define OUT 1
#define IN 0

int main ()
{
    int fd,secondSon,firstSon;
    int inAndOut[2];

    char* lsArgs[2];
    lsArgs[0]= "ls";
    lsArgs[1]= "-l";

    char* tailArgs[3];
    tailArgs[0]="tail";
    tailArgs[1]="-n";
    tailArgs[2]="2";

    pipe(inAndOut);

    firstSon = fork();
    if(firstSon==0)
    {
        fd =dup2(inAndOut[OUT],STDOUT_FILENO);
        close(fd);
        execvp(lsArgs[0],lsArgs);
    }
    else
    {
        close(inAndOut[OUT]);
    }
    secondSon = fork();
    if(secondSon==0)
    {
        fd =dup2(inAndOut[IN],STDIN_FILENO);
        close(fd);
        execvp(tailArgs[0],tailArgs);

    }
    else
    {
        waitpid(-1,&firstSon,0);
        waitpid(-1,&secondSon,0);
        close(inAndOut[IN]);
    } 
    return 0;
}

1 个答案:

答案 0 :(得分:1)

有几个问题。

fd =dup2(inAndOut[OUT],STDOUT_FILENO);
close(fd);

dup2返回新的文件描述符,立即关闭它是没有意义的。你想关闭旧的。当你在它的时候,你想要关闭管道的另一半。

close(fd)的两次出现替换为

close(inAndOut[IN]);
close(inAndOut[OUT]);

两个

您需要NULL终止您的参数列表。添加最后一个元素:

char* lsArgs[3];
lsArgs[0]= "ls";
lsArgs[1]= "-l";
lsArgs[2]= NULL;

,类似于另一个参数列表。