文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>怎样在UNIX C编程中动态调用函数

怎样在UNIX C编程中动态调用函数

时间:2006-02-22  来源:hello386

我要在一个main函数中读配置文件,按照配置文件中的交易码调用不同的子处理函数,子函数均编译为.o文件,配置文件中有子函数的名字,如下格式: 1001 QueryPwd 1002 QueryAcc 请问该如何调用? 我拟采用类似windows编程中的LoadLibrary将所有.o文件load到main函数中,然后用指向函数的指针调用不同的子函数,但不知道具体实现过程,有何更好的办法望不吝赐教。 
<IFRAME name=google_ads_frame marginWidth=0 marginHeight=0 src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-3859774587941782&amp;dt=1140591845510&amp;lmt=1119358268&amp;format=728x90_as&amp;output=html&amp;url=http%3A%2F%2Fwww.5iv.net%2F072%2Fhow122310.htm&amp;color_bg=FFFFFF&amp;color_text=000000&amp;color_link=0000FF&amp;color_url=FFFFFF&amp;color_border=FFFFFF&amp;ref=http%3A%2F%2Fwww.linuxc.net%2Fviewthread.php%3Ftid%3D841%26fpage%3D1&amp;cc=243&amp;u_h=768&amp;u_w=1024&amp;u_ah=740&amp;u_aw=1024&amp;u_cd=16&amp;u_tz=480&amp;u_java=true" frameBorder=0 width=728 scrolling=no height=90 allowTransparency></IFRAME>
回复人: neccui(PPC) ( ) 信誉:100 2002-03-27 14:18:47Z 得分:0
?
在linux下面可以编译成so文件。 然后用dlopen 打开, 具体信息看帮助就清楚了。 
Top
回复人: 9653013(csL阴转晴) ( ) 信誉:100 2002-03-27 14:20:54Z 得分:0
?
定义一个链表,结构如下:struct tran_list { char tran_code[5]; char fuction_name[10]; stuct tran_list *next }; 建立一个共享内存,主函数开始时,读配置文件读到共享内存中,当需要用的时候 ,就可以用交易码从数据链表中取出函数名了! 
Top
回复人: weiyunfei() ( ) 信誉:98 2002-03-27 14:58:36Z 得分:0
?
你错了,调用函数的时候需要用指向函数的指针。现在的问题是如何将配置文件中的字符串和指向函数的指针关联起来。 
Top
回复人: 9653013(csL阴转晴) ( ) 信誉:100 2002-03-27 15:08:11Z 得分:0
?
对对,我错了!:)我再琢磨琢磨了! 
Top
回复人: neccui(PPC) ( ) 信誉:100 2002-03-27 15:11:20Z 得分:0
?
你的系统是什么系统?究竟有没有dlopen函数系列? 
Top
回复人: weiyunfei() ( ) 信誉:98 2002-03-27 15:26:32Z 得分:0
?
操作系统是 ibm aix or sco unix, 函数形式都一样。 
Top
回复人: 9653013(csL阴转晴) ( ) 信誉:100 2002-03-27 15:52:25Z 得分:0
?
可以定义这样一个结构吧! typedef int (*Routine_t) _(( char * )); typedef struct { char subtran_id[TRAN_CODE_LEN+1]; Routine_t subfunc; Routine_t revsubfunc; }SubTranStru_t; 通过交易码可以找到对应的函数!不知道可以不? 
Top
回复人: guoyichao(guoyichao) ( ) 信誉:99 2002-03-27 15:53:06Z 得分:0
?
把所有函数全部编译连接成一个文件不是更方便?只需要指针就完成了 
Top
回复人: my_bluesky(什么东东?) ( ) 信誉:99 2002-03-27 16:13:22Z 得分:0
?
用 system( funname )就可以了,我做过。 
Top
回复人: victorchen_2000(微力) ( ) 信誉:99 2002-03-27 16:41:29Z 得分:0
?
int gb2312_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n); int big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n); struct wctomb_funcs { int index; int (*xxx_wctomb) (conv_t conv, unsigned char *r, ucs4_t wc, int n); struct wctomb_funcs all_funcs[] { { gb2312_wctomb }; { big5_wctomb } } 可以这么调用 all_funcs[i].xxx_wctomb(......); 说得很粗糙,你可以参考 iconv 的unicode 转码库的原码 
Top
回复人: jollyqiao(jolly) ( ) 信誉:99 2002-03-27 16:47:33Z 得分:10
?
unixware 下用ld -G -o demo.so demo.o编译成so 然后用dlopen打开! aix 下用makeC++SharedLib -o ...编译成共享库,然后同unixware一样使用 
Top
回复人: weiyunfei() ( ) 信誉:98 2002-03-27 17:42:34Z 得分:0
?
各位提供dlopen请帮忙, dlopen 调用完后返回的是指针,我该如何将配置文件中字符串表示的函数调用呢? 
Top
回复人: neccui(PPC) ( ) 信誉:100 2002-03-27 18:04:00Z 得分:30
?
用dlsym来取得函数指针。 
Top
回复人: do_do(do_do) ( ) 信誉:105 2002-03-28 01:12:38Z 得分:30
?
产生share library然后用dlopen和dlsym是最标准的做法。不过要注意在用LAZY方式dlopen时,只有数据symbol会马上被resolve,函数symbol在它被调用到时才resolve。你最好仔细地读一读它的manual page。还有如果你的share library调用了可执行文件中的函数或用到那里的变量,你必需在连接你的可执行文件时export那些symbol(很麻烦但却很安全,share library对系统的安全可能是灾难)。HP上你可以用-Wl,-E来export所有的symbol。IBM上你得把你要export的symbol放在一个文件里,然后用-Wl,-bE:<文件名>来export这些symbol。 
Top
回复人: wake2000(coucou) ( ) 信誉:100 2002-03-28 09:41:09Z 得分:30
?
我做过类似的咚咚,在sco openserver下编译的。也是用dlopen、dlsym调用的 /*此头文件包括dlopen等函数的调用*/ #include <dlfcn.h> #include <stdio.h> int main() { void *pLib; /* 要返回的函数指针申明 */ int( *pFunc )( char * ); /* 打开动态连接库 */ if( ( pLib = dlopen( "libmapsub.so", RTLD_LAZY ) ) == NULL ) return(-1); /* 返回动态连接库中以subname为名的函数指针 */ if( ( pFunc = ( int(*)() ) dlsym( pLib, "subname" ) ) == NULL ) { dlclose( pLib ); return(-2); } /* 调用函数指针 */ if( (*pFunc)( "argv" ) < 0 ) { dlclose( pLib ); return(-3); } /* 关闭动态连接库 */ dlclose( pLib ); return(0); } 编译本程序时cc要用 -b elf 的选项,不然cc找不到dlopen等等的函数。 动态连接库编译时cc要用 -G 的选项,目标文件为.so结尾的库。 最后如果dlopen找不到动态连接库,将dlopen中的文件路径写齐,并试试在环境变量中增加动态连接库的路径到 LD_LIBRARY_PATH 中。 good luck!!! 
Top
回复人: weiyunfei() ( ) 信誉:98 2002-03-29 09:22:28Z 得分:0
?
谢谢各位的指点,几位高人的观点一针见血,有互为补充,鄙人的100分不知该如何给各位。若一人给一百分行不行?如何给? 
Top
回复人: weiyunfei() ( ) 信誉:98 2002-03-29 09:37:22Z 得分:0
?
实在抱歉,只有100分,只好让几位分一下,我很想给各位一人100分,但好像做不到,请各位谅解。 wake2000(coucou) 30 do_do(do_do) 30 neccui(PPC) 30 jollyqiao(jolly) 10 感谢各位的支持,谢谢。 
我要在一个main函数中读配置文件,按照配置文件中的交易码调用不同的子处理函数,子函数均编译为.o文件,配置文件中有子函数的名字,如下格式: 1001 QueryPwd 1002 QueryAcc 请问该如何调用? 我拟采用类似windows编程中的LoadLibrary将所有.o文件load到main函数中,然后用指向函数的指针调用不同的子函数,但不知道具体实现过程,有何更好的办法望不吝赐教。 
<IFRAME name=google_ads_frame marginWidth=0 marginHeight=0 src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-3859774587941782&amp;dt=1140591845510&amp;lmt=1119358268&amp;format=728x90_as&amp;output=html&amp;url=http%3A%2F%2Fwww.5iv.net%2F072%2Fhow122310.htm&amp;color_bg=FFFFFF&amp;color_text=000000&amp;color_link=0000FF&amp;color_url=FFFFFF&amp;color_border=FFFFFF&amp;ref=http%3A%2F%2Fwww.linuxc.net%2Fviewthread.php%3Ftid%3D841%26fpage%3D1&amp;cc=243&amp;u_h=768&amp;u_w=1024&amp;u_ah=740&amp;u_aw=1024&amp;u_cd=16&amp;u_tz=480&amp;u_java=true" frameBorder=0 width=728 scrolling=no height=90 allowTransparency></IFRAME>
回复人: neccui(PPC) ( ) 信誉:100 2002-03-27 14:18:47Z 得分:0
?
在linux下面可以编译成so文件。 然后用dlopen 打开, 具体信息看帮助就清楚了。 
Top
回复人: 9653013(csL阴转晴) ( ) 信誉:100 2002-03-27 14:20:54Z 得分:0
?
定义一个链表,结构如下:struct tran_list { char tran_code[5]; char fuction_name[10]; stuct tran_list *next }; 建立一个共享内存,主函数开始时,读配置文件读到共享内存中,当需要用的时候 ,就可以用交易码从数据链表中取出函数名了! 
Top
回复人: weiyunfei() ( ) 信誉:98 2002-03-27 14:58:36Z 得分:0
?
你错了,调用函数的时候需要用指向函数的指针。现在的问题是如何将配置文件中的字符串和指向函数的指针关联起来。 
Top
回复人: 9653013(csL阴转晴) ( ) 信誉:100 2002-03-27 15:08:11Z 得分:0
?
对对,我错了!:)我再琢磨琢磨了! 
Top
回复人: neccui(PPC) ( ) 信誉:100 2002-03-27 15:11:20Z 得分:0
?
你的系统是什么系统?究竟有没有dlopen函数系列? 
Top
回复人: weiyunfei() ( ) 信誉:98 2002-03-27 15:26:32Z 得分:0
?
操作系统是 ibm aix or sco unix, 函数形式都一样。 
Top
回复人: 9653013(csL阴转晴) ( ) 信誉:100 2002-03-27 15:52:25Z 得分:0
?
可以定义这样一个结构吧! typedef int (*Routine_t) _(( char * )); typedef struct { char subtran_id[TRAN_CODE_LEN+1]; Routine_t subfunc; Routine_t revsubfunc; }SubTranStru_t; 通过交易码可以找到对应的函数!不知道可以不? 
Top
回复人: guoyichao(guoyichao) ( ) 信誉:99 2002-03-27 15:53:06Z 得分:0
?
把所有函数全部编译连接成一个文件不是更方便?只需要指针就完成了 
Top
回复人: my_bluesky(什么东东?) ( ) 信誉:99 2002-03-27 16:13:22Z 得分:0
?
用 system( funname )就可以了,我做过。 
Top
回复人: victorchen_2000(微力) ( ) 信誉:99 2002-03-27 16:41:29Z 得分:0
?
int gb2312_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n); int big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n); struct wctomb_funcs { int index; int (*xxx_wctomb) (conv_t conv, unsigned char *r, ucs4_t wc, int n); struct wctomb_funcs all_funcs[] { { gb2312_wctomb }; { big5_wctomb } } 可以这么调用 all_funcs[i].xxx_wctomb(......); 说得很粗糙,你可以参考 iconv 的unicode 转码库的原码 
Top
回复人: jollyqiao(jolly) ( ) 信誉:99 2002-03-27 16:47:33Z 得分:10
?
unixware 下用ld -G -o demo.so demo.o编译成so 然后用dlopen打开! aix 下用makeC++SharedLib -o ...编译成共享库,然后同unixware一样使用 
Top
回复人: weiyunfei() ( ) 信誉:98 2002-03-27 17:42:34Z 得分:0
?
各位提供dlopen请帮忙, dlopen 调用完后返回的是指针,我该如何将配置文件中字符串表示的函数调用呢? 
Top
回复人: neccui(PPC) ( ) 信誉:100 2002-03-27 18:04:00Z 得分:30
?
用dlsym来取得函数指针。 
Top
回复人: do_do(do_do) ( ) 信誉:105 2002-03-28 01:12:38Z 得分:30
?
产生share library然后用dlopen和dlsym是最标准的做法。不过要注意在用LAZY方式dlopen时,只有数据symbol会马上被resolve,函数symbol在它被调用到时才resolve。你最好仔细地读一读它的manual page。还有如果你的share library调用了可执行文件中的函数或用到那里的变量,你必需在连接你的可执行文件时export那些symbol(很麻烦但却很安全,share library对系统的安全可能是灾难)。HP上你可以用-Wl,-E来export所有的symbol。IBM上你得把你要export的symbol放在一个文件里,然后用-Wl,-bE:<文件名>来export这些symbol。 
Top
回复人: wake2000(coucou) ( ) 信誉:100 2002-03-28 09:41:09Z 得分:30
?
我做过类似的咚咚,在sco openserver下编译的。也是用dlopen、dlsym调用的 /*此头文件包括dlopen等函数的调用*/ #include <dlfcn.h> #include <stdio.h> int main() { void *pLib; /* 要返回的函数指针申明 */ int( *pFunc )( char * ); /* 打开动态连接库 */ if( ( pLib = dlopen( "libmapsub.so", RTLD_LAZY ) ) == NULL ) return(-1); /* 返回动态连接库中以subname为名的函数指针 */ if( ( pFunc = ( int(*)() ) dlsym( pLib, "subname" ) ) == NULL ) { dlclose( pLib ); return(-2); } /* 调用函数指针 */ if( (*pFunc)( "argv" ) < 0 ) { dlclose( pLib ); return(-3); } /* 关闭动态连接库 */ dlclose( pLib ); return(0); } 编译本程序时cc要用 -b elf 的选项,不然cc找不到dlopen等等的函数。 动态连接库编译时cc要用 -G 的选项,目标文件为.so结尾的库。 最后如果dlopen找不到动态连接库,将dlopen中的文件路径写齐,并试试在环境变量中增加动态连接库的路径到 LD_LIBRARY_PATH 中。 good luck!!! 
Top
回复人: weiyunfei() ( ) 信誉:98 2002-03-29 09:22:28Z 得分:0
?
谢谢各位的指点,几位高人的观点一针见血,有互为补充,鄙人的100分不知该如何给各位。若一人给一百分行不行?如何给? 
Top
回复人: weiyunfei() ( ) 信誉:98 2002-03-29 09:37:22Z 得分:0
?
实在抱歉,只有100分,只好让几位分一下,我很想给各位一人100分,但好像做不到,请各位谅解。 wake2000(coucou) 30 do_do(do_do) 30 neccui(PPC) 30 jollyqiao(jolly) 10 感谢各位的支持,谢谢。 
相关阅读 更多 +
排行榜 更多 +
弓箭手战士酷跑

弓箭手战士酷跑

飞行射击 下载
三角洲行动全面战场攀升A点进攻指南

三角洲行动全面战场攀升A点进攻指南

飞行射击 下载
僵尸射手世界大战

僵尸射手世界大战

飞行射击 下载