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

C 为什么在linux 1.0中open()没有“fd”返回?,c,linux,kernel,driver,C,Linux,Kernel,Driver,由于没有返回'fd',它以后如何读取/写入 例: open在其中返回一个值 init函数是当前线程准备在用户空间中执行init程序的函数。init希望打开标准的输入、输出和错误描述符。完整代码如下: (void) open("/dev/tty1",O_RDWR,0); (void) dup(0); (void) dup(0); 不需要将返回值存储到任何对象,因为open保证使用最低的空闲描述符,并且在进入此函数之前,进程不使用任何描述符,因此open将返回0。返回最低可用值的规则同样适用于du

由于没有返回'fd',它以后如何读取/写入

例:

open在其中返回一个值

init函数是当前线程准备在用户空间中执行init程序的函数。init希望打开标准的输入、输出和错误描述符。完整代码如下:

(void) open("/dev/tty1",O_RDWR,0);
(void) dup(0);
(void) dup(0);
不需要将返回值存储到任何对象,因为open保证使用最低的空闲描述符,并且在进入此函数之前,进程不使用任何描述符,因此open将返回0。返回最低可用值的规则同样适用于dup。在这3次调用之后,所有描述符0、1和2共享相同的文件描述,这也意味着您可以在标准错误中写入标准和从标准错误中读取

这可能是一个微观优化,但实际上,当open的返回值已知时,不需要使用变量,也不需要让编译器生成不合标准的代码——这毕竟与

int fd = open("/dev/tty1",O_RDWR,0);
assert(fd == 0);
(void) dup(fd);
(void) dup(fd);
存在一个断言,用于检查打开是否失败:

/* 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);

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

系统将按顺序创建描述符。如果没有,它将从0.Linux1.0源代码main.c开始。它不需要分配FD,因为它知道这将是FD 0,因为还没有打开任何其他文件。正常行为是使用函数open返回的整数值。这只是我的观点,但我会说像voidopen/dev/tty1,O_RDWR,0;假设返回值始终为零是不必要的脆弱。它完全忽略了失败的可能性,同时还假设代码运行的上下文永远不会改变。根据我的经验,这两种方法都很可能被证明是错误的。@AndrewHenle是的,它可以用if检查返回值,如果不是0则检查内核死机。
/* 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);