为什么你会复制一个文件描述符并且从不使用它?

Why would you duplicate a filedescriptor and never use it?

这是部分:

extern fin;
char line[64];

if (argc<2 || ttyn(0)!='x') {
        write(1, "goto error\n", 11);
        seek(0, 0, 2);
        return;
}
seek(0, 0, 0);
fin = dup(0);

注意整个代码中"fin"只出现在上面的部分。 那么为什么要复制标准输入 (在本例中是 file/script), 将其存储在fin 并且从不使用它?

你可以在这里找到完整的代码http://v6shell.org/history/goto.c with Syntax-Highlighting here http://pastebin.com/uAvANLdR

附言。这是K&R-C。使用的命令 dup 描述如下:http://man.cat-v.org/unix-6th/2/dup

更新: 我发现,命令 getchar 实际上需要它。看这里http://man.cat-v.org/unix-6th/3/getchar

但我还是不明白你为什么需要它。现在有人可以告诉我吗?

我能想到的一个原因是,如果 fd 0 (stdin) 是管道 (2) 的读取端并稍后关闭(即在调用 execve(2) 之后),那么任何试图写入的人该管道仍将被阻塞,并且不会获得 SIGPIPE 信号。

如果您查看 getchar(3) 的手册页

http://man.cat-v.org/unix-6th/3/getchar

有这个小块说明:

Associated with this routine is an external variable called fin, which is a structure containing a buffer such as described under getc (III).

所以如果我们仔细看看 getc(3)

http://man.cat-v.org/unix-6th/3/getc

我们看到:

struct buf {
  int fildes;     /* File descriptor    */
  int nleft;      /* Chars left in buffer */
  char *nextp;    /* Ptr to next character */
  char buff[512]; /* The buffer */
};

goto.c 中的代码现在通过告诉编译器 "fin" 是 int 类型来进行修改。实际上 "fin" 具有 struct buf 类型,但由于 "int filedes;" 是代码执行的结构的第一个成员,实际上与:

extern struct buf fin;

...

seek(0, 0, 0);
fin.fildes = dup(0);

正如我所说,这是一个 hacky 解决方案,但代码看起来很旧,里面有所有 goto。