• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天衣有縫

            冠蓋滿(mǎn)京華,斯人獨(dú)憔悴~
            posts - 35, comments - 115, trackbacks - 0, articles - 0
               :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

                在我們?nèi)粘3绦蛑?,常碰到?xiě)鏈表的情況。對(duì)于c++程序,stl提供了list和vector兩個(gè)模板,使用起來(lái)很方便。但是很多環(huán)境下,我們只能使用c,大多數(shù)人都是自己封裝相關(guān)接口,花費(fèi)了不必要的時(shí)間。linux內(nèi)核提供了基于面向?qū)ο笏枷氲逆湵恚篿nclude/linux/list.h。通過(guò)簡(jiǎn)單的修改就可以用到我們的用戶(hù)程序中去。

            轉(zhuǎn)載請(qǐng)保留原創(chuàng)(msn and emailjinglexy at yahoo dot com dot cn)http://www.shnenglu.com/jinglexy

            這里是從montavista內(nèi)核linux-2.6.10取出來(lái)的鏈表程序,2.62.4內(nèi)核存在一些差異。具體程序分析可以參考:http://www-128.ibm.com/developerworks/cn/linux/kernel/l-chain,這里只說(shuō)明使用情況。

            首先修改源程序,在#ifdef __KERNEL__3個(gè)include語(yǔ)句的后面加入下面程序:

            (藍(lán)色是加入部分)

            #ifdef __KERNEL__


            #include <linux/stddef.h>

            #include <linux/prefetch.h>

            #include <asm/system.h>

            #elif 1

             

            #define prefetch(x) 1

            #define smp_wmb(x)     1

             

            #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

            #define container_of(ptr, type, member) ({                \

                    const typeof( ((type *)0)->member ) *__mptr = (ptr);       \

                    (type *)( (char *)__mptr - offsetof(type,member) );})

             

             

            下面做一個(gè)測(cè)試程序:

            #include <unistd.h>

            #include <stdlib.h>

            #include <stdio.h>

            #include "list.h"

             

            #define DEBUG do {                                 \

                   printf("**************************\n");        \

                   printf("list 1:\n");                         \

                   list_for_each(i, &list1) {              \

                          mylist_t *ops =            \

                          list_entry(i,                         \

                          mylist_t, list);         \

                          printf("pf is %d\n", ops->pf);              \

                   }                                        \

                                                             \

                   printf("list 2:\n");                         \

                   list_for_each(i, &list2) {              \

                          mylist_t *ops =            \

                          list_entry(i,                         \

                          mylist_t, list);         \

                          printf("pf is %d\n", ops->pf);              \

                   }                                        \

            } while(0);

             

            #if 1

            typedef struct __mylist {

                   int pf;

                   char name[FILENAME_MAX];

             

                   struct list_head list;

            } mylist_t;

            #else

            typedef struct __mylist {

                   struct list_head list;

             

                   int pf;

                   char name[FILENAME_MAX];

            } mylist_t;

            #endif

             

            static LIST_HEAD(list1);             /* define 2 list */

            static LIST_HEAD(list2);

             

            int main(int argc, char *argv[])

            {

                   struct list_head *i;

                   mylist_t elem1;

                   mylist_t elem2;

             

                   INIT_LIST_HEAD(&list1);

                   INIT_LIST_HEAD(&list2);

                   elem1.pf = 2008;

                   elem2.pf = 8002;

                   list_add(&elem1.list, &list1);

                   list_del(&elem1.list);

             

                   list_add(&elem1.list, &list1);

                   list_add_tail(&elem2.list, &list1);

                   DEBUG;

             

                   /* move element to another list */

                   list_move_tail(&elem2.list, &list2);

                   list_splice_init(&list1, &list2);       /* merge */

                   DEBUG;

             

                   return 0;

            }

             

             

            使用gcc編譯,gcc test.c,運(yùn)行程序,結(jié)果正是我們想要的。

            Feedback

            # re: 在用戶(hù)程序中使用linux內(nèi)核list(原創(chuàng))  回復(fù)  更多評(píng)論   

            2007-04-23 12:31 by 天下無(wú)雙
            暈,寫(xiě)內(nèi)核才有,寫(xiě)普通程序不是每個(gè)版本的Linux都有l(wèi)ist可以用,比如FC6默認(rèn)安裝就沒(méi)有它。還是要自己寫(xiě)一個(gè),為了更好的移植性。

            # re: 在用戶(hù)程序中使用linux內(nèi)核list(原創(chuàng))  回復(fù)  更多評(píng)論   

            2007-04-23 16:22 by 天衣有縫
            使用list.h可不是內(nèi)核的‘專(zhuān)利’,當(dāng)然我假定大家都有一份2.6的內(nèi)核源代碼,
            linux環(huán)境使用起來(lái)是很方便的,就是上面寫(xiě)的。

            對(duì)于移植性,可能的確不太好吧,vc6就不指望編譯通過(guò)了。我這沒(méi)有vc7來(lái)驗(yàn)證一下,
            聽(tīng)說(shuō)改進(jìn)挺大的。編譯的時(shí)候可能會(huì)碰到一些問(wèn)題,如果是gcc特性的話(huà)改一下相關(guān)地方:
            ({ …… })這個(gè)不知道是否支持
            求0地址結(jié)構(gòu)體域偏移也不知道是否支持

            雖然麻煩,但是總比自己重新寫(xiě)、調(diào)試來(lái)的快。何況一個(gè)文件里面包含了普通鏈表,
            哈希鏈表,rcu鏈表,算是比較‘超值’了

            歡迎討論

            # re: 在用戶(hù)程序中使用linux內(nèi)核list(原創(chuàng))  回復(fù)  更多評(píng)論   

            2007-04-24 12:12 by hobbes
            不錯(cuò)好東西:)

            # re: 在用戶(hù)程序中使用linux內(nèi)核list(原創(chuàng))  回復(fù)  更多評(píng)論   

            2009-11-03 16:00 by DKs
            有人試過(guò)在APP上多pthread使用這個(gè)rcu嗎?
            久久人妻少妇嫩草AV无码专区| 国产精品美女久久久久久2018| 国产精品久久久久久久午夜片| 成人国内精品久久久久影院VR| 性高湖久久久久久久久AAAAA| 久久无码专区国产精品发布| 久久成人国产精品| 日日狠狠久久偷偷色综合96蜜桃| 亚洲国产小视频精品久久久三级 | 日日狠狠久久偷偷色综合96蜜桃 | 久久人人爽人人澡人人高潮AV| 亚洲欧洲久久久精品| 性高湖久久久久久久久| 国产精品成人无码久久久久久 | 精品人妻伦九区久久AAA片69| 久久综合综合久久97色| 伊人色综合久久天天人手人婷| 99久久亚洲综合精品成人| 亚洲午夜久久久久久久久久| 久久久久无码精品| 久久久91精品国产一区二区三区 | 97视频久久久| 久久激情亚洲精品无码?V| a高清免费毛片久久| 久久人与动人物a级毛片| 久久99久久成人免费播放| 国产精品久久久久久吹潮| 亚洲第一极品精品无码久久| 亚洲七七久久精品中文国产| 久久男人中文字幕资源站| 久久精品一区二区国产| 91精品国产91久久久久福利| 亚洲精品乱码久久久久久中文字幕 | 97久久国产亚洲精品超碰热| 亚洲精品无码成人片久久| 久久无码AV一区二区三区| 久久亚洲精品成人无码网站| 色青青草原桃花久久综合| 青青草原综合久久大伊人| 久久大香萑太香蕉av| 成人久久免费网站|