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 這種輕量級的函數都這樣乾的話,標准庫效率會相當低下。
函數庫的使用將增加不少必然的內存管理負擔。