Почему open () не имеет возврата 'fd' в linux 1.0? - PullRequest
0 голосов
/ 11 февраля 2019

Поскольку нет возврата 'fd', как он будет читать / писать позже?

ex:

void init(void)
{
 ....
 (void) open("/dev/tty1",O_RDWR,0);
 ....

1 Ответ

0 голосов
/ 11 февраля 2019

open возвращает значение там. Преобразование в пустоту используется для указания компилятору, что возвращаемое значение намеренно игнорируется.

Функция init - это та, в которой текущий поток готов выполнитьinit программа в пространстве пользователя.init будет ожидать открытия стандартных дескрипторов in, out и error.Полный код такой:

(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 не отказывает:

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

Однако,фактические возвращаемые значения дескриптора файла игнорируются.

...