【问题标题】:Using execvp with Input,Output and redirection将 execvp 与输入、输出和重定向一起使用
【发布时间】:2014-06-12 21:19:40
【问题描述】:

在 C 程序中,假设我想使用 Exec 函数来执行给定的程序,例如,如果我只想尝试 ls -l 我会做类似的事情

args[0]="ls";
args[1]="-l";
args[2]=NULL;

...
execvp("ls", args); 

一切都很好。现在,如果我还想将重定向添加到文件(或 stderr)怎么办? 我被卡住了,很明显将 >log.txt 作为数组中的第三个条目添加是行不通的,但我不知道如何继续。

另外,如果我想传递一些输入参数怎么办?如果我想执行一个像“gcc -o out in redirection>log.txt”这样的GCC命令怎么办?

[评论更新:]

这是一个模拟shell的C程序,可以“运行字符串”,字符串包含命令、参数列表、输入和重定向。

【问题讨论】:

  • "如果我想传递一些输入参数怎么办?" - args 数组不是为了正是那个目的吗? (如果你想管道文本进出stdin/stdout,你需要popen()。)
  • @OliCharlesworth 是否保证freopen 之后不仅流而且文件描述符都相同?

标签: c unix redirect exec


【解决方案1】:

在 shell 中运行命令:

char * args[] = {
  "sh",
  "-c",
  "ls -l >out.ls 2>err.ls <in.ls",
  NULL
};

...

execvp(args[0], args); 
perror("execvp() failed");

【讨论】:

  • 很抱歉,但我是新手,我没有在 OP 中暗示所有这些都必须用 C 程序编写,这个解决方案是否适用于我正在做的事情?我不是一个 C 程序,它模拟可以“运行字符串”的 shell,字符串包含命令、参数列表、输入和重定向。假设我必须为 SH 做更多的研究,到目前为止我从未见过 sh -c ...stuff
  • @ro.nin:对于此类要求,Deduplicator 的回答 (stackoverflow.com/a/23322407/694576) 所描述的方法更适合。
【解决方案2】:

只需将文件描述符设置为exec-d 进程将找到它们然后执行。
为此,您需要 opendup2close

exec-family 中的所有函数只是用你说的任何一个替换当前进程。

【讨论】:

  • 谢谢你的回答,我想我正在输出部分。这也适用于输入的东西?将 stdIn 的文件描述符更改为我想成为(例如)gcc 的 input.c 的文件?
  • 是的,只需设置您希望新可执行文件继承的任何环境。
猜你喜欢
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多