将execvp与输入文件一起使用到程序,并将输出重定向到新文件

将execvp与输入文件一起使用到程序,并将输出重定向到新文件,c,linux,redirect,exec,C,Linux,Redirect,Exec,我确实尝试过使用,但无法正确使用(请注意链接,然后再将其作为可能的副本引用) 在我的程序中,我试图运行一个程序,使用一个文本文件作为输入,并将程序的输出重定向到一个新文件 这是我的密码: if (fork() == 0) { char *args[]={"program",">","output.txt",NULL}; int fd = open("/input.txt", O_RDONLY); dup2(fd, 0); execvp("program",

我确实尝试过使用,但无法正确使用(请注意链接,然后再将其作为可能的副本引用)

在我的程序中,我试图运行一个程序,使用一个文本文件作为输入,并将程序的输出重定向到一个新文件

这是我的密码:

if (fork() == 0) {
    char *args[]={"program",">","output.txt",NULL}; 
    int fd = open("/input.txt", O_RDONLY);
    dup2(fd, 0);
    execvp("program",args);

    return 0;
}
program.c
是我试图运行的程序(不是我的主程序)
/input.txt
是我想用作
程序.c
output.txt
是我想将程序输出重定向到的文件 我知道要重定向我的程序输出,我应该使用
programname>outputfile

但我不能让它工作,我想可能我在
args数组
上做错了什么。发送
input.txt
作为
program.c
的输入并将其输出重定向到
output.txt
的正确方法是什么?(请注意,我的主程序不是
program.c


使用
programname>outputfile
是shell的一项功能,任何帮助都将不胜感激。shell为您打开输出文件,并将文件描述符复制到
1
stdout

如果您不想运行shell,可以在调用
exec*
之前使用
open
dup2
执行输入重定向。试着这样做:

int fdOut = open("output.txt", O_WRONLY | O_CREAT);
/* don't forget to check fdOut for error indication */
int rc = dup2(fdOut, 1);
/* also check the return code for errors here */

我在问题中提到的@Chris Turner的可能副本我试图将其用作参考,但无法使我的程序正常运行,但您成功地使用了该答案来正确重定向输入。重定向输出正是关键所在same@Chris特纳:这是怎么回事?im使用int fd=open(“/input.txt”,仅限ordu);对于输入,但据我所知,输出应该作为args数组中的programname>outputfile使用,在回答中,他们也将args数组用于输入,我没有设法这样做,因为您
打开一个文件并使用
dup2
替换stdout,与副本中的答案和下面的答案完全相同。您的意思是在dup2(fd,0)之后使用您的代码吗;在execvp(“程序”,args)之前?并使char数组仅为char*args[]={“program”,NULL};?那么执行官会怎么做?它不会产生问题,比如输入的是witch文件,输出的是哪一个?@ashly是的,这就是我的意思。执行的
程序
将不知道它连接到哪个输入和输出文件。它必须从
stdin
(文件描述符
0
)读取其输入,并将其输出写入
stdout
(文件描述符
1
)。这就是输入和输出重定向的目的。我想我知道了,谢谢,还有一件事,如果你不介意的话,每当我运行程序时,我都看不到输出,使用“program”而不是“program.c”/“program-c”是否正确?或者“/input.txt”而不是“input.txt”@ashly“我真的看不到输出”是什么意思“。它不显示在输出文件中吗?找不到输出文件?在终端窗口中看不到任何输出?如果源代码是
program.c
,则编译的程序可能命名为
program
/input.txt
是根目录中的一个文件,可能是错误的
input.txt
是当前工作目录中的文件。请检查所有调用函数的返回码,因为它会告诉您是否出现了问题。