linux函数指针
还再搞这个问题啊....
这个确实跟编译器有关的 我已经试过了
我在linux下
gcc版本:
gcc version 4.6.3 20120306 (Red Hat 4.6.3-2) (GCC)
去掉(void *) 无警告
把函数
void *mythread1
改成
int *mythread1
才会有警告
你要想真搞明白就去仔细去研究一下编译器吧
② linux0.11版本中,关于函数do_timer的疑问
void do_timer (long cpl){
...
fn = next_timer->fn;
next_timer->fn = NULL;
next_timer = next_timer->next;
(fn)();
...
}
这个函数中的函数指针是在函数void add_timer(long jiffies, void (*fn)(void))中添加的。这个函数是供内核使用的,用户空间的函数是不能调用add_timer的,也就是说 do_timer (long cpl)函数中的函数指针只会指向内核里面的函数。
(我去看了linux0.11的源码,用的地方确实只有
Floppy.c (kernel\blk_drv): add_timer(2,&transfer);
Floppy.c (kernel\blk_drv): add_timer(ticks_to_floppy_on(current_drive),&floppy_on_interrupt);
Sched.c (kernel):void add_timer(long jiffies, void (*fn)(void))
Sched.h (include\linux):extern void add_timer(long jiffies, void (*fn)(void));
)
所以的你的“内核不能直接访问用户空间函数问题”是不存在的。
我也是看到了http://bbs.chinaunix.net/thread-3727536-1-1.html这个帖子才想到的。
刚开始学这个,可能说的不对,多包涵。
③ 如何追踪linux指针函数
以下方法适合于arm平台,其它平台类似。
查看指针函数实际调用了哪个函数:http://www.Examw.com
1. 在内核中放置打印函数,打印出函数的地址。
2. arm-linux-addr2line 0xXXXXXXXX -e vmlinux -f
查看谁调用了这个函数:
1. 在被调用函数里放置打印函数,加参数:__builtin_return_address(0)
2. arm-linux-addr2line 0xXXXXXXXX -e vmlinux -f
④ linux驱动 file_operations 中int (*open) (struct inode *, struct file *);这句话open是函数指针,
这是在定义函数指针,只需要形式参数个数,类型以及返回值类型就可以决定函数指针的类型,至于形参的名字,无论叫什么都是没有影响的,因此不必要写出形参的名字。
你可以写xx,不过也会被忽略。
⑤ linux c的结构体中怎么又指针函数
c语言没有销毁变量的举措,所以不能由程序员用什么语句来销毁结构体变量。和其他基本变量一样,全局结构体变量、static修饰的结构体变量的寿命都与程序的寿命一样长,无法改变;而声明在函数中的自动(auto)结构体变量,在函数被调用时创建,函数退出时自动销毁!
⑥ linux下c语言关于指针和字符串函数调用的问题—段错误
printf("%s\n",p1);//p1代表的是字串首地址。
*p="goodbye";
//编译时会出错。正确格式p="goodbye";
char
*func()
//函数指针的写法,返回一个指针,如库函数malloc,返回就是一段内存块的首地址。
你的程序是两次输出hello,如果要将指针内容更改,可以使用你说的这个格式char
*func()
#include
"stdio.h"
char
*func();
int
main()
{
char
*p1="hello";
printf("%s\n",p1);
/*
正确输出
hello,*p1的首地址
*/
p1=func();
/*
获得goodbye的首地址
*/
printf("%s\n",p1);
getch();
return
0;
}
char
*func()
{
char
*p;
return
p="goodbye";
/*将goodbye的首地址传回*/
}
⑦ linux 用户空间怎样使用指针直接访问物理地址
调用到真正的read函数
这个文件描述结构以及它的openfread是C库函数,
系统调用read会进入内核的sys_read(好像是这个名称),它会调用到系统调用read,close,找到一个文件描述结构,
这个文件描述结构中包含了包括open, close, read, write在内的一系列的函数指针
然后,它就根据函数指针,read,write等函数,
它根据传入的文件描述符
⑧ 高手进,关于linux内核中的一类结构体,该结构体中的函数指针的参数指向这类结构体, 说下这么做有啥用
松耦合!例如现在内核从上到下有两层,A,B层。A层向上提供一个统一的接口,而B层有各种不同的实例,那么A层无需关心B层到底现在用的是哪个实例,屏蔽了底层的复杂性。
如A层现在使用了结构体struct softirq_action a, 而 a.action 可能被B层的实例赋值了不同的操作方法(这里就是函数指针),那么A层只需要用 a,它的这个函数成员被指向了它需要的地方
⑨ linux 中的signal 函数
这是个函数指针,
void ( *func )( int )是一个接受一个int型参数,不返回的函数的指针;
比如:
void F( int a ) { print( "%d", a ); }
void ( *func )( int ) = F;
func( 3 ); // 调用F函数输出3
作为函数参数的函数指针有一个专门的名称叫做回调,你可以把任意满足回调函数参数特征标的函数地址作为参数传给signal。
在这里因为signal对于sig参数可以指定用户自定义的信号处理函数,所以你可以把你要处理的这个sig的函数地址作为参数传给signal,那么系统接收到对应sig的时候就会通过你传进去的地址调用你的这个函数。
⑩ linux操作系统有一个关于时间的函数返回静态指针,这种做法可能会引发什么问题
你可以使用 localtime_r 。
为什么不返回局部指针或者指向堆(也就是NEW出来)的指针?
gmtime, mktime, and localtime all use a single statically allocated tm structure for the conversion. Each call to one of these routines destroys the result of the previous call
因为new出内存会导致程序性能下降。
对于解析时间来说这个new 是没有必要的时间浪费。
时间类型函数需要极端的效率。
假设你有N个时间数据要解析,你有可能只需要时间数据其中的某个字段
newtime_i = localtime(&filetime_i);
if (newtime_i != NULL) {
hour_i = newtime_i->tm_hour;
}
假设此代码要执行几万次。如果new出内存了,是不是损失了很多效率?
如果将堆指针传出,那么就要写一个对应的函数将它释放。
类似于 fopen 和 fclose 。
localtime 这种轻量级的函数都这样干的话,标准库效率会相当低下。
函数库的使用将增加不少必然的内存管理负担。