ls |用C语言写的shell中的grep

时间:2015-11-25 21:35:09

标签: c shell

我正在尝试在C中创建自己的shell。它使用一个管道,输入(现在)是静态的。我使用execvp执行命令。 一切都很好,除非我运行命令ldap.yml我没有得到任何结果。任何人都可以告诉我问题出在哪里并找到解决方案。

到目前为止的shell:

ls |grep ".c"

2 个答案:

答案 0 :(得分:1)

删除grep参数中的引号。即使用

char *grep[] = {"grep", ".c", NULL};

如果你正在调用execvp,那么通常的shell扩展参数(即,globbing,删除引号等)都不会发生,因此你所做的有效与

相同
ls | grep '".c"'

在正常的shell中。

另请注意,调用execvp后的任何内容都无法执行,execvp 替换当前进程,它永远不会返回。

答案 1 :(得分:0)

您有多个问题:

  1. 一个问题是您拨打close()的电话太少了。当您使用dup2()将文件描述符从管道复制到标准输入或标准输出时,您应该关闭由pipe()返回的两个文件描述符。

  2. 第二个问题是shell会删除参数周围的双引号,但是你已经将它们添加到你的周围。您正在查找名称包含".c"的文件(其中双引号是要搜索的文件名的一部分)。使用:

    char *grep[] = { "grep", "\\.c$", NULL };
    

    这会在该行的末尾查找一个点和c

  3. 您应该在execvp()之后报告失败。如果任何exec*()函数返回,则失败。例如,当用户输入错误的命令名称时,可能会发生这种情况。报告错误并且子进程随后退出至关重要。如果你不这样做,你可以最终进入一个正常的迭代shell(而不是这个一次性,非迭代,非交互式的shell),多个shell进程都试图从终端读取时间,这会导致混乱和混乱。