首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向execl传递参数

向execl传递参数
EN

Stack Overflow用户
提问于 2013-03-23 11:38:09
回答 2查看 4.7K关注 0票数 1

我想创建我自己的管道,就像在Unix终端中一样(只是为了实践)。应该使用这样的引号执行应用程序:

代码语言:javascript
复制
pipeline "ls -l" "grep" ....

我知道我应该使用fork()execl() (exec*)和API重定向stdin和stdout。但是,execl是否可以使用一个参数来执行app,其中包括应用程序路径和参数?有没有办法不手动解析ls -l,而是将它作为一个参数传递给execl

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-23 12:00:19

如果您只有一个命令行而不是参数向量,那么让shell为您执行解析:

代码语言:javascript
复制
execl("/bin/sh", "sh", "-c", the_command_line, NULL);

当然,不要让不受信任的远程用户输入到这个命令行。但是,如果您首先处理的是不受信任的远程用户输入,则应该按照exec[vl]的正常用法,而不是命令行,尝试将实际的孤立参数列表传递给目标应用程序。

票数 4
EN

Stack Overflow用户

发布于 2013-03-23 11:58:08

实际上,只有在编译时知道命令的参数数时,才能真正使用execl()。在shell中,您通常会使用execv()execvp();它们可以处理要执行的命令的任意数量的参数。理论上,给出命令的路径名时使用execv(),而在命令没有指定路径的情况下使用execvp() (对命令执行基于路径的搜索)。然而,execvp()处理“路径给定”的情况,所以只需使用execvp()

因此,对于您的pipeline命令,您将使用以下内容结束一个子命令:

代码语言:javascript
复制
char *args_1[] = { "ls", "-l", 0 };
execvp(args_1[0], args_1);

另一个孩子最终会使用相当于以下内容的东西:

代码语言:javascript
复制
char *args_2[] = { "grep", "pattern", 0 };
execvp(args_2[0], args_2);

当然,除了通过命令行参数而不是初始化创建这些字符串外,如图所示。请注意,grep需要搜索一个模式。

你还有管道问题要解决。确保您足够关闭管道文件描述符。当您将管道连接到标准输入或标准输出时,您将关闭来自dup()函数的两个文件描述符。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15586316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档