UNIX在另一个程序中运行程序

时间:2011-09-22 20:55:12

标签: c unix

我正在尝试从C程序中执行程序(在UNIX中)。

我已经获得了一个可执行文件(程序在执行期间需要输入字符串并将该输入写入另一个名为sample的文件),这个文件名为exec,我想在program.c中执行它,但是通过间接给出字符串输入。 / p>

为此我创建了一个文件如下:

% vim input

我在输入文件

中写了以下内容
content

现在在program.c中,

#include<unistd.h>
int main()
{
      const char* command = "./exec < input";
      execvp(command, NULL);
      return 0;
}

当我运行程序时,内容不会输入到示例文件中。

但是当我没有间接地运行时,即

const char* command = "./exec";

然后它可以工作,输入输入保存在样本文件中。

有人可以告诉我在间接语法中做错了什么。

感谢。

3 个答案:

答案 0 :(得分:4)

您正在使用的语法应该由shell解释,如bash,csh,ksh等。

系统调用execvp只需要可执行文件的路径和一些参数,不会在那里调用shell。

要以这种方式执行重定向,您必须在调用dup2(2)之前使用execvp系统调用:

int fd = open("input", O_RDONLY);
/* redirect standard input to the opened file */
dup2(fd, 0);
execvp("/path/to/exec", ...);

当然,您需要在实际程序中进行一些额外的错误检查。

答案 1 :(得分:1)

您无法使用execvp进行重定向。使用system()或开始与dup()和朋友保持友好关系。你可能会谷歌'实现重定向'..你可能会发现很多关于shell(例如)如何处理这个问题的例子。

答案 2 :(得分:0)

exec(3)系列函数对输入重定向或解析命令行一无所知:它试图完全执行你给它的可执行文件。它正在尝试搜索名为"./exec < input"的可执行文件,这个文件不存在。

一种解决方案是使用system(3)函数而不是execsystem调用用户的shell(例如/bin/bash),它能够解析命令行并进行适当的重定向。但是,system()并不像exec那样多才多艺,所以它可能适合您的需要也可能不适合。

更好的解决方案是自己进行输入重定向。您需要做什么我们使用open(3)打开文件,dup2(3)将文件描述符复制到文件描述符0(标准输入),然后exec可执行文件。