当前位置:首页 » 操作系统 » linux函数指针

linux函数指针

发布时间: 2022-06-07 11:42:20

linux c编程中关于函数指针

还再搞这个问题啊....
这个确实跟编译器有关的 我已经试过了
我在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 这种轻量级的函数都这样干的话,标准库效率会相当低下。
函数库的使用将增加不少必然的内存管理负担。

热点内容
linuxcls 发布:2024-11-01 03:34:11 浏览:509
c语言的提纲 发布:2024-11-01 03:34:07 浏览:101
如何使用西子服务器 发布:2024-11-01 03:31:43 浏览:214
6s怎么给相册加密码 发布:2024-11-01 03:30:58 浏览:778
数控圆球头编程实例 发布:2024-11-01 03:30:18 浏览:281
excel脚本语言 发布:2024-11-01 03:13:27 浏览:922
云服务器漏洞软件 发布:2024-11-01 03:12:18 浏览:790
c语言放音乐 发布:2024-11-01 03:12:16 浏览:55
backup是什么文件夹 发布:2024-11-01 03:09:20 浏览:917
整理解压 发布:2024-11-01 03:07:50 浏览:79