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,您将会有很长的路要走,所以我不会在这里写一个完整的实现来剥夺您的乐趣.
我正在尝试将子进程的 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,您将会有很长的路要走,所以我不会在这里写一个完整的实现来剥夺您的乐趣.