问题描述
我想将input.txt文件的内容重定向到stdin.
I want to redirect a content of input.txt file to stdin.
我尝试过:
int RunCompiledFile(char *path, char * input, char *thirdLine, char* name){
int fdFile = open(input, O_RDONLY), exitStatus, check,
fdFileOutput = open("newOutput.txt", O_RDWR|O_CREAT, 0777), status;
char* args[] = {"comp.out", "newOutput.txt", thirdLine};
char buffer[100];
pid_t pid;
dup2(0, fdFile);
dup2(fdFileOutput , 1);
getcwd(buffer, 95);
i = strlen(buffer);
buffer[i] = '/';
buffer[++i] = '\0';
check = execv(buffer,"a.out");
close(fdFileOutput);
//if ((pid = fork()) == 0){
check = execvp("comp.out", args);
// return 5;}
wait(&status);
exitStatus = WEXITSTATUS(status);
switch (exitStatus){
case 1:
result("0", name, BADOUTPUT);
unlink("newOutput.txt");
return 1;
case 2:
if (depth){
char buffer[5];
sprintf(buffer, "%d", 100 - (10 * depth));
result(buffer, name, WRONGDIRECTORY);}
else
result("100", name, GREATJOB);
unlink("newOutput.txt");
return 1;
case 3:
result("80", name, SIMILLAROUTPUT);
unlink("newOutput.txt");
return 1;
}
return fdFileOutput;
}
但是由于所有分支,很难调试.execv-在"getcwd"返回-1之后.a.out是一个程序,它通过scanf()获取输入,然后执行某些操作并打印出答案.
But becuase of all the forks it's hard to debbug.the execv - after the "getcwd" returns -1.a.out is a program the gets input via scanf(), and then does something and printf the answer.
我应该得到一个文件,将其转换为stdin以获取a.out的fget,然后打开一个新文件以输出a.out.
I am supposed to get a file, turn it to stdin for the fgets of a.out,and then open a new file for the output of a.out.
它仍然不起作用,我尝试了您的修复程序:
it's still doesn't work, I tried your fixes:
dup2(fdFile, STDIN_FILENO);
dup2(fdFileOutput, STDOUT_FILENO);
getcwd(buffer, 95);
i = strlen(buffer);
buffer[i] = '/';
buffer[++i] = 'a';
buffer[++i] = '.';
buffer[++i] = 'o';
buffer[++i] = 'u';
buffer[++i] = 't';
buffer[++i] = '\0';
close(fdFileOutput);
close(fdFile);
check = execv(buffer,"a.out");
,但是execv的返回值仍为-1.a.out在不同的用户上工作(我的朋友以前尝试过).
but the return from execv is still -1.the a.out is working on different users (my friends tried it before).
推荐答案
来自:
正确的方法是替换文件描述符 STDIN_FILENO
, STDOUT_FILENO
和 STDERR_FILENO
,并使用 dup2()
打开文件.您还应该在子进程中关闭原始文件:
The right way to do it is to replace the file descriptors STDIN_FILENO
, STDOUT_FILENO
and STDERR_FILENO
with the opened files using dup2()
. You should also then close the original files in the child process:
else if (pid == 0)
{
dup2(fileno(someopenfile), STDIN_FILENO);
dup2(fileno(someotherfile), STDOUT_FILENO);
dup2(fileno(somethirdopenfile), STDERR_FILENO);
fclose(someopenfile);
fclose(someotheropenfile);
fclose(somethirdopenfile);
execvp(args[0], args);
// handle error ...
}
因此打开输入和输出文件,创建子进程( fork()
),然后创建 dup2()
和上面的其余代码
So open input and output files, create the childprocess (fork()
) and then dup2()
and rest of the code above
除此之外,您还可以使用 freopen()
(重新路由C 中的stdin和stdout)
Beside this you can use freopen()
(Rerouting stdin and stdout from C)
freopen("newin","r",stdin);
(未分配文件句柄[!])
freopen("newin", "r", stdin);
(without assignment to file handle [!])
这些链接也很有趣,因为它们提供有关系统功能的信息,例如 fork()
, dup2()
,...
These links are also interesting because they give information about the system functions like fork()
, dup2()
,...
这篇关于如何将文件内容重定向到标准输入,为什么exec函数不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!