C为什么我们需要'execv()`进行重定向?

C为什么我们需要'execv()`进行重定向?,c,linux,shell,unix,system-calls,C,Linux,Shell,Unix,System Calls,在我的课堂上,教授向我们展示了如何使用execv()进行输出/输入重定向,因为execv()不会替换进程的当前文件对象表(FDT): 但我不明白,为什么我们需要使用execv()并调用fork(),这与使用父进程打开该文件并使用open()和write()对其进行写入有何不同 另一个问题:为什么父母需要等待孩子 shell code: pid_t pid = fork(); if (pid == 0) {    close(1);    open("file.txt",  

在我的课堂上,教授向我们展示了如何使用
execv()
进行输出/输入重定向,因为
execv()
不会替换进程的当前文件对象表(FDT):

但我不明白,为什么我们需要使用
execv()
并调用
fork()
,这与使用父进程打开该文件并使用
open()
write()
对其进行写入有何不同

另一个问题:为什么父母需要等待孩子

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
命令可以避免重新发明轮子


需要等待,以确保在父进程继续之前子进程已终止。否则,父进程可能会在子进程仍在工作时完成。用户可能希望当程序返回时,文件
file.txt
已完成并包含正确的数据,并且可以立即运行另一个使用该文件内容的命令。如果没有
等待
,则无法保证这一点。

您可能希望使用
execvp
;否则,您需要将
date
替换为完整路径,例如
/usr/bin/date
@NateEldredge我知道,假设它在当前文件中,这是我的教授写的,是不是错了?“否则,父进程可能会在孩子还在工作时完成”父进程完成后,子进程不会终止吗?@lion:不会。由
fork()
创建的子进程独立于父进程运行,并且可以在父进程退出后继续运行。当父级退出时,它不会自动终止(尽管在某些情况下可能会自动终止,这与会话和控制终端有关——这很复杂)。后台作业和后台进程就是这样工作的。@lion:即使是这样,它也会使
等待变得更重要-如果父进程在子进程完成之前退出并终止子进程,文件可能根本无法正确写入。添加另一个重要的原因,使其始终等待()在父进程逻辑中的某个子进程上:wait()调用将允许内核清理子进程的资源。如果不这样做,子进程将成为僵尸进程。在父级读取之前,确保子级已完成其工作,可以使用其他机制实现结果,但仍应执行wait()。