Olej писал(а): ↑29 авг 2022, 22:55
Я бы так не делал.
Обратите вниманиена функцию чтения /proc/mod_loop/period как я её сделал:
Код: Выделить всё
static char buf_msg[LEN_MSG + 1];
static ssize_t node_read(struct file *file, char *buf,
size_t count, loff_t *ppos) {
static bool first = false;
int res;
if ((first = !first)) {
sprintf(buf_msg, "%u", period);
printk("! return %lu bytes: <%s>\n", strlen(buf_msg), buf_msg);
strcat(buf_msg, "\n");
res = copy_to_user((void*)buf, buf_msg, strlen(buf_msg));
return strlen(buf_msg);
} else {
*ppos = 0;
printk("! return EOF\n");
return 0;
}
}
Вас никак не удивляет флаг first и
зачем это сделано?
А затем, что
семантика POSIX операции ssize_t read(int fd, void *buf, size_t count); - предписывает:
- операция read читает count байт из дескриптора fd ...
- и смещает позицию чтения, offset, файлового дескриптора на count ...
- и так до тех пор (в цикле), пока не будет прочитано ssize_t = 0 байт - что означает конец файла, EOF, и на этом цикл чтений
нужно прекращать.
И эту семантику стандарта POSIX
знает и исполняет утилита cat ... как и
все утилиты Linux!
И cat будет читать 2 раза - 1 раз число, и следующий раз 0 байт, что будет означать что читать больше нечего.
И так же точно как
все утилиты Linux эти принципы POSIX и Linux должны знать и
исполнять и мы, даже когда это не требуется по техзаданию!!!
Вот в той операции node_read() мы могли бы тупо возвращать при каждом вызове своё число ... и на всё остальное забить. Но здесь при 1-м чтении возвращается число, а при следующем - EOF, что позволяет
читающей программе
после этого сделать close() для читаемого дескриптора файла.
P.S. Даже эта показанная реализация искусственно упрощённая - потому что запрос числа читаемых байт может быть
короче, чем длина имеющегося у нас результата, и тогда мы должны возвращать
по частям строку результата.