繁体   English   中英

为什么execlp不允许我使用管道?

[英]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作为第二个命令
  • 将第一个命令的输出连接到第二个输入。

您可以在forkpipeexeclp的帮助下显式地执行此操作,但是您必须准备管道,并且显式地进行fork才能具有2个进程。

另外,您可以要求外壳程序执行此操作:

execlp("/bin/sh" , "sh", "-c", "ls -l | sort", NULL);

当您在shell中编写以下命令时

ls -l | sort

执行两个程序: lssort

竖线字符( | )表示第一个的输出应重定向到第二个的标准输入。 此管道由您的外壳程序解释。 它不是命令的参数。

execlp将程序的名称及其参数作为参数。

所以当你写

execlp("ls" , "ls", "-l", "|" , "sort", NULL);

因为| sort不是ls参数。

您想要做的是shell为您做的事情:

  1. 声明管道
  2. 做一个fork,将stdout重定向到管道(使用dup ),然后执行ls

     execlp("ls" , "ls", "-l", NULL); 
  3. 做一个分支,将管道重定向到stdin并执行sort

     execlp("sort" , "sort", NULL); 
  4. 关闭管道,等待,等等。

有一个简单的方法可以做到这一点。 它涉及使用函数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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM