C 为什么我们需要 `execv()` 进行重定向?
C Why we need `execv()` for redirection?
在我的 class 中,教授展示了我们如何使用 execv()
进行 output/input 重定向,因为 execv()
不会替换进程的当前文件object table (FDT):
但我不明白,为什么我们需要使用 execv()
并调用 fork()
,这与使用 parent 进程打开该文件和使用 open()
和 write()
.
写入
另一个问题: 为什么 parent 需要等待 child?
shell code:
pid_t pid = fork();
if (pid == 0) {
close(1);
open("file.txt",
O_CREAT …, …);
char* args[] =
{"date", NULL};
execv(args[0],
args);
} else {
wait(NULL);
}
使用 execv
可以执行外部命令,在本例中为 date
.
父进程可以自己用open
和write
写入文件,但是你要在那里写什么文本?您将不得不编写自己的代码来确定当前日期和时间,并以正确的方式对其进行格式化。执行 date
命令可以避免重新发明轮子。
需要wait
来确保子进程在父进程继续之前终止。否则,父进程可能会在子进程仍在工作时完成。用户可能希望当您的程序 returns 时,文件 file.txt
已完成并包含正确的数据,并且他们可以立即 运行 使用该文件内容的另一个命令。如果没有 wait
,则无法保证。
在我的 class 中,教授展示了我们如何使用 execv()
进行 output/input 重定向,因为 execv()
不会替换进程的当前文件object table (FDT):
但我不明白,为什么我们需要使用 execv()
并调用 fork()
,这与使用 parent 进程打开该文件和使用 open()
和 write()
.
另一个问题: 为什么 parent 需要等待 child?
shell code:
pid_t pid = fork();
if (pid == 0) {
close(1);
open("file.txt",
O_CREAT …, …);
char* args[] =
{"date", NULL};
execv(args[0],
args);
} else {
wait(NULL);
}
使用 execv
可以执行外部命令,在本例中为 date
.
父进程可以自己用open
和write
写入文件,但是你要在那里写什么文本?您将不得不编写自己的代码来确定当前日期和时间,并以正确的方式对其进行格式化。执行 date
命令可以避免重新发明轮子。
需要wait
来确保子进程在父进程继续之前终止。否则,父进程可能会在子进程仍在工作时完成。用户可能希望当您的程序 returns 时,文件 file.txt
已完成并包含正确的数据,并且他们可以立即 运行 使用该文件内容的另一个命令。如果没有 wait
,则无法保证。