我有一个有趣的问题。 我正在从Linux内核向用户空间传递错误字符串。我在用户空间中有一个带有api的库。应用程序链接到此库。当应用程序调用api时,会调用ioctl并将堆栈变量传递给内核。在内核中如果有任何错误,我会对该堆栈变量执行copy_to_user。一旦ioctl返回,我检查字符串。如果它不为空,我将字符串的strncpy作为线程局部变量。因此应用程序可以打印错误。
请不要质疑设计,但是当我运行代码时,看到我的盒子一直挂着。如果我评论strncpy,那么它似乎加载正常。我做了一个测试,注意到如果我删除了strncpy并只是在控制台上打印日志,我确实看到了很多消息。
有人可以让我知道为什么控制台一直挂着。
示例代码:
\#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是库中的一个功能。功能很多。这些由链接到库的应用程序调用。