gpt4 book ai didi

c - 如何将文件内容重定向到标准输入,为什么 exec 函数不起作用?

转载 作者:行者123 更新时间:2023-11-30 19:39:28 28 4
gpt4 key购买 nike

我想将 input.txt 文件的内容重定向到标准输入。

我尝试过:

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;
}

但是由于所有的 fork ,很难调试。execv - 在“getcwd”返回-1之后。a.out 是一个通过 scanf() 获取输入的程序,然后执行某些操作并打印答案。

我应该获取一个文件,将其转换为标准输入以获取 a.out 的 fgets,然后打开一个新文件作为 a.out 的输出。

它仍然不起作用,我尝试了你的修复:

    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 适用于不同的用户(我的 friend 之前尝试过)。

最佳答案

来自In C how do you redirect stdin/stdout/stderr to files when making an execvp() or similar call? :

正确的方法是替换文件描述符 STDIN_FILENOSTDOUT_FILENO STDERR_FILENO 使用打开的文件 dup2()然后您还应该关闭子进程中的原始文件:

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() 以及上面的其余代码

除此之外,您还可以使用 freopen() ( Rerouting stdin and stdout from C )

freopen("newin", "r", stdin); (不分配文件句柄 [!])

这些链接也很有趣,因为它们提供了有关系统函数的信息,例如 fork()dup2()...

How to execute a shell script from C in Linux?

Bash: read stdin from file and write stdout to file

关于c - 如何将文件内容重定向到标准输入,为什么 exec 函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36513265/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com