为什么open()在linux 1.0中没有'fd'返回?

Mar*_*ark 0 c linux kernel driver

由于'fd'没有返回,它后来如何读/写?

例如:

void init(void)
{
 ....
 (void) open("/dev/tty1",O_RDWR,0);
 ....
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 7

open在那里返回一个值.cast-to-void用于向编译器发出有意忽略返回值的信号.

init函数是当前线程准备init在用户空间中执行程序的函数.init将期望打开标准输入,输出和错误描述符.完整的代码是这样的:

(void) open("/dev/tty1",O_RDWR,0);
(void) dup(0);
(void) dup(0);
Run Code Online (Sandbox Code Playgroud)

有没有需要存储的返回值到任何东西,因为open是保证用最低的空闲描述符,没有通过过程进入此功能之前所使用,从而open将返回返回0的规则相同最低自由应用于dup以及.在这3次调用之后,所有描述符0,1和2共享相同的文件描述,这也意味着您可以写入标准输入并从标准错误中读取.

这也许是一个微型的优化,但确实没有必要使用一个变量,并编译器生成的代码不合的时候开的返回值是已知的-它毕竟类似于

int fd = open("/dev/tty1",O_RDWR,0);
assert(fd == 0);
(void) dup(fd);
(void) dup(fd);
Run Code Online (Sandbox Code Playgroud)

在当前版本存在到位断言,检查该open不会失败:

/* Open the /dev/console on the rootfs, this should never fail */
if (ksys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
    pr_err("Warning: unable to open an initial console.\n");

(void) ksys_dup(0);
(void) ksys_dup(0);
Run Code Online (Sandbox Code Playgroud)

但是,实际的文件描述符返回值被忽略.