gpt4 book ai didi

c - 为什么 GNU 脚本使用两个 fork 而不是 select 和一个 fork?

转载 作者:IT王子 更新时间:2023-10-29 01:26:53 26 4
gpt4 key购买 nike

我刚刚意识到 GNU Linux 上的“脚本”二进制文件使用两个分支而不是一个。它可以简单地使用 select 而不是执行第一个 fork()。为什么要使用两个 fork ?

仅仅是因为 select 在编码时不存在并且没有人有动力重新编码它还是有正当理由?

man 1 脚本:http://linux.die.net/man/1/script

脚本来源:http://pastebin.com/raw.php?i=br8QXRUT

最佳答案

线索在代码中,我在代码中添加了一些注释。

child = fork();
sigprocmask(SIG_SETMASK, &unblock_mask, NULL);

if (child < 0) {
warn(_("fork failed"));
fail();
}
if (child == 0) {
/* child of first fork */
sigprocmask(SIG_SETMASK, &block_mask, NULL);
subchild = child = fork();
sigprocmask(SIG_SETMASK, &unblock_mask, NULL);

if (child < 0) {
warn(_("fork failed"));
fail();
}
if (child) {
/* child of second fork runs 'dooutput' */
if (!timingfd)
timingfd = fdopen(STDERR_FILENO, "w");
dooutput(timingfd);
} else
/* parent of second fork runs 'doshell' */
doshell();
} else {
sa.sa_handler = resize;
sigaction(SIGWINCH, &sa, NULL);
}
/* parent of first fork runs doinput */
doinput();

因此有三个进程在运行:

  1. dooutput()
  2. doshell()
  3. doinput()

我想您是在问为什么要使用三个进程,而不是一个进程和 select()select() 自古代 UNIX 历史以来就存在,因此答案不太可能是 select() 不存在。答案更平淡无奇。 doshell() 无论如何都需要在一个单独的进程中,因为它所做的是 exec 带有适当管道 fds 的 shell。因此,您至少需要一把 fork 。在 select() 循环中编写 dooutput()doinput() 在我看来完全可行,但实际上更容易使用阻塞 I/O 而不必担心使用 select 等。因为 fork() 相对轻量级(给定 UNIX 的 CoW 语义)并且两个进程之间几乎不需要通信,为什么在 fork() 非常好并且生成更小的代码时使用 select()? IE 的真正答案是“为什么不呢?”

关于c - 为什么 GNU 脚本使用两个 fork 而不是 select 和一个 fork?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22205866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com