У меня был интересный вопрос.Я передаю строку ошибки из ядра Linux в пользовательское пространство.У меня есть библиотека в пространстве пользователя с API.Приложения ссылаются на эту библиотеку.Когда приложение вызывает API, вызывается ioctl, и я передаю переменную стека в ядро.В стороне от ядра, если есть какая-либо ошибка, я делаю copy_to_user для этой переменной стека.Как только ioctl возвращается, я проверяю строку.Если он не пустой, я делаю strncpy строки в локальной переменной потока.Таким образом, приложение может напечатать ошибку.
Пожалуйста, не подвергайте сомнению дизайн, но видите, что мой ящик продолжает зависать, когда я запускаю код.Если я закомментирую strncpy, то, похоже, он нормально загружается.Я сделал тест и заметил, что если я удаляю strncpy и просто печатаю журнал на консоли, я вижу много сообщений.
Так может кто-нибудь, пожалуйста, дайте мне знать, почему консоль продолжает зависать.
EDIT1:
Пример кода:
\#define: Length 160
typedef struct va_define{
char str[LENGTH];
}var_define;
File: lib.c
__thread var_define var;
API1(struct pass){
var_define tt;
tt.str[0]=0;
pass.str = str;
ret=ioctl(ioctl_params, pass);
if(ret<0){
if(pass.str[0] ! = 0){
strncpy(var.str,tt.str,LENGTH);
}}
}
Как я уже говорил, я напечатал журнал на консоли вместо использования strncpy.Он печатает нормально.Смысл передачи строки из ядра в пользовательское пространство не проблема.
API1 - это одна функция в библиотеке.Есть много функций.Они вызываются приложениями, которые ссылаются на библиотеку.