我正在尝试在C中创建自己的shell。它使用一个管道,输入(现在)是静态的。我使用execvp执行命令。
一切都很好,除非我运行命令ldap.yml
我没有得到任何结果。任何人都可以告诉我问题出在哪里并找到解决方案。
到目前为止的shell:
ls |grep ".c"
答案 0 :(得分:1)
删除grep参数中的引号。即使用
char *grep[] = {"grep", ".c", NULL};
如果你正在调用execvp
,那么通常的shell扩展参数(即,globbing,删除引号等)都不会发生,因此你所做的有效与
ls | grep '".c"'
在正常的shell中。
另请注意,调用execvp
后的任何内容都无法执行,execvp
替换当前进程,它永远不会返回。
答案 1 :(得分:0)
您有多个问题:
一个问题是您拨打close()
的电话太少了。当您使用dup2()
将文件描述符从管道复制到标准输入或标准输出时,您应该关闭由pipe()
返回的两个文件描述符。
第二个问题是shell会删除参数周围的双引号,但是你已经将它们添加到你的周围。您正在查找名称包含".c"
的文件(其中双引号是要搜索的文件名的一部分)。使用:
char *grep[] = { "grep", "\\.c$", NULL };
这会在该行的末尾查找一个点和c
。
您应该在execvp()
之后报告失败。如果任何exec*()
函数返回,则失败。例如,当用户输入错误的命令名称时,可能会发生这种情况。报告错误并且子进程随后退出至关重要。如果你不这样做,你可以最终进入一个正常的迭代shell(而不是这个一次性,非迭代,非交互式的shell),多个shell进程都试图从终端读取时间,这会导致混乱和混乱。