为什么你会复制一个文件描述符并且从不使用它?
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。
这是部分:
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。