2011-09-22 81 views
2

我想从C程序(在UNIX中)执行程序。在另一个程序中运行UNIX程序

我给了一个可执行文件(该程序需要在执行过程中输入字符串,并将该输入写入另一个名为sample的文件),并且我想在program.c中执行它,但是通过间接方式给出字符串输入。

对于我创建了一个文件,如下所示:

% vim input 

我写的输入文件

content 

现在program.c里面以下,

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

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

但是当我运行它没有间接的,即

const char* command = "./exec"; 

然后它的工作原理,并保存在示例文件输入输入。

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

谢谢。

回答

4

您使用应该由诸如bash,CSH,ksh的壳来解释语法等

系统调用execvp只预计可执行文件路径和一些参数,外壳没有在那里调用。

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

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

当然,你需要一些额外的错误在现实世界中的程序检查。

1

您不能像execvp那样执行重定向。使用system()或开始与dup()和朋友友好。你可能会google'实现重定向'..你可能会举出很多shell(例如)如何处理这个问题的例子。

0

exec(3)函数家族并不知道任何关于输入重定向或解析命令行的任何信息:它会尝试正确执行您提供的可执行文件。它试图搜索名称为"./exec < input"的可执行文件,这并不令人惊讶地不存在。

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

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