<html><p>Использование strtok() в ядре не представляется возможным, столкнулся с ошибкой формата:</p><p style="margin-left:40px;"><br><i>'dbgfs_monitor_on_write':mm/damon/dbgfs.c:1013:17: error: implicit declaration</i></p><p style="margin-left:40px;"><i>of function 'strtok'; did you mean 'kstrtol'?</i></p><p style="margin-left:40px;"> </p><p>Кроме того, функция избавляется в том числе и от лидирующих пробельных символов.</p><p>Использование strsep() в цикле позволяет корректно смещать указатель и перехватывать</p><p>первый токен, который будет найден до символов-разделителей (если они есть) и после.</p><p> </p><p>Замена strncmp() на менее (на первый взгляд) безопасный strcmp() гарантирует</p><p>корректность, поскольку его значение явно определено и работа с изолированным токеном,</p><p>имхо, является более безопасным вариантом, чем использовать внешний count при сравнении.<br><br>Альтернатива в виде strim() тоже отпадает, поскольку обрезается лишь значение после токена,</p><p>а теоретические лидирующие пробелы не отпадают, а значит работа будет вестить с</p><p>некорректным значением.</p><p><br>Вторник, Июнь 23, 2026 12:50 MSK, Fedor Pchelkin <pchelkin@ispras.ru> писал(а):<br> </p><blockquote type="cite" cite="20260623124743-60b6b38167686ebe07511d20-pchelkin@ispras"><p>On Tue, 23. Jun 12:43, Markov Gleb wrote:<br>> @@ -1003,19 +1003,27 @@ static ssize_t dbgfs_monitor_on_write(struct file *file,<br>> {<br>> ssize_t ret;<br>> char *kbuf;<br>> + char *token;<br>> + char *temp_buf;<br>> <br>> kbuf = user_input_str(buf, count, ppos);<br>> if (IS_ERR(kbuf))<br>> return PTR_ERR(kbuf);<br>> <br>> - /* Remove white space */<br>> - if (sscanf(kbuf, "%s", kbuf) != 1) {<br>> + /* Will use temporary to avoid problems with original */<br>> + temp_buf = kbuf;<br>> +<br>> + do {<br>> + token = strsep(&temp_buf, " \t\r\n\v\f");<br><br>Что это?<br><br>Просьба заиспользовать существующую в ядре функцию для очистки<br>пробельных символов из конца буфера.<br><br>> + } while (token && *token == '\0');<br>> +<br>> + if (!token) {<br>> kfree(kbuf);<br>> return -EINVAL;<br>> }<br>> <br>> mutex_lock(&damon_dbgfs_lock);<br>> - if (!strncmp(kbuf, "on", count)) {<br>> + if (!strcmp(token, "on")) {<br><br>Зачем?<br><br>> int i;<br>> <br>> for (i = 0; i < dbgfs_nr_ctxs; i++) {<br>> @@ -1026,7 +1034,7 @@ static ssize_t dbgfs_monitor_on_write(struct file *file,<br>> }<br>> }<br>> ret = damon_start(dbgfs_ctxs, dbgfs_nr_ctxs, true);<br>> - } else if (!strncmp(kbuf, "off", count)) {<br>> + } else if (!strcmp(token, "off")) {<br><br>Зачем?<br><br>> ret = damon_stop(dbgfs_ctxs, dbgfs_nr_ctxs);<br>> } else {<br>> ret = -EINVAL;<br>> -- <br>> 2.43.0<br> </p></blockquote><p><br><br><br> </p></html>