C - 重定向子进程的IO

C - Redirecting IO of Child Process

我正在尝试将子进程的 IO(在 fork() 之后)重定向到一个文件中,但我不明白为什么它不起作用。

这是我所做的:

if(fork() == 0){
    execv(exe, (char*[]){ exe, "> temp.exe" });
    ...

并且可执行文件运行,但它不会重定向到文件。如果有人能解释我做错了什么以及我应该怎么做,我将不胜感激。我感觉我需要在 execv() 之前重定向,但我不知道该怎么做。

提前致谢!

Shell 重定向(如 > file)由 shell 实现。通过使用 execve(),您将绕过 shell;子进程将在 argv 中看到 "> temp.exe",并将尝试将其作为参数处理。

如果你想将输出重定向到一个文件,最简单的方法是自己实现重定向,方法是在分叉后打开文件并使用 dup2() 将其文件描述符移动到标准输出:

if (fork() == 0) {
    int fd = open("temp.exe", O_CREAT | O_WRONLY, 0666);
    if (fd < 0) { handle error... exit(255); }
    dup2(fd, 1);
    close(fd);
    execv(exe, ...);
}

execX() 系列调用不具有与 system() 或 popen() 相同的灵活性。后一种方法调用 shell 来解释命令。

execX 调用的参数是您要 运行 的程序的确切路径以及您要提供给该程序的参数。在调用 execX 之前,您必须自己实现任何 "shell" 功能,例如重定向。

或者,您可以让 shell 实际完成工作,execp("sh","sh",myexe+" >test.txt");,但那是懒惰的,那么为什么不直接使用系统呢?

两个非常有用的方法是 pipe() 和 dup2(): pipe 允许您为主机程序创建管道; dup2 允许您设置一个场景,其中正在执行的程序认为它正在写入 stdout (1) 或从 stdin (0) 读取,但实际上正在写入或读取您创建的文件或管道。

通过阅读 pipe 和 dup2 的手册页,或者在 google 中寻找 exec pipe 和 dup2,您将会有很长的路要走,所以我不会在这里写一个完整的实现来剥夺您的乐趣.