[英]Why doesn't execlp allow me to use a pipe?
#include <stdio.h>
#include <unistd.h>
main()
{
execlp("ls" , "ls", "-l", "|" , "sort", NULL);
}
怎么了 请帮忙。
如果我这样写: execlp("ls" , "ls", "-l", NULL);
然后结果显示在屏幕上,如果我尝试使用此execlp("ls" , "ls", "-l", "|" , "sort", NULL);
屏幕显示错误消息无法访问 。
为什么? 有人有什么主意吗? 为什么在执行命令execlp
时不允许使用管道( |
)?
管道是壳结构。 execlp()
不受shell解析; 它将参数直接传递给命名命令。 要获得外壳功能,您需要显式启动外壳过程。
execl("/bin/sh", "/bin/sh", "-c", "ls -l | sort", NULL);
在这种情况下,最好指定外壳程序/bin/sh
的绝对路径,这意味着您可以使用execl
而不是execlp
。
糟糕,您感到困惑。 exec...
家庭功能允许执行一个单独的程序来代替调用方。 因此,您的程序只需使用"-l"
, "|"
执行ls
命令 , "sort"
作为参数。
这是它交互式提供的内容:
$ ls "-l" "|" "sort"
ls: sort: No such file or directory
ls: |: No such file or directory
在另一端,然后执行normals ls -l | sort
在外壳中ls -l | sort
, |
由shell解释 。 和外壳 :
ls -l
作为第一个命令 sort
作为第二个命令 您可以在fork
, pipe
和execlp
的帮助下显式地执行此操作,但是您必须准备管道,并且显式地进行fork才能具有2个进程。
另外,您可以要求外壳程序执行此操作:
execlp("/bin/sh" , "sh", "-c", "ls -l | sort", NULL);
当您在shell中编写以下命令时
ls -l | sort
执行两个程序: ls
和sort
。
竖线字符( |
)表示第一个的输出应重定向到第二个的标准输入。 此管道由您的外壳程序解释。 它不是命令的参数。
execlp
将程序的名称及其参数作为参数。
所以当你写
execlp("ls" , "ls", "-l", "|" , "sort", NULL);
因为|
和sort
不是ls
参数。
您想要做的是shell为您做的事情:
有一个简单的方法可以做到这一点。 它涉及使用函数popen
:
#include <stdio.h>
#include <unistd.h>
int main() {
FILE* out = popen("ls -l | sort", "w");
pclose(out);
return 0;
}
但是,这可能不是您想要的,因为它不使用exec。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.