【发布时间】:2015-03-20 21:32:53
【问题描述】:
我需要通过管道传输一个已拆分为单独参数的字符串。例如,
cd foo | cat bar.txt
已被解析并存储到数组中
char *arr[];
arr = {"cd", "foo", "|", "cat", "bar.txt"}
我最初的想法是遍历数组,直到我看到管道并将命令存储到另一个数组中然后运行它。还有其他方法可以解决这个问题吗?
【问题讨论】:
-
看看
sprintf。形成你的字符串是微不足道的。 -
使用原字符串:system("cd foo | cat bar.txt");或系统(字符串名称);
-
不允许使用system()
-
您可以放置一个空指针来代替
|字符串,并在最后放置另一个空指针,然后材料(或多或少)适合传递给execvp()。当然cd命令需要一些特殊处理并且通常不会生成任何输出——并且在管道的 LHS 上,无论如何都不会影响父进程,所以也许你不需要特殊处理在这种情况下。cat无论如何都会忽略其标准输入,因为它被赋予了要列出的文件名。 -
cd foo | cat bar.txt不是有效的管道命令。但我认为您可能想做类似cat bar.txt | grep TEXT的事情。为此,您需要为每个命令使用fork(2),将它们的STDIN_FILENO和STDOUT_FILENO相互重定向到具有dup2(2)和pipe(2)的管道。然后为每个命令运行exec(2)系列中的任何函数。