Я не могу понять, что делает системный вызов read - PullRequest
0 голосов
/ 29 января 2020

Я не знаю, что читает после чтения 10 символов.

Исходный код выглядит следующим образом:

#include <unistd.h>

int
main(int argc, char *argv[]) {
    char buf[10];

    read(0, buf, 10);
}

Я ввожу 10 символов, и программа работает, как я ожидал, но когда я добавляю больше символов, оболочка запускает дополнительные символы как команду!

enter image description here

1 Ответ

2 голосов
/ 29 января 2020

Причина, по которой вы не можете понять, что делает код, заключается в том, что исходный код ужасен - он использует ноль "magi c number" в качестве дескриптора файла, когда он может / должен использовать STDIN_FILENO, чтобы сделать его легче увидеть, с чего он читает данные.

То, что он может сделать (если чтение не возвращает ошибку), читается со стандартного ввода 10 char (возможно, ждет, пока вы нажмете клавиши, если подключен к входу терминала); где это возможно (при условии UTF-8, где кодовые точки принимают переменное число байтов), что 10 char может быть только (например, 3 с половиной символа / кодовой точки.

Конечно, программа завершается после прочитайте, и когда это произойдет (если стандартный вход поступил с входа терминала), вход терминала будет подключен к терминалу после выхода из программы, поэтому любые данные после 10-го char (который может начинаться с искаженной) последней части многобайтовая кодовая точка ") будет go к терминалу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...