【问题标题】:C Why we need `execv()` for redirection?C 为什么我们需要 `execv()` 进行重定向?
【发布时间】:2021-07-19 06:18:15
【问题描述】:

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

但我不明白,为什么我们需要使用execv() 并调用fork(),这与使用父进程打开该文件并使用open() 和@987654326 写入它有什么不同@。

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

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

【问题讨论】:

  • 您可能想改用execvp;否则您需要将date 替换为完整路径,例如/usr/bin/date
  • @NateEldredge 我知道,假设它在当前文件中
  • 这是我教授写的,错了吗?

标签: c linux shell unix system-calls


【解决方案1】:

使用execv,您可以执行外部命令,在本例中为date

父进程可以用openwrite 自己写文件,但你要在那里写什么文本?您必须编写自己的代码来确定当前日期和时间,并以正确的方式对其进行格式化。执行date 命令可以避免重复造轮子。

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

【讨论】:

  • “否则,父进程可能会在子进程仍在工作时完成”父进程完成后子进程不会终止吗?
  • @lion: 不会。fork()创建的子进程独立于父进程运行,在父进程退出后可以继续运行。当父级退出时,它不会自动终止(尽管在某些情况下它可以是,与会话和控制终端有关 - 这很复杂)。这就是后台作业和守护进程的工作方式。
  • @lion:即使是这样,它也会使wait 更加重要 - 如果父级在子级完成之前退出并终止子级,则文件可能无法正确获取完全写出来了。
  • 在父逻辑的某处为子进程的 always wait() 添加另一个重要原因:wait() 调用将允许内核清理子进程的资源.如果不这样做,子进程将成为 zombie 进程。确保孩子已经完成了它的工作,在父母读取结果之前可以使用其他机制来实现,但仍然应该完成 wait()。
猜你喜欢
  • 1970-01-01
  • 2019-09-26
  • 2010-09-20
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
相关资源
最近更新 更多