Насколько я понял, мне в один присест надо изменять и период и имя файла, то есть сразу все считать...
В итоге я все изменения кидаю в один буфер...Не знаю, по-варварски как-то вышло
Модератор: Olej
Я бы так не делал.PaiMeiPetrovich писал(а): ↑29 авг 2022, 21:14Насколько я понял, мне в один присест надо изменять и период и имя файла, то есть сразу все считать...
В итоге я все изменения кидаю в один буфер...
И тогда вам для тестирования модуля не нужны никакие свои тестовые программы - всё тестирование и отладка делается с помощью cat и echo ... и других стандартных утилит пишущих и читающих. При этом решается попутно важнейшая задача: проверка своего творения на совместимость с POSIX стандартами! (потому что сами утилиты все - совместимые!).
Код: Выделить всё
main() {
...
int fd1= open("/proc/mod_loop/period", ...);
read(fd1, ... );
write(fd1, "20", ...);
...
int fd2= open("/proc/mod_loop/file", ...);
read(fd2, ... );
write(fd2, "new_file", ...);
...
}
Обратите вниманиена функцию чтения /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;
}
}
И для более длинного результата, имени файла, /proc/mod_loop/file - чтение должно бы делаться корректно как-то так ... я взял просто готовый фрагмент из своей книги, по этому типу:
Код: Выделить всё
static char *get_rw_buf(void) {
static char buf_msg[LEN_MSG + 1] =
".........1.........2.........3.........4.........5\n";
return buf_msg;
}
// чтение из /proc/mod_proc :
static ssize_t node_read(struct file *file, char *buf,
size_t count, loff_t *ppos) {
char *buf_msg = get_rw_buf();
int res;
LOG("read: %ld bytes (ppos=%lld)\n", (long)count, *ppos);
if(*ppos >= strlen(buf_msg)) { // EOF
*ppos = 0;
LOG("EOF");
return 0;
}
if(count > strlen(buf_msg) - *ppos)
count = strlen(buf_msg) - *ppos; // это копия
res = copy_to_user((void*)buf, buf_msg + *ppos, count);
*ppos += count;
LOG("return %ld bytes\n", (long)count);
return count;
}
Код: Выделить всё
int res;
do {
if((res = read(df, p, 1)) >= 0) {
...
}
else printf("read device error: %m\n");
} while (res > 0);
Точно, удивило, забыл записать (и задать соответственно) этот вопрос!
Ну да, и просто 2 open() сделать...
Тут у меня именно по заданию программку надо было сделать. (ну а так да,понял про cat i echo)
Программу можно сделать, и даже не одну ... но потом!PaiMeiPetrovich писал(а): ↑30 авг 2022, 12:57Тут у меня именно по заданию программку надо было сделать. (ну а так да,понял про cat i echo)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей