锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍦ㄣ奓INUX涓嬪姩鎬侀摼鎺ュ簱鐨勫垱寤轟笌搴?
鐢ㄣ嬩竴鏂囦腑,鎴戜粙緇嶄簡LINUX鍔ㄦ侀摼鎺ュ簱鐨勫熀鏈煡璇?鍏惰鐐規槸:鐢ㄦ埛鏍規嵁瀹為檯鎯呭喌闇瑕?鍒╃敤dlopen,dlsym,dlclose絳夊姩鎬侀摼鎺ュ簱鎿嶄綔
鍑芥暟,瑁呭叆鎸囧畾鐨勫姩鎬侀摼鎺ュ簱涓寚瀹氱殑鍑芥暟,鐒跺悗鍔犱互鎵ц.紼嬪簭涓嬌鐢ㄥ緢灝戠殑鍔ㄦ佸嚱鏁版椂,榪欐牱鐨勫仛娉曞皻鍙?濡傛灉紼嬪簭闇瑕佽皟鐢ㄥぇ閲忕殑鍔ㄦ佸嚱鏁?閭d箞閲囩敤榪欐牱鐨?
緙栫▼鎵嬫灝嗘槸闈炲父綣佸鐨?鎵浠ユ垜浠繀欏諱嬌鐢ㄤ竴縐嶆洿涓鴻仾鏄庣殑鍔炴硶,浠ュ噺灝戜唬鐮侀噺,鎻愰珮宸ヤ綔鏁堢巼.榪欏氨鏄幇鍦ㄦ垜瑕佷婦渚嬩粙緇嶇殑銆奓INUX鍔ㄦ侀摼鎺ュ簱楂樼駭搴?
鐢ㄣ? 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 3.3 鍔ㄦ侀摼鎺ュ簱濡備綍鍏變韓 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Trackback: http://tb.donews.net/TrackBack.aspx?PostId=75642
銆銆鍔ㄦ侀摼鎺ュ簱鏄竴縐嶉氱敤鐨勮蔣浠剁粍浠舵妧鏈紝鏄縐嶆搷浣滅郴緇熶腑鎻愪緵鍩烘湰鏈嶅姟鐨勬柟寮忋傛瘮濡俉in32鍐呮牳灝辨槸3涓狣LL鏂囦歡鏋勬垚銆傝繖縐嶆妧鏈湪Linux鎿嶄綔緋葷粺涓嬩篃鏈夊搴旂殑瀹炵幇錛屽氨鏄疞inux鏍囧噯瀵硅薄Standard Ojbect錛屽搴旂殑鏂囦歡鎵╁睍鍚嶄負.so銆?/font>
銆銆涓嬮潰閫氳繃涓涓畝鍗曠殑渚嬪瓙寮濮嬩粙緇峀inux鏍囧噯瀵硅薄銆?/font>
銆銆鎴戜滑鐨勬爣鍑嗗璞℃枃浠跺惈鏈変竴涓嚱鏁幫紝涓嶉渶瑕佸0鏄巈xport瀵煎嚭絎﹀彿錛屽彧闇瑕佺紪璇戝櫒璁劇疆鍗沖彲銆傚涓嬶細
銆銆#include
銆銆#include
銆銆void show() {
銆銆printf("Standard Object by gashero\n");
銆銆}
銆銆淇濆瓨涓簃yso.c鏂囦歡錛屾寜鐓у涓嬬紪璇戯細
銆銆$ gcc -fPIC -shared -o libmyso.so myso.c
銆銆鎵ц鐢熸垚涓涓猯ibmyso.so鏂囦歡錛屾寜鐓inux鏍囧噯瀵硅薄鐨勫懡鍚嶆儻渚嬶紝搴旇鍦ㄥ簱鍚嶇О涔嬪墠鍔犱笂"lib"鍓嶇紑錛屽敖綆′笉鏄繀欏葷殑銆傜紪璇戝紑鍏?fPIC浠h〃鍑芥暟絎﹀彿鍙互閲嶅畾鍚戯紝-shared浠h〃緙栬瘧緇撴灉鏄竴涓爣鍑嗗璞°?/font>
銆銆涓嶅悓浜嶹in32DLL錛孡inux鏍囧噯瀵硅薄涓殑鎵鏈夊嚱鏁伴兘鏄洿鎺ュ鍑虹殑錛岄兘鍙互琚皟鐢ㄧ▼搴忔墍璁塊棶銆備笅闈㈡垜浠紪鍐欒皟鐢ㄧ▼搴忥細
銆銆#include
銆銆int main() {
銆銆printf("Invoke my so\n");
銆銆show();
銆銆return 0;
銆銆}
銆銆淇濆瓨涓篿nvoke.c錛屾寜鐓у涓媑cc寮鍏崇紪璇戯細
銆銆$ gcc -o test invoke.c ./libmyso.so
銆銆緙栬瘧鐢熸垚test鍙墽琛屾枃浠躲傚涓婄紪璇戞潯浠剁殑鏈鍚庝竴鏉¢渶瑕佹槸鎵璋冪敤鐨勬爣鍑嗗璞℃枃浠跺悕錛屾敞鎰忓繀欏誨惈鏈夎礬寰勩傚鏋滃彧鏄嬌鐢╨ibmyso.so錛屽垯蹇呴』紜繚榪欎釜鏂囦歡鍦ㄥ彲璁塊棶鐨凱ATH涓嬮潰銆傛湰渚嬫墍浣跨敤鐨勬枃浠跺悕"./libmyso.so"鏄綋鍓嶈礬寰勪笅鐨勶紝浣跨敤浜嗙浉瀵硅礬寰勩?/font>
銆銆濡備笅嫻嬭瘯緇撴灉錛?/font>
銆銆$ ./test
銆銆Invoke my so
銆銆Standard Object by gashero
聽
娉?鏈枃涓劇殑渚嬪瓙綾諱技涓婄瘒鏂囩珷,鍙槸鏂囦歡鐨勫唴瀹瑰凡鍋氱浉搴斾慨鏀?瑁佸噺浜嗕笉灝?紺轟緥紼嬪簭ady.c鍜屼袱涓姩鎬佸嚱鏁扮殑婧愮▼搴廹etdate.c涓巊ettime.c浠呬慨鏀逛簡澶存枃浠剁殑鍚嶅瓧,鍏跺唴瀹逛笉鍐嶅垪鍑?鏈枃浣跨敤澶存枃浠朵負adatetime.h.
瑕佹兂楂樻晥鍦板簲鐢↙INUX鍔ㄦ侀摼鎺ュ簱(灝ゅ叾鏄敤鎴瘋嚜宸辯紪鍐欑殑),闇瑕佸仛浠ヤ笅宸ヤ綔:
聽
涓銆佺紪鍐欏悎鏍肩殑鍔ㄦ侀摼鎺ュ簱澶存枃浠?
聽
C璇█鐨勫ご鏂囦歡,鍙緵涓涓垨澶氫釜紼嬪簭寮曠敤,閲岄潰涓鑸畾涔夌▼搴忔墍闇鐨勫父閲?鑷畾涔夌被鍨嬪強鍑芥暟鍘熷瀷璇存槑絳?鍏朵腑鐨勫嚱鏁板師鍨嬭鏄?鍒欎緵緙栬瘧鍣ㄦ鏌ヨ娉?鐢ㄤ簬鎺掗櫎寮曠敤鍙傛暟鏃剁被鍨嬩笉涓鑷寸殑閿欒.鍙湁緙栧啓鍚堟牸鐨勫姩鎬侀摼鎺ュ簱澶存枃浠?紼嬪簭鍛樻墠鑳芥紜嬌鐢ㄥ姩鎬侀摼鎺ュ簱鍐呯殑鍑芥暟.
鍔ㄦ侀摼鎺ュ簱澶存枃浠惰閲囩敤C璇█鏍囧噯鏍煎紡,鍏朵腑鐨勫姩鎬佸嚱鏁板師鍨嬪畾涔?涓嶅繀璞′笂鏂囦粙緇嶇殑閭f牱鐢?*鍔ㄦ佸嚱鏁板悕)鐨勬弿榪板艦寮?璇風湅涓嬮潰鐨勪緥瀛?(姣忚寮濮嬬殑鏁板瓧涓烘墍鍦ㄨ琛屽彿,涓虹瑪鑰呮坊鍔?渚涙敞瑙d嬌鐢?
1 /* adatetime.h : 綰墊í杞歡鍒朵綔涓績闆ㄤ害濂?zhsoft@371.net)緙栧啓, 2002-03-06. */
2聽
3 #ifndef __DATETIME_H
4聽
5 #define __DATETIME_H
6聽
7 /* 鏃ユ湡緇撴瀯 */
8 typedef struct
9 {
10 int year;
11 int mon;
12 int day;
13 }DATETYPE;
14聽
15 /* 鏃墮棿緇撴瀯 */
16 typedef struct
17 {
18 char hour;
19 char min;
20 char sec;
21 }TIMETYPE;
22聽
23 int getdate(DATETYPE *d); /* 鍙栧綋鍓嶆棩鏈?*/
24 int gettime(TIMETYPE *t); /* 鍙栧綋鍓嶆椂闂?*/
25聽
26 #endif
27聽
娉?涓庝笂鏂囩殑datetime.h鏂囦歡姣旇緝,浠庤澶存枃浠剁23,24琛屽彲浠ョ湅鍒?鍔ㄦ佸嚱鏁癵etdate,gettime鐨勫師鍨嬪畾涔夋敼鍙樹簡,涓嶅啀浣跨敤(*getdate),(*gettime)鐨勬牸寮忎簡(榪欑鏍煎紡浣跨敤杈冧負緗楀棪).
浜屻佹紜紪璇戜笌鍛藉悕鍔ㄦ侀摼鎺ュ簱
涓轟簡璁〨CC緙栬瘧鍣ㄧ敓鎴愬姩鎬侀摼鎺ュ簱,緙栬瘧鏃墮』鍔犻夐」-shared.(榪欑偣欏葷墷璁?
LINUX緋葷粺涓?涓轟簡璁╁姩鎬侀摼鎺ュ簱鑳借緋葷粺涓叾瀹冪▼搴忓叡浜?鍏跺悕瀛楀簲絎﹀悎鈥渓ib*.so*鈥濊繖縐嶆牸寮?濡傛灉鏌愪釜鍔ㄦ侀摼鎺ュ簱涓嶇鍚堟鏍煎紡,鍒橪INUX鐨勫姩鎬侀摼鎺ュ簱鑷姩瑁呭叆紼嬪簭(ld.so)灝嗘悳绱笉鍒版閾炬帴搴?鍏跺畠紼嬪簭涔熸棤娉曞叡浜箣.
鏍煎紡涓?絎竴涓?閫氬父琛ㄧず涓虹畝鍐欑殑搴撳悕,絎簩涓?閫氬父琛ㄧず涓鴻搴撶殑鐗堟湰鍙?濡?鍦ㄦ垜鐨勭郴緇熶腑,鍩烘湰C鍔ㄦ侀摼鎺ュ簱鐨勫悕瀛椾負
libc.so.6,綰跨▼
pthread鍔ㄦ侀摼鎺ュ簱鐨勫悕瀛椾負libpthread.so.0絳夌瓑.鏈枃渚嬪瓙鎵鐢熸垚鐨勫姩鎬侀摼鎺ュ簱鐨勫悕瀛椾負libmy.so,铏芥病鏈夌増鏈彿,浣嗕篃絎﹀悎鎵
瑕佹眰鐨勬牸寮?
鐢熸垚璇ュ姩鎬侀摼鎺ュ簱鐨勭淮鎶ゆ枃浠秏akefile-lib鍐呭濡備笅:
1 # makefile : 綰墊í杞歡鍒朵綔涓績闆ㄤ害濂囩紪鍐? 2002-03-07.
2聽
3 all : libmy.so
4聽
5 SRC = getdate.c gettime.c
6聽
7 TGT = $(SRC:.c=.o)
8聽
9 $(SRC) : adatetime.h
10 @touch $@
11聽
12 %.o : %.c
13 cc -c $?
14聽
15 # 鍔ㄦ侀摼鎺ュ簱(libmy.so)鐢熸垚
16 libmy.so : $(TGT)
17 cc -s -shared -o $@ $(TGT)
18聽
榪愯鍛戒護:
$ make -f makefile-lib
$
鍗崇敓鎴恖ibmy.so搴?
娉? 緇存姢鏂囦歡涓?絎?7琛岀敤-shared閫夐」浠ョ敓鎴愬姩鎬侀摼鎺ュ簱,鐢?s閫夐」浠ュ幓鎺夌洰鏍囨枃浠朵腑鐨勭鍙瘋〃,浠庤屽噺灝忔枃浠墮暱搴?
涓夈佸叡浜姩鎬侀摼鎺ュ簱
3.1 鍔ㄦ侀摼鎺ュ簱閰嶇疆鏂囦歡
涓轟簡璁╁姩鎬侀摼鎺ュ簱涓虹郴緇熸墍浣跨敤,闇瑕佺淮鎶ゅ姩鎬侀摼鎺ュ簱鐨勯厤緗枃浠?-/etc/ld.so.conf.姝ゆ枃浠跺唴,瀛樻斁鐫鍙LINUX鍏變韓
鐨勫姩鎬侀摼鎺ュ簱鎵鍦ㄧ洰褰曠殑鍚嶅瓧(緋葷粺鐩綍/lib,/usr/lib闄ゅ),鍚勪釜鐩綍鍚嶉棿浠ョ┖鐧藉瓧絎?絀烘牸,鎹㈣絳?鎴栧啋鍙鋒垨閫楀彿鍒嗛殧.涓鑸殑LINUX鍙?
琛岀増涓?姝ゆ枃浠跺潎鍚竴涓叡浜洰褰?usr/X11R6/lib,涓篨 window紿楀彛緋葷粺鐨勫姩鎬侀摼鎺ュ簱鎵鍦ㄧ殑鐩綍.
涓嬮潰鐪嬬湅鎴戠殑緋葷粺涓鏂囦歡鐨勫唴瀹瑰浣?
# cat /etc/ld.so.conf
/usr/X11R6/lib
/usr/zzz/lib
#
鐢變笂鍙互鐪嬪嚭,璇ュ姩鎬佸簱閰嶇疆鏂囦歡涓?澧炲姞浜嗕竴涓?usr/zzz/lib鐩綍.榪欐槸鎴戣嚜宸辨柊寤虹殑鍏變韓搴撶洰褰?涓嬮潰瀛樻斁鎴戞柊寮鍙戠殑鍙緵緋葷粺鍏變韓鐨勫姩鎬侀摼鎺ュ簱.
3.2 鍔ㄦ侀摼鎺ュ簱綆$悊鍛戒護
涓轟簡璁╁姩鎬侀摼鎺ュ簱涓虹郴緇熸墍鍏變韓,榪橀渶榪愯鍔ㄦ侀摼鎺ュ簱鐨勭鐞嗗懡浠?-ldconfig.姝ゆ墽琛岀▼搴忓瓨鏀懼湪/sbin鐩綍涓?
ldconfig鍛戒護鐨勭敤閫?涓昏鏄湪榛樿鎼滃鐩綍(/lib鍜?usr/lib)浠ュ強鍔ㄦ佸簱閰嶇疆鏂囦歡/etc/ld.so.conf鍐?
鎵鍒楃殑鐩綍涓?鎼滅儲鍑哄彲鍏變韓鐨勫姩鎬侀摼鎺ュ簱(鏍煎紡濡傚墠浠嬬粛,lib*.so*),榪涜屽垱寤哄嚭鍔ㄦ佽鍏ョ▼搴?ld.so)鎵闇鐨勮繛鎺ュ拰緙撳瓨鏂囦歡.緙撳瓨鏂囦歡榛樿
涓?/etc/ld.so.cache,姝ゆ枃浠朵繚瀛樺凡鎺掑ソ搴忕殑鍔ㄦ侀摼鎺ュ簱鍚嶅瓧鍒楄〃.
ldconfig閫氬父鍦ㄧ郴緇熷惎鍔ㄦ椂榪愯,鑰屽綋鐢ㄦ埛瀹夎浜嗕竴涓柊鐨勫姩鎬侀摼鎺ュ簱鏃?灝遍渶瑕佹墜宸ヨ繍琛岃繖涓懡浠?
ldconfig鍛戒護琛岀敤娉曞涓?
ldconfig [-v|--verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r
ROOT] [-l] [-p|--print-cache] [-c FORMAT] [--format=FORMAT] [-V]
[-?|--help|--usage] path...
ldconfig鍙敤鐨勯夐」璇存槑濡備笅:
(1) -v鎴?-verbose : 鐢ㄦ閫夐」鏃?ldconfig灝嗘樉紺烘鍦ㄦ壂鎻忕殑鐩綍鍙婃悳绱㈠埌鐨勫姩鎬侀摼鎺ュ簱,榪樻湁瀹冩墍鍒涘緩鐨勮繛鎺ョ殑鍚嶅瓧.
(2) -n : 鐢ㄦ閫夐」鏃?ldconfig浠呮壂鎻忓懡浠よ鎸囧畾鐨勭洰褰?涓嶆壂鎻忛粯璁ょ洰褰?/lib,/usr/lib),涔熶笉鎵弿閰嶇疆鏂囦歡/etc/ld.so.conf鎵鍒楃殑鐩綍.
(3) -N : 姝ら夐」鎸囩ずldconfig涓嶉噸寤虹紦瀛樻枃浠?/etc/ld.so.cache).鑻ユ湭鐢?X閫夐」,ldconfig鐓у父鏇存柊鏂囦歡鐨勮繛鎺?
(4) -X : 姝ら夐」鎸囩ずldconfig涓嶆洿鏂版枃浠剁殑榪炴帴.鑻ユ湭鐢?N閫夐」,鍒欑紦瀛樻枃浠舵甯告洿鏂?
(5) -f CONF : 姝ら夐」鎸囧畾鍔ㄦ侀摼鎺ュ簱鐨勯厤緗枃浠朵負CONF,緋葷粺榛樿涓?etc/ld.so.conf.
(6) -C CACHE : 姝ら夐」鎸囧畾鐢熸垚鐨勭紦瀛樻枃浠朵負CACHE,緋葷粺榛樿鐨勬槸/etc/ld.so.cache,姝ゆ枃浠跺瓨鏀懼凡鎺掑ソ搴忕殑鍙叡浜殑鍔ㄦ侀摼鎺ュ簱鐨勫垪琛?
(7) -r ROOT :
姝ら夐」鏀瑰彉搴旂敤紼嬪簭鐨勬牴鐩綍涓篟OOT(鏄皟鐢╟hroot鍑芥暟瀹炵幇鐨?.閫夋嫨姝ら」鏃?緋葷粺榛樿鐨勯厤緗枃浠?etc/ld.so.conf,瀹為檯瀵瑰簲鐨勪負
ROOT/etc/ld.so.conf.濡傜敤-r
/usr/zzz鏃?鎵撳紑閰嶇疆鏂囦歡/etc/ld.so.conf鏃?瀹為檯鎵撳紑鐨勬槸/usr/zzz/etc/ld.so.conf鏂囦歡.鐢ㄦ閫夐」,鍙互
澶уぇ澧炲姞鍔ㄦ侀摼鎺ュ簱綆$悊鐨勭伒媧繪?
(8) -l : 閫氬父鎯呭喌涓?ldconfig鎼滅儲鍔ㄦ侀摼鎺ュ簱鏃跺皢鑷姩寤虹珛鍔ㄦ侀摼鎺ュ簱鐨勮繛鎺?閫夋嫨姝ら」鏃?灝嗚繘鍏ヤ笓瀹舵ā寮?闇瑕佹墜宸ヨ緗繛鎺?涓鑸敤鎴蜂笉鐢ㄦ欏?
(9) -p鎴?-print-cache : 姝ら夐」鎸囩ずldconfig鎵撳嵃鍑哄綋鍓嶇紦瀛樻枃浠舵墍淇濆瓨鐨勬墍鏈夊叡浜簱鐨勫悕瀛?
(10) -c FORMAT 鎴?--format=FORMAT : 姝ら夐」鐢ㄤ簬鎸囧畾緙撳瓨鏂囦歡鎵浣跨敤鐨勬牸寮?鍏辨湁涓夌:old(鑰佹牸寮?,new(鏂版牸寮?鍜宑ompat(鍏煎鏍煎紡,姝や負榛樿鏍煎紡).
(11) -V : 姝ら夐」鎵撳嵃鍑簂dconfig鐨勭増鏈俊鎭?鑰屽悗閫鍑?
(12) -? 鎴?--help 鎴?--usage : 榪欎笁涓夐」浣滅敤鐩稿悓,閮芥槸璁﹍dconfig鎵撳嵃鍑哄叾甯姪淇℃伅,鑰屽悗閫鍑?
涓句笁涓緥瀛?
渚?:
# ldconfig -p
793 libs found in cache `/etc/ld.so.cache'
libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2
libzvt.so (libc6) => /usr/lib/libzvt.so
libz.so.1.1.3 (libc6) => /usr/lib/libz.so.1.1.3
libz.so.1 (libc6) => /lib/libz.so.1
......
#
娉?
鏈夋椂鍊欑敤鎴鋒兂鐭ラ亾緋葷粺涓湁鍝簺鍔ㄦ侀摼鎺ュ簱,鎴栬呮兂鐭ラ亾緋葷粺涓湁娌℃湁鏌愪釜鍔ㄦ侀摼鎺ュ簱,榪欐椂,鍙敤-p閫夐」璁﹍dconfig杈撳嚭緙撳瓨鏂囦歡涓殑鍔ㄦ侀摼鎺ュ簱鍒?
琛?浠庤屾煡璇㈠緱鍒?渚嬪瓙涓?ldconfig鍛戒護鐨勮緭鍑虹粨鏋滅1琛岃〃鏄庡湪緙撳瓨鏂囦歡/etc/ld.so.cache涓壘鍒?93涓叡浜簱,絎?琛屽紑濮嬩究鏄?
涓緋誨垪鍏變韓搴撶殑鍚嶅瓧鍙婂叾鍏ㄥ悕(緇濆璺緞).鍥犱負瀹為檯杈撳嚭緇撴灉澶,涓鴻妭鐪佺瘒騫?浠?.....琛ㄧず鐪佺暐鐨勯儴鍒?
渚?:
# ldconfig -v
/lib:
liby.so.1 -> liby.so.1
libnss_wins.so -> libnss_wins.so
......
/usr/lib:
libjscript.so.2 -> libjscript.so.2.0.0
libkspell.so.2 -> libkspell.so.2.0.0
......
/usr/X11R6/lib:
libmej-0.8.10.so -> libmej-0.8.10.so
libXaw3d.so.7 -> libXaw3d.so.7.0
......
#
娉?
ldconfig鍛戒護鍦ㄨ繍琛屾甯哥殑鎯呭喌涓?榛樿涓嶈緭鍑轟粈涔堜笢瑗?鏈緥涓敤浜?v閫夐」,浠ヤ嬌ldconfig鍦ㄨ繍琛屾椂杈撳嚭姝e湪鎵弿鐨勭洰褰曞強鎼滅儲鍒扮殑鍏變韓搴?
鐢ㄦ埛鍙互娓呮鍦扮湅鍒拌繍琛岀殑緇撴灉.鎵ц緇撴潫鍚?ldconfig灝嗗埛鏂扮紦瀛樻枃浠?etc/ld.so.cache.
渚?:
# ldconfig /usr/zhsoft/lib
#
娉? 褰撶敤鎴峰湪鏌愪釜鐩綍涓嬮潰鍒涘緩鎴栨嫹璐濅簡涓涓姩鎬侀摼鎺ュ簱,鑻ユ兂浣垮叾琚郴緇熷叡浜?鍙互鎵ц涓涓?ldconfig
鐩綍鍚?榪欎釜鍛戒護.姝ゅ懡浠ょ殑鍔熻兘鍦ㄤ簬璁﹍dconfig灝嗘寚瀹氱洰褰曚笅鐨勫姩鎬侀摼鎺ュ簱琚郴緇熷叡浜搗鏉?鎰忓嵆:鍦ㄧ紦瀛樻枃浠?etc/ld.so.cache涓拷
鍔犺繘鎸囧畾鐩綍涓嬬殑鍏變韓搴?鏈緥璁╃郴緇熷叡浜簡/usr/zhsoft/lib鐩綍涓嬬殑鍔ㄦ侀摼鎺ュ簱.闇瑕佽鏄庣殑鏄?濡傛灉姝ょ洰褰曚笉鍦?lib,/usr/lib
鍙?etc/ld.so.conf鏂囦歡鎵鍒楃殑鐩綍閲岄潰,鍒欏啀搴﹁繍琛宭dconfig鏃?姝ょ洰褰曚笅鐨勫姩鎬侀摼鎺ュ簱鍙兘涓嶈緋葷粺鍏變韓浜?
聽
浜嗚В浜嗕互涓婄煡璇?鎴戜滑鍙互閲囩敤浠ヤ笅涓夌鏂規硶鏉ュ叡浜姩鎬侀摼鎺ュ簱:(娉?鍧囬』鍦ㄨ秴綰х敤鎴風姸鎬佷笅鎿嶄綔,浠ユ垜鐨勫姩鎬侀摼鎺ュ簱libmy.so鍏變韓榪囩▼涓轟緥)
(1)鎷瘋礉鍔ㄦ侀摼鎺ュ簱鍒扮郴緇熷叡浜洰褰曚笅,鎴栧湪緋葷粺鍏變韓鐩綍涓嬩負璇ュ姩鎬侀摼鎺ュ簱寤虹珛涓繛鎺?紜繛鎺ユ垨絎﹀彿榪炴帴鍧囧彲,甯哥敤絎﹀彿榪炴帴).榪欓噷璇寸殑
緋葷粺鍏變韓鐩綍,鎸囩殑鏄疞INUX鍔ㄦ侀摼鎺ュ簱瀛樻斁鐨勭洰褰?瀹冨寘鍚?lib,/usr/lib浠ュ強/etc/ld.so.conf鏂囦歡鍐呮墍鍒楃殑涓緋誨垪鐩綍.
# cp libmy.so /lib
# ldconfig
#
鎴?
# ln -s `pwd`/libmy.so /lib
# ldconfig
#
(2)灝嗗姩鎬侀摼鎺ュ簱鎵鍦ㄧ洰褰曞悕榪藉姞鍒板姩鎬侀摼鎺ュ簱閰嶇疆鏂囦歡/etc/ld.so.conf涓?
# pwd >> /etc/ld.so.conf
# ldconfig
#
(3)鍒╃敤鍔ㄦ侀摼鎺ュ簱綆$悊鍛戒護ldconfig,寮哄埗鍏舵悳绱㈡寚瀹氱洰褰?騫舵洿鏂扮紦瀛樻枃浠?渚夸簬鍔ㄦ佽鍏?
# ldconfig `pwd`
#
闇瑕佽鏄庣殑鏄?榪欑鎿嶄綔鏂規硶铏界劧鏈夋晥,浣嗘晥鏋滄槸鏆傛椂鐨?渚涚▼搴忔祴璇曡繕鍙互,涓鏃﹀啀搴﹁繍琛宭dconfig,鍒欑紦瀛樻枃浠跺唴瀹瑰彲鑳芥敼鍙?鎵闇
鐨勫姩鎬侀摼鎺ュ簱鍙兘涓嶈緋葷粺鍏變韓浜?涓庝箣鐩告瘮杈?鍓嶄袱縐嶆柟娉曟槸鍙潬鐨勬柟娉?鍊煎緱涓氬凡瀹氬瀷鐨勫姩鎬侀摼鎺ュ簱鍏變韓鏃墮噰鐢?鍓嶄袱縐嶆柟娉曡繕鏈変竴涓壒鐐?鍗蟲渶鍚庝竴鏉″懡浠ら兘
鏄?ldconfig,涔熷嵆鍧囬渶瑕佹洿鏂頒竴涓嬬紦瀛樻枃浠?浠ョ‘淇濆姩鎬侀摼鎺ュ簱鐨勫叡浜敓鏁?
鍥涖佸惈鏈夊姩鎬佸嚱鏁扮殑紼嬪簭鐨勭紪璇?
4.1 闃叉緙栬瘧鍥犳湭鎸囧畾鍔ㄦ侀摼鎺ュ簱鑰屽嚭閿?
褰撲竴涓▼搴忎嬌鐢ㄥ姩鎬佸嚱鏁版椂,緙栬瘧璇ョ▼搴忔椂灝卞繀欏繪寚瀹氬惈鎵鐢ㄥ姩鎬佸嚱鏁扮殑鍔ㄦ侀摼鎺ュ簱,鍚﹀垯緙栬瘧灝嗕細鍑洪敊閫鍑?濡傛湰鏂囩ず渚嬬▼搴廰dy.c鐨勭紪璇?鏈槑紜紩鐢ㄥ姩鎬侀摼鎺ュ簱libmy.so):
# cc -o ady ady.c
/tmp/ccL4FsJp.o: In function `main':
/tmp/ccL4FsJp.o(.text+0x43): undefined reference to `gettime'
collect2: ld returned 1 exit status
#
娉? 鍥犱負ady.c鎵鍚殑鍔ㄦ佸嚱鏁癵etdate,gettime涓嶅湪緋葷粺鍑芥暟搴撲腑,鎵浠ヨ繛鎺ユ椂鍑洪敊.
4.2 緙栬瘧鏃跺紩鐢ㄥ姩鎬侀摼鎺ュ簱鐨勫嚑縐嶆柟寮?
(1)褰撴墍鐢ㄧ殑鍔ㄦ侀摼鎺ュ簱鍦ㄧ郴緇熺洰褰?/lib,/usr/lib)涓嬫椂,鍙敤緙栬瘧閫夐」-l鏉ュ紩鐢?鍗?
# cc -lmy -o ady ady.c
#
娉?緙栬瘧鏃剁敤-l閫夐」寮曠敤鍔ㄦ侀摼鎺ュ簱鏃?搴撳悕欏諱嬌鐢ㄥ叾緙╁啓褰㈠紡.鏈緥鐨刴y,琛ㄧず寮曠敤libmy.so搴?鑻ュ紩鐢ㄥ厜鏍囧簱libncurses.so,欏葷敤-lncurses.娉ㄦ剰,-l閫夐」涓庡弬鏁頒箣闂翠笉鑳芥湁絀烘牸,鍚﹀垯浼氬嚭閿?
(2)褰撴墍鐢ㄧ殑鍔ㄦ侀摼鎺ュ簱鍦ㄧ郴緇熺洰褰?/lib,/usr/lib)浠ュ鐨勭洰褰曟椂,欏葷敤緙栬瘧閫夐」-L鏉ユ寚瀹氬姩鎬侀摼鎺ュ簱鎵鍦ㄧ殑鐩綍(渚涚紪璇戝櫒鏌ユ壘鐢?,鍚屾椂鐢?l閫夐」鎸囧畾緙╁啓鐨勫姩鎬侀摼鎺ュ簱鍚?鍗?
# cc -L/usr/zzz/lib -lmy -o ady ady.c
#
(3)鐩存帴寮曠敤鎵闇鐨勫姩鎬侀摼鎺ュ簱.鍗?
# cc -o ady ady.c libmy.so
#
鎴?
# cc -o ady ady.c /lib/libmy.so
#
絳夌瓑.鍏朵腑,鍔ㄦ侀摼鎺ュ簱鐨勫簱鍚嶅彲浠ラ噰鐢ㄧ浉瀵硅礬寰勫艦寮?鏂囦歡鍚嶄笉浠?寮澶?,涔熷彲閲囩敤緇濆璺緞褰㈠紡(鏂囦歡鍚嶄互/寮澶?.
浜斻佸姩鎬侀摼鎺ョ▼搴忕殑榪愯涓庢鏌?
5.1 榪愯
緙栬瘧榪炴帴濂藉惈鍔ㄦ佸嚱鏁扮殑紼嬪簭鍚?灝卞彲浠ヨ繍琛屽畠浜?鍔ㄦ侀摼鎺ョ▼搴忓洜涓哄叡浜簡緋葷粺涓殑鍔ㄦ侀摼鎺ュ簱,鎵浠ュ叾絀洪棿鍗犵敤寰堝皬.浣嗚繖騫朵笉鎰忓懗鍔熻兘鐨勫噺灝?瀹冪殑鎵ц涓庨潤鎬佽繛鎺ョ殑紼嬪簭鎵ц,鏁堟灉瀹屽叏鐩稿悓.鍦ㄥ懡浠ゆ彁紺虹涓嬮敭鍏ョ▼搴忓悕鍙婄浉鍏沖弬鏁板悗鍥炶濺鍗沖彲,濡備笅渚?
$ ady
鍔ㄦ侀摼鎺ュ簱楂樼駭搴旂敤紺鴻寖
褰撳墠鏃ユ湡: 2002-03-11
褰撳墠鏃墮棿: 19:39:06
$
5.2 媯鏌?
媯鏌ヤ粈涔?媯鏌ュ姩鎬侀摼鎺ョ▼搴忕┒绔熼渶瑕佸摢浜涘叡浜簱,緋葷粺涓槸鍚﹀凡鏈夎繖浜涘簱,娌℃湁鐨勮瘽,鐢ㄦ埛濂芥兂鍔炴硶鎶婅繖浜涘簱瑁呬笂.
鎬庝箞媯鏌ュ憿?榪欓噷,鍛婅瘔浣犱竴涓疄鐢ㄧ▼搴?-ldd,榪欎釜紼嬪簭灝辨槸涓撻棬鐢ㄦ潵媯鏌ュ姩鎬侀摼鎺ョ▼搴忎緷璧栧摢浜涘叡浜簱鐨?
ldd鍛戒護琛岀敤娉曞涓?
ldd [--version] [-v|--verbose] [-d|--data-relocs] [-r|--function-relocs] [--help] FILE...
鍚勯夐」璇存槑濡備笅:
(1) --version : 姝ら夐」鐢ㄤ簬鎵撳嵃鍑簂dd鐨勭増鏈彿.
(2) -v 鎴?--verbose : 姝ら夐」鎸囩ずldd杈撳嚭鍏充簬鎵渚濊禆鐨勫姩鎬侀摼鎺ュ簱鐨勫敖鍙兘璇︾粏鐨勪俊鎭?
(3) -d 鎴?--data-relocs : 姝ら夐」鎵ц閲嶅畾浣?騫朵笖鏄劇ず涓嶅瓨鍦ㄧ殑鍑芥暟.
(4) -r 鎴?--function-relocs : 姝ら夐」鎵ц鏁版嵁瀵硅薄涓庡嚱鏁扮殑閲嶅畾浣?鍚屾椂鎶ュ憡涓嶅瓨鍦ㄧ殑瀵硅薄.
(5) --help : 姝ら夐」鐢ㄤ簬鎵撳嵃鍑簂dd鐨勫府鍔╀俊鎭?
娉? 涓婅堪閫夐」涓?甯哥敤-v(鎴?-verbose)閫夐」.
ldd鐨勫懡浠よ鍙傛暟涓篎ILE...,鍗充竴涓垨澶氫釜鏂囦歡鍚?鍔ㄦ侀摼鎺ョ▼搴忔垨鍔ㄦ侀摼鎺ュ簱).
渚?:
$ ldd ady
libmy.so => ./libmy.so (0x40026000)
libc.so.6 => /lib/libc.so.6 (0x40028000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
$
娉?
姣忚=>鍓嶉潰鐨?涓哄姩鎬侀摼鎺ョ▼搴忔墍闇鐨勫姩鎬侀摼鎺ュ簱鐨勫悕瀛?鑰?>鍚庨潰鐨?鍒欐槸榪愯鏃剁郴緇熷疄闄呰皟鐢ㄧ殑鍔ㄦ侀摼鎺ュ簱鐨勫悕瀛?鎵闇鐨勫姩鎬侀摼鎺ュ簱鍦ㄧ郴緇?
涓笉瀛樺湪鏃?=>鍚庨潰灝嗘樉紺?not
found",鎷彿鎵鎷殑鏁板瓧涓鴻櫄鎷熺殑鎵ц鍦板潃.鏈緥鍒楀嚭ady鎵闇鐨勪笁涓姩鎬侀摼鎺ュ簱,鍏朵腑libmy.so涓鴻嚜宸辨柊寤虹殑鍔ㄦ侀摼鎺ュ簱,鑰?
libc.so.6涓?lib/ld-linux.so.2鍧囦負緋葷粺鐨勫姩鎬侀摼鎺ュ簱,鍓嶄竴涓負鍩烘湰C搴?鍚庝竴涓姩鎬佽鍏ュ簱(鐢ㄤ簬鍔ㄦ侀摼鎺ュ簱鐨勮鍏ュ強榪愯).
渚?:
$ ldd -v ady
libmy.so => ./libmy.so (0x40026000)
libc.so.6 => /lib/libc.so.6 (0x40028000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Version information:
./ady:
libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
./libmy.so:
libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
/lib/libc.so.6:
ld-linux.so.2 (GLIBC_2.1.1) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.2.3) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.2) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.0) => /lib/ld-linux.so.2
$
娉?鏈緥鐢?v閫夐」浠ユ樉紺哄敖鍙兘澶氱殑淇℃伅,鎵浠ヤ緥涓櫎鍒楀嚭ady鎵闇瑕佺殑鍔ㄦ侀摼鎺ュ簱澶?榪樺垪鍑轟簡紼嬪簭鎵闇鍔ㄦ侀摼鎺ュ簱鐗堟湰鏂歸潰鐨勪俊鎭?
灝忕粨:
鍦↙INUX鍔ㄦ侀摼鎺ュ簱鐨勯珮綰у簲鐢ㄤ腑,鍏抽敭鏈変袱鐐?涓鏄浣曡鍔ㄦ侀摼鎺ュ簱涓篖INUX緋葷粺鎵鍏變韓,浜屾槸緙栬瘧榪炴帴紼嬪簭鏃跺浣曞仛.璁╁姩鎬侀摼鎺ュ簱涓虹郴緇熸墍鍏變韓,
涓昏鏄敤ldconfig綆$悊鍛戒護,緇存姢濂界郴緇熷叡浜簱鐨勭紦瀛樻枃浠?etc/ld.so.cache.緙栬瘧榪炴帴鏃跺浣曞仛?娉ㄦ剰榪炴帴涓婃墍鐢ㄧ殑鍔ㄦ侀摼鎺ュ簱灝卞彲浠?
浜?LINUX鍔ㄦ侀摼鎺ュ簱鐨勯珮綰у簲鐢?鐢ㄤ竴鐢ㄥ氨鏄庣櫧:鍏跺疄,灝辨槸榪欎箞綆鍗?
鐐瑰嚮榪欓噷涓嬭澆紺轟緥紼嬪簭銆?
]]>
int main(int argc,char **argv)
{
printf("Hello Linux\n");
}
瑕佺紪璇戣繖涓▼搴?鎴戜滑鍙鍦ㄥ懡浠よ涓嬫墽琛?
gcc -o hello hello.c
gcc 緙栬瘧鍣ㄥ氨浼氫負鎴戜滑鐢熸垚涓涓猦ello鐨勫彲鎵ц鏂囦歡.鎵ц./hello灝卞彲浠ョ湅鍒扮▼搴忕殑杈撳嚭緇撴灉浜?鍛戒護琛屼腑
gcc琛ㄧず鎴戜滑鏄敤gcc鏉ョ紪璇戞垜浠殑婧愮▼搴?-o 閫夐」琛ㄧず鎴戜滑瑕佹眰緙栬瘧鍣ㄧ粰鎴戜滑杈撳嚭鐨勫彲鎵ц鏂囦歡鍚嶄負hello
鑰宧ello.c鏄垜浠殑婧愮▼搴忔枃浠?
gcc緙栬瘧鍣ㄦ湁璁稿閫夐」,涓鑸潵璇存垜浠彧瑕佺煡閬撳叾涓殑鍑犱釜灝卞浜?
-o閫夐」鎴戜滑宸茬粡鐭ラ亾浜?琛ㄧず鎴戜滑瑕佹眰杈撳嚭鐨勫彲鎵ц鏂囦歡鍚? -c閫夐」琛ㄧず鎴戜滑鍙姹傜紪璇戝櫒杈撳嚭鐩爣浠g爜,鑰屼笉蹇呰杈撳嚭鍙墽琛屾枃浠?
-g閫夐」琛ㄧず鎴戜滑瑕佹眰緙栬瘧鍣ㄥ湪緙栬瘧鐨勬椂鍊欐彁渚涙垜浠互鍚庡紼嬪簭榪涜璋冭瘯鐨勪俊鎭?
鐭ラ亾浜嗚繖涓変釜閫夐」,鎴戜滑灝卞彲浠ョ紪璇戞垜浠嚜宸辨墍鍐欑殑綆鍗曠殑婧愮▼搴忎簡,濡傛灉浣犳兂瑕佺煡閬撴洿澶氱殑閫夐」,鍙互鏌ョ湅gcc鐨勫府鍔╂枃妗?閭i噷鏈夌潃璁稿瀵瑰叾瀹冮夐」鐨勮緇嗚鏄?
2.Makefile鐨勭紪鍐?
鍋囪鎴戜滑鏈変笅闈㈣繖鏍風殑涓涓▼搴?婧愪唬鐮佸涓?
/* main.c */
#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}
/* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/* mytool1.c */
#include "mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %s\n",print_str);
}
/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
/* mytool2.c */
#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s\n",print_str);
}
褰撶劧鐢變簬榪欎釜紼嬪簭鏄緢鐭殑鎴戜滑鍙互榪欐牱鏉ョ紪璇?
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
榪?
鏍風殑璇濇垜浠篃鍙互浜х敓main紼嬪簭,鑰屼笖涔熶笉鏃跺緢楹葷儲.浣嗘槸濡傛灉鎴戜滑鑰冭檻涓涓嬪鏋滄湁涓澶╂垜浠慨鏀逛簡鍏朵腑鐨勪竴涓枃浠?姣斿璇磎ytool1.c)閭d箞鎴戜滑闅?
閬撹繕瑕侀噸鏂拌緭鍏ヤ笂闈㈢殑鍛戒護?涔熻浣犱細璇?榪欎釜寰堝鏄撹В鍐沖晩,鎴戝啓涓涓猄HELL鑴氭湰,璁╁ス甯垜鍘誨畬鎴愪笉灝卞彲浠ヤ簡.鏄殑瀵逛簬榪欎釜紼嬪簭鏉ヨ,鏄彲浠ヨ搗鍒頒綔鐢?
鐨?浣嗘槸褰撴垜浠妸浜嬫儏鎯崇殑鏇村鏉備竴鐐?濡傛灉鎴戜滑鐨勭▼搴忔湁鍑犵櫨涓簮紼嬪簭鐨勬椂鍊?闅鵑亾涔熻緙栬瘧鍣ㄩ噸鏂頒竴涓竴涓殑鍘葷紪璇?
涓烘,鑱槑鐨勭▼搴忓憳浠兂鍑?
浜嗕竴涓緢濂界殑宸ュ叿鏉ュ仛榪欎歡浜嬫儏,榪欏氨鏄痬ake.鎴戜滑鍙鎵ц浠ヤ笅make,灝卞彲浠ユ妸涓婇潰鐨勯棶棰樿В鍐蟲帀.鍦ㄦ垜浠墽琛宮ake涔嬪墠,鎴戜滑瑕佸厛緙栧啓涓涓潪甯擱噸
瑕佺殑鏂囦歡.--Makefile.瀵逛簬涓婇潰鐨勯偅涓▼搴忔潵璇?鍙兘鐨勪竴涓狹akefile鐨勬枃浠舵槸:
# 榪欐槸涓婇潰閭d釜紼嬪簭鐨凪akefile鏂囦歡
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
鏈変簡榪欎釜Makefile鏂囦歡,涓嶈繃鎴戜滑浠涔堟椂鍊欎慨鏀逛簡婧愮▼搴忓綋涓殑浠涔堟枃浠?鎴戜滑鍙鎵цmake鍛戒護,鎴戜滑鐨勭紪璇戝櫒閮藉彧浼氬幓緙栬瘧鍜屾垜浠慨鏀圭殑鏂囦歡鏈夊叧鐨勬枃浠?鍏跺畠鐨勬枃浠跺ス榪炵悊閮戒笉鎯沖幓鐞嗙殑.
涓嬮潰鎴戜滑瀛︿範Makefile鏄浣曠紪鍐欑殑.
鍦∕akefile涓篃#寮濮嬬殑琛岄兘鏄敞閲婅.Makefile涓渶閲嶈鐨勬槸鎻忚堪鏂囦歡鐨勪緷璧栧叧緋葷殑璇存槑.涓鑸殑鏍煎紡鏄?
target: components
TAB rule
絎竴琛岃〃紺虹殑鏄緷璧栧叧緋?絎簩琛屾槸瑙勫垯.
姣斿璇存垜浠笂闈㈢殑閭d釜Makefile鏂囦歡鐨勭浜岃
main:main.o mytool1.o mytool2.o
琛?紺烘垜浠殑鐩爣(target)main鐨勪緷璧栧璞?components)鏄痬ain.o mytool1.o mytool2.o
褰撳氳禆鐨勫璞″湪鐩爣淇敼鍚庝慨鏀圭殑璇?灝辮鍘繪墽琛岃鍒欎竴琛屾墍鎸囧畾鐨勫懡浠?灝辮薄鎴戜滑鐨勪笂闈㈤偅涓狹akefile絎笁琛屾墍璇寸殑涓鏍瘋鎵ц gcc -o
main main.o mytool1.o mytool2.o 娉ㄦ剰瑙勫垯涓琛屼腑鐨凾AB琛ㄧず閭i噷鏄竴涓猅AB閿?
Makefile鏈変笁涓潪甯告湁鐢ㄧ殑鍙橀噺.鍒嗗埆鏄?@,$^,$<浠h〃鐨勬剰涔夊垎鍒槸:
$@--鐩爣鏂囦歡,$^--鎵鏈夌殑渚濊禆鏂囦歡,$<--絎竴涓緷璧栨枃浠?
濡傛灉鎴戜滑浣跨敤涓婇潰涓変釜鍙橀噺,閭d箞鎴戜滑鍙互綆鍖栨垜浠殑Makefile鏂囦歡涓?
# 榪欐槸綆鍖栧悗鐨凪akefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $<
mytool1.o:mytool1.c mytool1.h
gcc -c $<
mytool2.o:mytool2.c mytool2.h
gcc -c $<
緇忚繃綆鍖栧悗鎴戜滑鐨凪akefile鏄畝鍗曚簡涓鐐?涓嶈繃浜轟滑鏈夋椂鍊欒繕鎯崇畝鍗曚竴鐐?榪欓噷鎴戜滑瀛︿範涓涓狹akefile鐨勭己鐪佽鍒?
.c.o:
gcc -c $<
榪欎釜瑙勫垯琛ㄧず鎵鏈夌殑 .o鏂囦歡閮芥槸渚濊禆涓庣浉搴旂殑.c鏂囦歡鐨?渚嬪mytool.o渚濊禆浜巑ytool.c榪欐牱Makefile榪樺彲浠ュ彉涓?
# 榪欐槸鍐嶄竴嬈$畝鍖栧悗鐨凪akefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
.c.o:
gcc -c $<
濂戒簡,鎴戜滑鐨凪akefile 涔熷樊涓嶅浜?濡傛灉鎯崇煡閬撴洿澶氱殑鍏充簬Makefile瑙勫垯鍙互鏌ョ湅鐩稿簲鐨勬枃妗?
3.紼嬪簭搴撶殑閾炬帴
璇曠潃緙栬瘧涓嬮潰榪欎釜紼嬪簭
/* temp.c */
#include
int main(int argc,char **argv)
{
double value;
printf("value:%f\n",value);
}
榪欎釜紼嬪簭鐩稿綋綆鍗?浣嗘槸褰撴垜浠敤 gcc -o temp temp.c 緙栬瘧鏃朵細鍑虹幇涓嬮潰鎵紺虹殑閿欒.
/tmp/cc33Kydu.o: In function `main:
/tmp/cc33Kydu.o(.text+0xe): undefined reference to `log
collect2: ld returned 1 exit status
鍑?
鐜拌繖涓敊璇槸鍥犱負緙栬瘧鍣ㄦ壘涓嶅埌log鐨勫叿浣撳疄鐜?铏界劧鎴戜滑鍖呮嫭浜嗘紜殑澶存枃浠?浣嗘槸鎴戜滑鍦ㄧ紪璇戠殑鏃跺欒繕鏄榪炴帴紜畾鐨勫簱.鍦↙inux涓?涓轟簡浣跨敤鏁板鍑?
鏁?鎴戜滑蹇呴』鍜屾暟瀛﹀簱榪炴帴,涓烘鎴戜滑瑕佸姞鍏?-lm 閫夐」. gcc -o temp temp.c
-lm榪欐牱鎵嶈兘澶熸紜殑緙栬瘧.涔熻鏈変漢瑕侀棶,鍓嶉潰鎴戜滑鐢╬rintf鍑芥暟鐨勬椂鍊欐庝箞娌℃湁榪炴帴搴撳憿?鏄繖鏍風殑,瀵逛簬涓浜涘父鐢ㄧ殑鍑芥暟鐨勫疄鐜?gcc緙栬瘧鍣ㄤ細鑷?
鍔ㄥ幓榪炴帴涓浜涘父鐢ㄥ簱,榪欐牱鎴戜滑灝辨病鏈夊繀瑕佽嚜宸卞幓鎸囧畾浜? 鏈夋椂鍊欐垜浠湪緙栬瘧紼嬪簭鐨勬椂鍊欒繕瑕佹寚瀹氬簱鐨勮礬寰?榪欎釜鏃跺欐垜浠鐢ㄥ埌緙栬瘧鍣ㄧ殑
-L閫夐」鎸囧畾璺緞.姣斿璇存垜浠湁涓涓簱鍦?/home/hoyt/mylib涓?榪欐牱鎴戜滑緙栬瘧鐨勬椂鍊欒繕瑕佸姞涓?
-L/home/hoyt/mylib.瀵逛簬涓浜涙爣鍑嗗簱鏉ヨ,鎴戜滑娌℃湁蹇呰鎸囧嚭璺緞.鍙瀹冧滑鍦ㄨ搗緙虹渷搴撶殑璺緞涓嬪氨鍙互浜?緋葷粺鐨勭己鐪佸簱鐨勮礬寰?lib
/usr/lib /usr/local/lib 鍦ㄨ繖涓変釜璺緞涓嬮潰鐨勫簱,鎴戜滑鍙互涓嶆寚瀹氳礬寰?
榪樻湁涓涓棶棰?鏈夋椂鍊欐垜浠嬌鐢ㄤ簡鏌愪釜鍑芥暟,浣?
鏄垜浠笉鐭ラ亾搴撶殑鍚嶅瓧,榪欎釜鏃跺欐庝箞鍔炲憿?寰堟姳姝?瀵逛簬榪欎釜闂鎴戜篃涓嶇煡閬撶瓟妗?鎴戝彧鏈変竴涓偦鍔炴硶.棣栧厛,鎴戝埌鏍囧噯搴撹礬寰勪笅闈㈠幓鎵劇湅鐪嬫湁娌℃湁鍜屾垜鐢ㄧ殑鍑芥暟
鐩稿叧鐨勫簱,鎴戝氨榪欐牱鎵懼埌浜嗙嚎紼?thread)鍑芥暟鐨勫簱鏂囦歡(libpthread.a).
褰撶劧,濡傛灉鎵句笉鍒?鍙湁涓涓鏂規硶.姣斿鎴戣鎵緎in榪欎釜鍑芥暟鎵鍦ㄧ殑搴? 灝卞彧濂界敤 nm -o /lib/*.so|grep
sin>~/sin 鍛戒護,鐒跺悗鐪媬/sin鏂囦歡,鍒伴偅閲岄潰鍘繪壘浜?
鍦╯in鏂囦歡褰撲腑,鎴戜細鎵懼埌榪欐牱鐨勪竴琛宭ibm-2.1.2.so:00009fa0 W sin 榪欐牱鎴戝氨鐭ラ亾浜唖in鍦?
libm-2.1.2.so搴撻噷闈?鎴戠敤 -lm閫夐」灝卞彲浠ヤ簡(鍘繪帀鍓嶉潰鐨刲ib鍜屽悗闈㈢殑鐗堟湰鏍囧織,灝卞墿涓媘浜嗘墍浠ユ槸 -lm).
濡傛灉浣犵煡閬撴庝箞鎵?璇瘋刀蹇憡璇夋垜,鎴戝洖闈炲父鎰熸縺鐨?璋㈣阿!
4.紼嬪簭鐨勮皟璇?
鎴戜滑緙栧啓鐨勭▼搴忎笉澶彲鑳戒竴嬈℃у氨浼氭垚鍔熺殑,鍦ㄦ垜浠殑紼嬪簭褰撲腑,浼氬嚭鐜拌璁稿澶氭垜浠兂涓嶅埌鐨勯敊璇?榪欎釜鏃跺欐垜浠氨瑕佸鎴戜滑鐨勭▼搴忚繘琛岃皟璇曚簡.
鏈 甯哥敤鐨勮皟璇曡蔣浠舵槸gdb.濡傛灉浣犳兂鍦ㄥ浘褰㈢晫闈笅璋冭瘯紼嬪簭,閭d箞浣犵幇鍦ㄥ彲浠ラ夋嫨xxgdb.璁板緱瑕佸湪緙栬瘧鐨勬椂鍊欏姞鍏?
-g閫夐」.鍏充簬gdb鐨勪嬌鐢ㄥ彲浠ョ湅gdb鐨勫府鍔╂枃浠?鐢變簬鎴戞病鏈夌敤榪囪繖涓蔣浠?鎵浠ユ垜涔熶笉鑳藉璇村嚭濡備綍浣跨敤.
涓嶈繃鎴戜笉鍠滄鐢╣db.璺熻釜涓涓▼搴忔槸寰堢儲鐨勪簨鎯?鎴戜竴鑸敤鍦ㄧ▼搴忓綋涓緭鍑轟腑闂村彉閲忕殑鍊兼潵璋冭瘯紼嬪簭鐨?褰撶劧浣犲彲浠ラ夋嫨鑷繁鐨勫姙娉?娌℃湁蹇呰鍘誨鍒漢鐨?鐜?
鍦ㄦ湁浜嗚澶欼DE鐜,閲岄潰宸茬粡鑷繁甯︿簡璋冭瘯鍣ㄤ簡.浣犲彲浠ラ夋嫨鍑犱釜璇曚竴璇曟壘鍑鴻嚜宸卞枩嬈㈢殑涓涓敤.
5.澶存枃浠跺拰緋葷粺姹傚姪
鏈夋椂鍊欐垜浠彧鐭ラ亾涓涓嚱鏁扮殑澶ф褰㈠紡,涓嶈寰楃‘鍒囩殑琛ㄨ揪寮?鎴栬呮槸涓嶈寰楃潃鍑芥暟鍦ㄩ偅涓ご鏂囦歡榪涜浜嗚鏄?榪欎釜鏃跺欐垜浠彲浠ユ眰鍔╃郴緇?
姣?濡傝鎴戜滑鎯崇煡閬揻read榪欎釜鍑芥暟鐨勭‘鍒囧艦寮?鎴戜滑鍙鎵ц man fread
緋葷粺灝變細杈撳嚭鐫鍑芥暟鐨勮緇嗚В閲婄殑.鍜岃繖涓嚱鏁版墍鍦ㄧ殑澶存枃浠惰鏄庝簡. 濡傛灉鎴戜滑瑕亀rite榪欎釜鍑芥暟鐨勮鏄?褰撴垜浠墽琛宮an
write鏃?杈撳嚭鐨勭粨鏋滃嵈涓嶆槸鎴戜滑鎵闇瑕佺殑.
鍥犱負鎴戜滑瑕佺殑鏄痺rite榪欎釜鍑芥暟鐨勮鏄?鍙槸鍑烘潵鐨勫嵈鏄痺rite榪欎釜鍛戒護鐨勮鏄?涓轟簡寰楀埌write鐨勫嚱鏁拌鏄庢垜浠鐢?man 2 write.
2琛ㄧず鎴戜滑鐢ㄧ殑write榪欎釜鍑芥暟鏄郴緇熻皟鐢ㄥ嚱鏁?榪樻湁涓涓垜浠父鐢ㄧ殑鏄?琛ㄧず鍑芥暟鏄疌鐨勫簱鍑芥暟.
璁頒綇涓嶇浠涔堟椂鍊?man閮芥槸鎴戜滑鐨勬渶濂藉姪鎵?
----------------------------------------------------------------
濂戒簡,榪欎竴绔犲氨璁茶繖涔堝浜?鏈変簡榪欎簺鐭ヨ瘑鎴戜滑灝卞彲浠ヨ繘鍏ユ縺鍔ㄤ漢蹇冪殑Linux涓嬬殑C紼嬪簭鎺㈤櫓媧誨姩.
]]>
]]>
涓嬮潰閫氳繃涓涓緥瀛愭潵浠嬬粛濡備綍鐢熸垚涓涓姩鎬佸簱銆傝繖閲屾湁涓涓ご鏂囦歡錛歴o_test.h錛屼笁涓?c鏂囦歡錛歵est_a.c銆乼est_b.c銆乼est_c.c錛屾垜浠皢榪欏嚑涓枃浠剁紪璇戞垚涓涓姩鎬佸簱錛歭ibtest.so銆?br />
so_test.h錛?br />
#include
#include
void test_a();
void test_b();
void test_c();
test_a.c錛?br />
#include "so_test.h"
void test_a()
{
printf("this is in test_a...\n");
}
test_b.c錛?br />
#include "so_test.h"
void test_b()
{
printf("this is in test_b...\n");
}
test_a.c錛?br />
#include "so_test.h"
void test_c()
{
printf("this is in test_c...\n");
}
灝嗚繖鍑犱釜鏂囦歡緙栬瘧鎴愪竴涓姩鎬佸簱錛歭ibtest.so
$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
2銆佸姩鎬佸簱鐨勯摼鎺?br />
鍦?銆佷腑錛屾垜浠凡緇忔垚鍔熺敓鎴愪簡涓涓嚜宸辯殑鍔ㄦ侀摼鎺ュ簱libtest.so錛屼笅闈㈡垜浠氳繃涓涓▼搴忔潵璋冪敤榪欎釜搴撻噷鐨勫嚱鏁般傜▼搴忕殑婧愭枃浠朵負錛歵est.c銆?br />
test.c錛?br />
#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}
l 灝唗est.c涓庡姩鎬佸簱libtest.so閾炬帴鐢熸垚鎵ц鏂囦歡test錛?br />
$ gcc test.c -L. -ltest -o test
l 嫻嬭瘯鏄惁鍔ㄦ佽繛鎺ワ紝濡傛灉鍒楀嚭libtest.so錛岄偅涔堝簲璇ユ槸榪炴帴姝e父浜?br />
$ ldd test
l 鎵цtest錛屽彲浠ョ湅鍒板畠鏄浣曡皟鐢ㄥ姩鎬佸簱涓殑鍑芥暟鐨勩?br />3銆佺紪璇戝弬鏁拌В鏋?br />鏈涓昏鐨勬槸GCC鍛戒護琛岀殑涓涓夐」:
-shared 璇ラ夐」鎸囧畾鐢熸垚鍔ㄦ佽繛鎺ュ簱錛堣榪炴帴鍣ㄧ敓鎴怲綾誨瀷鐨勫鍑虹鍙瘋〃錛屾湁鏃跺欎篃鐢熸垚寮辮繛鎺綾誨瀷鐨勫鍑虹鍙鳳級錛屼笉鐢ㄨ鏍囧織澶栭儴紼嬪簭鏃犳硶榪炴帴銆傜浉褰撲簬涓涓彲鎵ц鏂囦歡
l -fPIC錛氳〃紺虹紪璇戜負浣嶇疆鐙珛鐨勪唬鐮侊紝涓嶇敤姝ら夐」鐨勮瘽緙栬瘧鍚庣殑浠g爜鏄綅緗浉鍏崇殑鎵浠ュ姩鎬佽澆鍏ユ椂鏄氳繃浠g爜鎷瘋礉鐨勬柟寮忔潵婊¤凍涓嶅悓榪涚▼鐨勯渶瑕侊紝鑰屼笉鑳借揪鍒扮湡姝d唬鐮佹鍏變韓鐨勭洰鐨勩?br />
l -L.錛氳〃紺鴻榪炴帴鐨勫簱鍦ㄥ綋鍓嶇洰褰曚腑
l -ltest錛氱紪璇戝櫒鏌ユ壘鍔ㄦ佽繛鎺ュ簱鏃舵湁闅愬惈鐨勫懡鍚嶈鍒欙紝鍗沖湪緇欏嚭鐨勫悕瀛楀墠闈㈠姞涓妉ib錛屽悗闈㈠姞涓?so鏉ョ‘瀹氬簱鐨勫悕縐?br />
l LD_LIBRARY_PATH錛氳繖涓幆澧冨彉閲忔寚紺哄姩鎬佽繛鎺ュ櫒鍙互瑁呰澆鍔ㄦ佸簱鐨勮礬寰勩?br />
l 褰撶劧濡傛灉鏈塺oot鏉冮檺鐨勮瘽錛屽彲浠ヤ慨鏀?etc/ld.so.conf鏂囦歡錛岀劧鍚庤皟鐢?/sbin/ldconfig鏉ヨ揪鍒板悓鏍風殑鐩殑錛屼笉榪囧鏋滄病鏈塺oot鏉冮檺錛岄偅涔堝彧鑳介噰鐢ㄨ緭鍑篖D_LIBRARY_PATH鐨勬柟娉曚簡銆?br />4銆佹敞鎰?br />
璋冪敤鍔ㄦ佸簱鐨勬椂鍊欐湁鍑犱釜闂浼氱粡甯哥鍒幫紝鏈夋椂錛屾槑鏄庡凡緇忓皢搴撶殑澶存枃浠舵墍鍦ㄧ洰褰?閫氳繃 鈥?I鈥?include榪涙潵浜嗭紝搴撴墍鍦ㄦ枃浠墮氳繃
鈥?L鈥濆弬鏁板紩瀵鹼紝騫舵寚瀹氫簡鈥?l鈥濈殑搴撳悕錛屼絾閫氳繃ldd鍛戒護瀵熺湅鏃訛紝灝辨槸姝繪椿鎵句笉鍒頒綘鎸囧畾閾炬帴鐨剆o鏂囦歡錛岃繖鏃朵綘瑕佷綔鐨勫氨鏄氳繃淇敼
LD_LIBRARY_PATH鎴栬?etc/ld.so.conf鏂囦歡鏉ユ寚瀹氬姩鎬佸簱鐨勭洰褰曘傞氬父榪欐牱鍋氬氨鍙互瑙e喅搴撴棤娉曢摼鎺ョ殑闂浜嗐?br />
- 浣滆咃細 鍍忛涓鏍鋒祦嫻?璁塊棶緇熻錛?1銆2005騫?0鏈?1鏃? 鏄熸湡浜?17:08 鍔犲叆鍗氶噰
]]>
絳旀鏄偗瀹氱殑錛孡INUX鐨勫姩鎬侀摼鎺ュ簱涓嶄粎鏈夛紝鑰屼笖涓烘暟涓嶅皯銆傚湪/lib鐩綍涓嬶紝灝辨湁璁稿浠?so浣滃悗緙鐨勬枃浠訛紝榪欏氨鏄疞INUX緋葷粺搴旂敤鐨勫姩鎬侀摼鎺ュ簱錛?
鍙笉榪囦笌WINDOWS鍙硶涓嶅悓錛屽畠鍙玸o錛屽嵆Shared Object錛屽叡浜璞°?鍦↙INUX涓嬶紝闈欐佸嚱鏁板簱鏄互.a浣滃悗緙鐨?
X-WINDOW浣滀負LINUX涓嬬殑鏍囧噯鍥懼艦紿楀彛鐣岄潰錛屽畠鏈韓灝遍噰鐢ㄤ簡寰堝鐨勫姩鎬侀摼鎺ュ簱(鍦?usr/X11R6/lib鐩綍涓?錛屼互鏂逛究紼嬪簭闂寸殑鍏變韓錛?
鑺傜渷鍗犵敤絀洪棿銆傝憲鍚嶇殑APACHE緗戦〉鏈嶅姟鍣紝涔熼噰鐢ㄤ簡鍔ㄦ侀摼鎺ュ簱錛屼互渚挎墿鍏呯▼搴忓姛鑳姐備綘鍙渶灝哖HP鍔ㄦ侀摼鎺ュ簱鎷峰埌鍏跺叡浜洰褰曪紝淇敼涓涓嬮厤緗紝
APACHE灝卞彲浠ユ敮鎸丳HP緗戦〉浜嗐傚鏋滀綘鎰挎剰錛屽彲浠ヨ嚜宸辯紪鍐欏姩鎬侀摼鎺ュ簱錛岃APACHE鏀寔浣犺嚜宸卞畾涔夌殑緗戦〉鏍煎紡銆傝繖灝辨槸鍔ㄦ侀摼鎺ョ殑濂藉銆?/td> 1銆丩INUX涓嬪姩鎬侀摼鎺ュ簱鐨勫垱寤?/b>
鍦↙INUX緋葷粺涓嬶紝鍒涘緩鍔ㄦ侀摼鎺ュ簱鏄歡鍐嶇畝鍗曚笉榪囩殑浜嬫儏銆傚彧瑕佸湪緙栬瘧鍑芥暟搴撴簮紼嬪簭鏃跺姞涓?shared閫夐」鍗沖彲錛岃繖鏍鋒墍鐢熸垚鐨勬墽琛岀▼搴忓嵆涓哄姩鎬侀摼鎺ュ簱銆備粠鏌愮鎰忎箟涓婃潵璇達紝鍔ㄦ侀摼鎺ュ簱涔熸槸涓縐嶆墽琛岀▼搴忋傛寜涓鑸鍒欙紝紼嬪簭鍚嶅簲甯?so鍚庣紑銆備笅闈婦涓緥瀛愯璇淬?/td>
鎴戝噯澶囩紪鍐欎袱涓嚱鏁幫紝涓涓敤浜庢煡璇㈠綋鍓嶆棩鏈焔etdate錛屼竴涓敤浜庢煡璇㈠綋鍓嶆椂闂磄ettime錛屽茍灝嗚繖涓や釜鍑芥暟瀛樹簬鍔ㄦ侀摼鎺ュ簱my.so涓備負姝わ紝闇瑕佸仛浠ヤ笅鍑犻」宸ヤ綔銆?/td>
1.1 緙栧啓鐢ㄦ埛鎺ュ彛鏂囦歡datetime.h錛屽唴瀹瑰涓?姣忚鍓嶉潰鐨勬暟瀛椾負琛屽彿)錛?/td>
----------------------------------------------------------------------
1 /* datetime.h : 綰墊í杞歡鍒朵綔涓績闆ㄤ害濂囩紪鍐? 2001-06-28. */
2
3 #ifndef __DATETIME_H
4
5 #define __DATETIME_H
6
7 /* 鏃ユ湡緇撴瀯 */
8 typedef struct
9 {
10 int year;
11 int mon;
12 int day;
13 }DATETYPE;
14
15 /* 鏃墮棿緇撴瀯 */
16 typedef struct
17 {
18 char hour;
19 char min;
20 char sec;
21 }TIMETYPE;
22
23 /* 鍑芥暟鍘熷瀷璇存槑 */
24
25 #ifdef SHARED
26 int (*getdate)(DATETYPE *d);
27 #else
28 int getdate(DATETYPE *d);
29 #endif
30
31 #ifdef SHARED
32 int (*gettime)(TIMETYPE *t);
33 #else
34 int gettime(TIMETYPE *t);
35 #endif
36
37 #endif
38
----------------------------------------------------------------------
榪欎釜鐢ㄦ埛鎺ュ彛鏂囦歡涓紝鍏堝畾涔変簡鏃ユ湡涓庢椂闂寸粨鏋勶紝鎺ョ潃瀹氫箟涓涓嬪嚱鏁扮殑鍘熷瀷銆傚姩鎬佸嚱鏁頒笌闈欐佸嚱鏁扮殑鍘熷瀷璇存槑涓嶅悓鐨勬槸錛屽姩鎬佸嚱鏁板簲浣跨敤(*鍑芥暟鍚?鐨勫艦寮忥紝浠ヤ究寮曠敤鍏舵寚閽堛傝嫢瑕佸紩鐢ㄦ枃浠朵腑鐨勫姩鎬佸嚱鏁拌鏄庯紝鐢ㄦ埛搴旇瀹氫箟涓涓婼HARED瀹忥紝榪欐牱鎵嶈兘浣跨敤銆?/td>
1.2 緙栧啓getdate.c錛屾簮紼嬪簭濡備笅錛?/td>
----------------------------------------------------------------------
1 /* getdate.c : 綰墊í杞歡鍒朵綔涓績闆ㄤ害濂囩紪鍐? 2001-06-28. */
2
3 #include "time.h"
4 #include "datetime.h"
5
6 int getdate(DATETYPE *d)
7 {
8 long ti;
9 struct tm *tm;
10
11 time(&ti);
12 tm=localtime(&ti);
13 d->year=tm->tm_year+1900;
14 d->mon=tm->tm_mon+1;
15 d->day=tm->tm_mday;
16 }
17
----------------------------------------------------------------------
鍦╣etdate鍑芥暟涓紝鍏堣皟鐢╰ime鍙栧緱浠ョ璁$殑緋葷粺鏃墮棿錛屽啀鐢╨ocaltime鍑芥暟杞崲涓涓嬫椂闂寸粨鏋勶紝鏈鍚庤皟鏁村緱鍒版紜殑鏃ユ湡銆?/td>
1.3 緙栧啓gettime.c錛屾簮紼嬪簭濡備笅錛?/td>
----------------------------------------------------------------------
1 /* gettime.c : 綰墊í杞歡鍒朵綔涓績闆ㄤ害濂囩紪鍐? 2001-06-28. */
2
3 #include "time.h"
4 #include "datetime.h"
5
6 int gettime(TIMETYPE *t)
7 {
8 long ti;
9 struct tm *tm;
10
11 time(&ti);
12 tm=localtime(&ti);
13 t->hour=tm->tm_hour;
14 t->min=tm->tm_min;
15 t->sec=tm->tm_sec;
16 }
17
----------------------------------------------------------------------
gettime鍑芥暟涓巊etdate鍑芥暟鐩鎬豢錛屽厛鐢╰ime鍑芥暟鍙栧緱浠ョ璁$殑緋葷粺鏃墮棿錛屽啀鐢╨ocaltime鍑芥暟杞崲涓涓嬫椂闂寸粨鏋勶紝鏈鍚庤繑鍥炲綋鍓嶇殑鏃墮棿(涓嶉渶璋冩暣)銆?/td>
1.4 緙栧啓緇存姢鏂囦歡makefile-lib錛屽唴瀹瑰涓嬶細
----------------------------------------------------------------------
1 # makefile-lib : 綰墊í杞歡鍒朵綔涓績闆ㄤ害濂囩紪鍐? 2001-06-28.
2
3 all : my.so
4
5 SRC = getdate.c gettime.c
6
7 TGT = $(SRC:.c=.o)
8
9 $(SRC) : datetime.h
10 @touch $@
11
12 %.o : %.c
13 cc -c $?
14
15 # 鍔ㄦ佸嚱鏁板簱(my.so)鐢熸垚
16 my.so : $(TGT)
17 cc -shared -o $@ $(TGT)
18
----------------------------------------------------------------------
緙栧啓緇存姢鏂囦歡鐨勭洰鐨勶紝鍦ㄤ簬鏂逛究紼嬪簭鍛樼淮鎶ょ▼搴忥紝灝ゅ叾鏄淮鎶ゆ瘮杈冨ぇ鐨勫伐紼嬮」鐩備竴涓礌璐ㄨ壇濂界殑紼嬪簭鍛樺簲璇ュ浼氱啛緇冨湴緙栧啓緇存姢鏂囦歡makefile銆傚畾涔変簡鏂?
浠墮棿鐨勪緷璧栧叧緋誨悗錛屼竴鏃︽簮鏂囦歡鍙戠敓鍙樺寲錛屼粎闇make涓涓嬶紝鍏剁洰鏍囨枃浠剁淮鎶や唬鐮佷細鑷姩鎵ц錛屼粠鑰岃嚜鍔ㄦ洿鏂扮洰鏍囨枃浠訛紝鍑忓皯浜嗚澶氬伐浣滈噺銆傛敞鎰?
姣忚緇存姢浠g爜蹇呴』浠AB(璺蟲牸閿?寮濮嬶紝涓嶆槸鐨勮瘽make鏃跺皢鍑洪敊銆?/td>
鏈淮鎶ゆ枃浠剁1琛屾槸娉ㄩ噴琛岋紝浠?鍙峰紑澶達紱鏂囦歡絎?琛屽畾涔夋墍鏈夐渶瑕佺淮鎶ょ殑鍑芥暟搴擄紱絎?琛屽畾涔夌浉鍏蟲簮紼嬪簭鏂囦歡錛涚7琛屽畾涔夌洰鏍囨枃浠訛紱絎?-10琛岃鏄庢墍鏈夋簮紼?
搴忎緷璧栦簬datetime.h澶存枃浠訛紝騫舵湁鐩稿簲緇存姢浠g爜錛屽嵆touch涓涓嬶紝鏇存柊涓涓嬫簮鏂囦歡鐨勬椂闂達紱絎?2-13琛屽畾涔?o鏂囦歡渚濊禆浜庣浉搴旂殑.c鏂囦歡錛屽茍
鎸囧畾浜嗙淮鎶や唬鐮侊紝鍗崇敤cc緙栬瘧涓涓嬶紱絎?6-17琛屽畾涔夊叡浜簱my.so渚濊禆鐨勭洰鏍囨枃浠訛紝緇存姢浠g爜涓敤-shared緙栬瘧閫夐」錛屼互鐢熸垚鍔ㄦ侀摼鎺ュ簱
my.so銆?/td>
1.5 榪愯make -f makefile-lib 鍛戒護
make榪愯鍚庯紝鍔ㄦ侀摼鎺ュ簱my.so灝變駭鐢熶簡錛屾垜浠氨鍙互鍦ㄧ▼搴忎腑璋冪敤浜嗐傚鏋滄兂璁╃郴緇熸墍鏈夌敤鎴烽兘鍙互浣跨敤錛屽垯搴斾互root鐢ㄦ埛鐧誨綍緋葷粺錛屽皢榪欎釜搴撴嫹璐?
鍒?lib鐩綍涓?鍛戒護錛歝p my.so /lib)錛屾垨鑰呭湪/lib鐩綍涓嬪緩涓鍙瘋繛鎺ュ嵆鍙?鍛戒護錛歭n -s `pwd`/my.so
/lib)銆?/td> 2銆丩INUX涓嬪姩鎬侀摼鎺ュ簱鐨勪嬌鐢?/b>
2.1 閲嶈鐨刣lfcn.h澶存枃浠?/td>
LINUX涓嬩嬌鐢ㄥ姩鎬侀摼鎺ュ簱錛屾簮紼嬪簭闇瑕佸寘鍚玠lfcn.h澶存枃浠訛紝姝ゆ枃浠跺畾涔変簡璋冪敤鍔ㄦ侀摼鎺ュ簱鐨勫嚱鏁扮殑鍘熷瀷銆備笅闈㈣緇嗚鏄庝竴涓嬭繖浜涘嚱鏁般?/td>
2.1.1 dlerror
鍘熷瀷涓? const char *dlerror(void);
褰撳姩鎬侀摼鎺ュ簱鎿嶄綔鍑芥暟鎵ц澶辮觸鏃訛紝dlerror鍙互榪斿洖鍑洪敊淇℃伅錛岃繑鍥炲間負NULL鏃惰〃紺烘搷浣滃嚱鏁版墽琛屾垚鍔熴?/td>
2.1.2 dlopen
鍘熷瀷涓? void *dlopen (const char *filename, int flag);
dlopen鐢ㄤ簬鎵撳紑鎸囧畾鍚嶅瓧(filename)鐨勫姩鎬侀摼鎺ュ簱錛屽茍榪斿洖鎿嶄綔鍙ユ焺銆?/td>
filename: 濡傛灉鍚嶅瓧涓嶄互/寮澶達紝鍒欓潪緇濆璺緞鍚嶏紝灝嗘寜涓嬪垪鍏堝悗欏哄簭鏌ユ壘璇ユ枃浠躲?/td>
(1) 鐢ㄦ埛鐜鍙橀噺涓殑LD_LIBRARY鍊鹼紱
(2) 鍔ㄦ侀摼鎺ョ紦鍐叉枃浠?etc/ld.so.cache
(3) 鐩綍/lib錛?usr/lib
flag琛ㄧず鍦ㄤ粈涔堟椂鍊欒В鍐蟲湭瀹氫箟鐨勭鍙?璋冪敤)銆傚彇鍊兼湁涓や釜:
1) RTLD_LAZY : 琛ㄦ槑鍦ㄥ姩鎬侀摼鎺ュ簱鐨勫嚱鏁頒唬鐮佹墽琛屾椂瑙e喅銆?/td>
2) RTLD_NOW : 琛ㄦ槑鍦╠lopen榪斿洖鍓嶅氨瑙e喅鎵鏈夋湭瀹氫箟鐨勭鍙鳳紝涓鏃︽湭瑙e喅錛宒lopen灝嗚繑鍥為敊璇?/td>
dlopen璋冪敤澶辮觸鏃訛紝灝嗚繑鍥濶ULL鍊鹼紝鍚﹀垯榪斿洖鐨勬槸鎿嶄綔鍙ユ焺銆?/td>
2.1.3 dlsym : 鍙栧嚱鏁版墽琛屽湴鍧
鍘熷瀷涓? void *dlsym(void *handle, char *symbol);
dlsym鏍規嵁鍔ㄦ侀摼鎺ュ簱鎿嶄綔鍙ユ焺(handle)涓庣鍙?symbol)錛岃繑鍥炵鍙峰搴旂殑鍑芥暟鐨勬墽琛屼唬鐮佸湴鍧銆傜敱姝ゅ湴鍧錛屽彲浠ュ甫鍙傛暟鎵ц鐩稿簲鐨勫嚱鏁般?/td>
濡傜▼搴忎唬鐮? void (*add)(int x,int y); /* 璇存槑涓涓嬭璋冪敤鐨勫姩鎬佸嚱鏁癮dd */
add=dlsym("xxx.so","add"); /* 鎵撳紑xxx.so鍏變韓搴?鍙朼dd鍑芥暟鍦板潃 */
add(89,369); /* 甯︿袱涓弬鏁?9鍜?69璋冪敤add鍑芥暟 */
2.1.4 dlclose : 鍏抽棴鍔ㄦ侀摼鎺ュ簱
鍘熷瀷涓? int dlclose (void *handle);
dlclose鐢ㄤ簬鍏抽棴鎸囧畾鍙ユ焺鐨勫姩鎬侀摼鎺ュ簱錛屽彧鏈夊綋姝ゅ姩鎬侀摼鎺ュ簱鐨勪嬌鐢ㄨ鏁頒負0鏃?鎵嶄細鐪熸琚郴緇熷嵏杞姐?/td>
2.2 鍦ㄧ▼搴忎腑浣跨敤鍔ㄦ侀摼鎺ュ簱鍑芥暟
2.2.1 紼嬪簭鑼冧緥
涓嬮潰鐨勭▼搴忚杞戒簡鍔ㄦ侀摼鎺ュ簱my.so錛屽茍鐢╣etdate,gettime鍙栧緱褰撳墠鏃ユ湡涓庢椂闂村悗杈撳嚭銆?/td>
----------------------------------------------------------------------
1 /************************************/
2 /* 鏂囦歡鍚嶇О: dy.c */
3 /* 鍔熻兘鎻忚堪: 鍔ㄦ侀摼鎺ュ簱搴旂敤紺鴻寖紼嬪簭 */
4 /* 紼嬪簭緙栧啓: 綰墊í杞歡鍒朵綔涓績闆ㄤ害濂?*/
5 /* 緙栧啓鏃墮棿: 2001-06-28 */
6 /************************************/
7
8 #include "stdio.h" /* 鍖呭惈鏍囧噯杈撳叆杈撳嚭鏂囦歡 */
9
10 #include "dlfcn.h" /* 鍖呭惈鍔ㄦ侀摼鎺ュ姛鑳芥帴鍙f枃浠?*/
11 #define SOFILE "./my.so" /* 鎸囧畾鍔ㄦ侀摼鎺ュ簱鍚嶇О */
12
13 #define SHARED /* 瀹氫箟瀹?紜鍏變韓,浠ヤ究寮曠敤鍔ㄦ佸嚱鏁?*/
14 #include "datetime.h" /* 鍖呭惈鐢ㄦ埛鎺ュ彛鏂囦歡 */
15
16 main()
17 {
18 DATETYPE d;
19 TIMETYPE t;
20 void *dp;
21 char *error;
22
23 puts("鍔ㄦ侀摼鎺ュ簱搴旂敤紺鴻寖");
24
25 dp=dlopen(SOFILE,RTLD_LAZY); /* 鎵撳紑鍔ㄦ侀摼鎺ュ簱 */
26
27 if (dp==NULL) /* 鑻ユ墦寮澶辮觸鍒欓鍑?*/
28 {
29 fputs(dlerror(),stderr);
30 exit(1);
31 }
32
33 getdate=dlsym(dp,"getdate"); /* 瀹氫綅鍙栨棩鏈熷嚱鏁?*/
34
35 error=dlerror(); /* 媯嫻嬮敊璇?*/
36 if (error) /* 鑻ュ嚭閿欏垯閫鍑?*/
37 {
38 fputs(error,stderr);
39 exit(1);
40 }
41
42 getdate(&d); /* 璋冪敤姝ゅ叡浜嚱鏁?*/
43 printf("褰撳墠鏃ユ湡: %04d-%02d-%02d\n",d.year,d.mon,d.day);
44
45 gettime=dlsym(dp,"gettime"); /* 瀹氫綅鍙栨椂闂村嚱鏁?*/
46
47 error=dlerror(); /* 媯嫻嬮敊璇?*/
48 if (error) /* 鑻ュ嚭閿欏垯閫鍑?*/
49 {
50 fputs(error,stderr);
51 exit(1);
52 }
53
54 gettime(&t); /* 璋冪敤姝ゅ叡浜嚱鏁?*/
55 printf("褰撳墠鏃墮棿: %02d:%02d:%02d\n",t.hour,t.min,t.sec);
56
57 dlclose(dp); /* 鍏抽棴鍏變韓搴?*/
58
59 exit(0); /* 鎴愬姛榪斿洖 */
60
61 }
----------------------------------------------------------------------
紼嬪簭璇存槑:
絎?琛? 鍖呭惈鏍囧噯杈撳叆杈撳嚭澶存枃浠?鍥犱負紼嬪簭涓嬌鐢ㄤ簡printf,puts,fputs絳夋爣鍑嗚緭鍏ヨ緭鍑哄嚱鏁?闇瑕佽緙栬瘧鍣ㄦ牴鎹ご鏂囦歡涓嚱鏁扮殑鍘熷瀷,媯鏌ヤ竴涓嬭娉?
絎?0-11琛? 鍖呭惈鍔ㄦ侀摼鎺ュ簱鍔熻兘澶存枃浠?騫跺畾涔夊姩鎬侀摼鎺ュ簱鍚嶇О;
絎?3-14琛? 瀹氫箟瀹廠HARED浠ヤ究寮曠敤14琛岀殑澶存枃浠禿atetime.h涓殑鍔ㄦ佸嚱鏁拌鏄?
絎?5琛? 鐢╠lopen鎵撳紑SOFILE鍏變韓搴?榪斿洖鍙ユ焺dp;
絎?7-31琛? 媯嫻媎p鏄惁涓虹┖,涓虹┖鍒欐樉紺洪敊璇悗閫鍑?
絎?3琛? 鐢╠lsym鍙栧緱getdate鍑芥暟鍔ㄦ佸湴鍧;
絎?5-40琛? 濡傛灉dlerror榪斿洖鍊間笉涓虹┖,鍒檇lsym鎵ц鍑洪敊,紼嬪簭鏄劇ず閿欒鍚庨鍑?
絎?2-43琛? 鎵цgetdate璋冪敤,杈撳嚭褰撳墠鏃ユ湡;
絎?5琛? 鐢╠lsym鍙栧緱gettime鍑芥暟鍔ㄦ佸湴鍧;
絎?7-52琛? 濡傛灉dlerror榪斿洖鍊間笉涓虹┖,鍒檇lsym鎵ц鍑洪敊,紼嬪簭鏄劇ず閿欒鍚庨鍑?
絎?4-55琛? 鎵цgettime璋冪敤,杈撳嚭褰撳墠鏃墮棿;
絎?7琛? 鐢╠lclose鍏抽棴dp鎵鎸囩ず鐨勫姩鎬侀摼鎺ュ簱;
絎?9琛? 紼嬪簭閫鍑?榪斿洖0鍊箋?/td>
2.2.2 緙栧啓緇存姢鏂囦歡
緇存姢鏂囦歡makefile鍐呭濡備笅:
----------------------------------------------------------------------
1 # makefile : 綰墊í杞歡鍒朵綔涓績闆ㄤ害濂囩紪鍐? 2001-06-28.
2
3 all : dy
4
5 DYSRC = dy.c
6
7 DYTGT = $(DYSRC:.c=.o)
8
9 %.o : %.c
10 cc -c $?
11
12 # 鍔ㄦ佸簱搴旂敤紺鴻寖紼嬪簭
13 dy : $(DYTGT)
14 cc -rdynamic -s -o $@ $(DYTGT) -ldl
15
----------------------------------------------------------------------
緇存姢鏂囦歡璇存槑:
絎?琛? 瀹氫箟鎵鏈夐渶瑕佺淮鎶ょ殑妯″潡;
絎?琛? 瀹氫箟婧愮▼搴?
絎?琛? 瀹氫箟鐩爣鏂囦歡;
絎?-10琛? 瀹氫箟.o鏂囦歡渚濊禆浜?c鏂囦歡,緇存姢浠g爜涓衡渃c -c 鍙樺姩鐨勬簮鏂囦歡鍚嶁?
絎?3-14琛? 瀹氫箟dy渚濊禆浜庡彉閲廌YTGT鎸囩ず鐨勫?緇存姢浠g爜涓噰鐢?rdynamic閫夐」浠ユ寚瀹氳緭鍑烘枃浠朵負鍔ㄦ侀摼鎺ョ殑鏂瑰紡錛岄夐」-s鎸囧畾鍒犻櫎鐩爣鏂囦歡涓殑絎﹀彿琛?鏈鍚庣殑閫夐」-ldl鍒欐寚紺鴻閰嶇▼搴弆d闇瑕佽杞絛l鍑芥暟搴撱?/td>
2.2.3 榪愯make鍛戒護
榪愯make鍚庡皢浜х敓鎵ц鏂囦歡dy錛岃繍琛屽悗灝嗕駭鐢熷涓嬬被浼間俊鎭細
鍔ㄦ侀摼鎺ュ簱搴旂敤紺鴻寖
褰撳墠鏃ユ湡: 2001-06-28
褰撳墠鏃墮棿: 10:06:21
褰撳垹闄y.so鏂囦歡鏃?灝嗗嚭鐜頒互涓嬩俊鎭?
鍔ㄦ侀摼鎺ュ簱搴旂敤紺鴻寖
my.so: cannot open shared object file: 鏂囦歡鎴栫洰褰曚笉瀛樺湪 3銆佸皬緇?/b>
LINUX鍒涘緩涓庝嬌鐢ㄥ姩鎬侀摼鎺ュ簱騫朵笉鏄竴浠墮毦浜嬨?/td>
緙栬瘧鍑芥暟婧愮▼搴忔椂閫夌敤-shared閫夐」鍗沖彲鍒涘緩鍔ㄦ侀摼鎺ュ簱錛屾敞鎰忓簲浠?so鍚庣紑鍛藉悕錛屾渶濂芥斁鍒板叕鐢ㄥ簱鐩綍(濡?lib,/usr/lib絳?涓嬮潰錛屽茍瑕佸啓濂界敤鎴鋒帴鍙f枃浠訛紝浠ヤ究鍏跺畠鐢ㄦ埛鍏變韓銆?/td>
鐐瑰嚮榪欓噷涓嬭澆婧愮▼搴?/font>銆?img src ="http://m.shnenglu.com/mydriverc/aggbug/33162.html" width = "1" height = "1" />
浣跨敤鍔ㄦ侀摼鎺ュ簱錛屾簮紼嬪簭涓鍖呭惈dlfcn.h澶存枃浠訛紝鍐欑▼搴忔椂娉ㄦ剰dlopen絳夊嚱鏁扮殑姝g‘璋冪敤錛岀紪璇戞椂瑕侀噰鐢?rdynamic閫夐」涓?ldl閫夐」錛屼互浜х敓鍙皟鐢ㄥ姩鎬侀摼鎺ュ簱鐨勬墽琛屼唬鐮併?/td>
]]>
]]>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
gcc 緙栬瘧閫夐」,鑷繁緲昏瘧鐨?
-o 璁懼畾杈撳嚭鏂囦歡鍚?
-c 鍙紪璇?涓嶈繛鎺?
-E 鍙仛棰勭紪璇?
-pipe 鍦ㄥ涓紪璇戣繃紼嬩箣闂翠嬌鐢ㄧ閬?
--version 鏄劇ず鐗堟湰.
-static 闈欐佽繛鎺?
-ansi C 妯″紡涓嬫敮鎸佹墍鏈?ISO C90 鏍囧噯鐨?C 紼嬪簭, C++ 妯″紡涓嬪幓闄ゅ GNU C++ 鎵╁睍鐨勬敮鎸?GNU鎵╁睍浼氫笌 ISO C++ 鍐茬獊)
-std=
紜畾緙栬瘧璇█鐨勬爣鍑?鐩墠鍙湪緙栬瘧 C 鍜?C++ 鏃舵湁鏁?-fno-asm 涓嶅皢 "asm" "inline" "typeof"
浣滀負鍏抽敭瀛?鍙互鐢ㄤ粬浠仛鍙橀噺鍚嶇瓑. -funsigned-char 灝?char"鐨勬暟鎹被鍨嬭涓?unsigned",鍗蟲棤絎﹀彿.
-fsigned-char 姝eソ鐩稿弽,灝?char"璁句負"signed".
-fsyntax-only 鍙鏌ヨ娉曢敊璇?涓嶅仛鍏朵粬浠諱綍浜?
-pedantic 鏄劇ず鎵鏈夌殑 ISO C 鍜?ISO C++ 鐨勮鍛?騫朵笖鎷掔粷鎵鏈変嬌鐢ㄧ姝㈡墿灞曠殑紼嬪簭
-Wall 鏄劇ず鎵鏈夎鍛?
-g 灝嗙紪璇戞椂鐨勮皟璇曚俊鎭繚瀛樺埌鏈湴鏂囦歡涓? stabs,COFF,XCOFF,DWARF)
-ggdb 涓?GDB 浜х敓璋冭瘯淇℃伅,鍖呭惈 GDB 鐨勬墿灞?
-ggdb(level) 璁懼畾浜х敓浣曠絳夌駭鐨勮皟璇曚俊鎭? level 涓?1-3, 1 鏈灝?3 鏈澶?
-ftime-reprot 緇熻緙栬瘧娑堣楃殑鏃墮棿騫舵樉紺烘姤鍛?
-fmem-report 鏄劇ず鎵鏈夌殑闈欐佸唴瀛樺垎閰?
-ftest-coverages 涓?gcov宸ュ叿浜х敓鏁版嵁鏂囦歡.
gcc 緙栬瘧閫夐」,緲昏瘧鍑烘潵鐢ㄨ搗鏉ユ柟渚?
VC緙栬瘧閫夐」錛堣漿杞斤級- -
Tag錛?緙栫▼聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
/***********************************************************************************************/
VC緙栬瘧閫夐」 csdnb3a [鍘熶綔]
鍏抽敭瀛?VC緙栬瘧閫夐」 鍑哄
-浼樺寲-
/O1 鏈灝忓寲絀洪棿 minimize space
/Op[-] 鏀瑰杽嫻偣鏁頒竴鑷存?improve floating-pt consistency
/O2 鏈澶у寲閫熷害 maximize speed
/Os 浼橀変唬鐮佺┖闂?favor code space
/Oa 鍋囪娌℃湁鍒悕 assume no aliasing
/Ot 浼橀変唬鐮侀熷害 favor code speed
/Ob 鍐呰仈灞曞紑錛堥粯璁?n=0錛?inline expansion (default n=0)
/Ow 鍋囪浜ゅ弶鍑芥暟鍒悕 assume cross-function aliasing
/Od 紱佺敤浼樺寲錛堥粯璁ゅ鹼級 disable optimizations (default)
/Ox 鏈澶у寲閫夐」銆?/Ogityb2 /Gs) maximum opts. (/Ogityb1 /Gs)
/Og 鍚敤鍏ㄥ眬浼樺寲 enable global optimization
/Oy[-] 鍚敤妗嗘灦鎸囬拡鐪佺暐 enable frame pointer omission
/Oi 鍚敤鍐呭緩鍑芥暟 enable intrinsic functions
-浠g爜鐢熸垚-
/G3 涓?80386 榪涜浼樺寲 optimize for 80386
/G4 涓?80486 榪涜浼樺寲 optimize for 80486
/GR[-] 鍚敤 C++ RTTI enable C++ RTTI
/G5 涓?Pentium 榪涜浼樺寲 optimize for Pentium
/G6 涓?Pentium Pro 榪涜浼樺寲 optimize for Pentium Pro
/GX[-] 鍚敤 C++ 寮傚父澶勭悊錛堜笌 /EHsc 鐩稿悓錛?enable C++ EH (same as /EHsc)
/EHs 鍚敤鍚屾 C++ 寮傚父澶勭悊 enable synchronous C++ EH
/GD 涓?Windows DLL 榪涜浼樺寲 optimize for Windows DLL
/GB 涓烘販鍚堟ā鍨嬭繘琛屼紭鍖栵紙榛樿錛?optimize for blended model (default)
/EHa 鍚敤寮傛 C++ 寮傚父澶勭悊 enable asynchronous C++ EH
/Gd __cdecl 璋冪敤綰﹀畾 __cdecl calling convention
/EHc extern鈥淐鈥濋粯璁や負 nothrow extern "C" defaults to nothrow
/Gr __fastcall 璋冪敤綰﹀畾 __fastcall calling convention
/Gi[-] 鍚敤澧為噺緙栬瘧 enable incremental compilation
/Gz __stdcall 璋冪敤綰﹀畾 __stdcall calling convention
/Gm[-] 鍚敤鏈灝忛噸鏂扮敓鎴?enable minimal rebuild
/GA 涓?Windows 搴旂敤紼嬪簭榪涜浼樺寲 optimize for Windows Application
/Gf 鍚敤瀛楃涓叉睜 enable string pooling
/QIfdiv[-] 鍚敤 Pentium FDIV 淇 enable Pentium FDIV fix
/GF 鍚敤鍙瀛楃涓叉睜 enable read-only string pooling
/QI0f[-] 鍚敤 Pentium 0x0f 淇 enable Pentium 0x0f fix
/Gy 鍒嗛殧閾炬帴鍣ㄥ嚱鏁?separate functions for linker
/GZ 鍚敤榪愯鏃惰皟璇曟鏌?enable runtime debug checks
/Gh 鍚敤閽╁瓙鍑芥暟璋冪敤 enable hook function call
/Ge 瀵規墍鏈夊嚱鏁板己鍒跺爢鏍堟鏌?force stack checking for all funcs
/Gs[num] 紱佺敤鍫嗘爤媯鏌ヨ皟鐢?disable stack checking calls
-杈撳嚭鏂囦歡-
/Fa[file] 鍛藉悕紼嬪簭闆嗗垪琛ㄦ枃浠?name assembly listing file
/Fo 鍛藉悕瀵硅薄鏂囦歡 name object file
/FA[sc] 閰嶇疆紼嬪簭闆嗗垪琛?configure assembly listing
/Fp 鍛藉悕棰勭紪璇戝ご鏂囦歡 name precompiled header file
/Fd[file] 鍛藉悕 .PDB 鏂囦歡 name .PDB file
/Fr[file] 鍛藉悕婧愭祻瑙堝櫒鏂囦歡 name source browser file
/Fe 鍛藉悕鍙墽琛屾枃浠?name executable file
/FR[file] 鍛藉悕鎵╁睍 .SBR 鏂囦歡 name extended .SBR file
/Fm[file] 鍛藉悕鏄犲皠鏂囦歡 name map file
-棰勫鐞嗗櫒-
/FI 鍛藉悕寮哄埗鍖呭惈鏂囦歡 name forced include file
/C 涓嶅惛鍙栨敞閲?don't strip comments
/U 縐婚櫎棰勫畾涔夊畯 remove predefined macro
/D{=|#} 瀹氫箟瀹?define macro
/u 縐婚櫎鎵鏈夐瀹氫箟瀹?remove all predefined macros
/E 灝嗛澶勭悊瀹氬悜鍒版爣鍑嗚緭鍑?preprocess to stdout
/I 娣誨姞鍒板寘鍚枃浠剁殑鎼滅儲璺緞 add to include search path
/EP 灝嗛澶勭悊瀹氬悜鍒版爣鍑嗚緭鍑猴紝涓嶈甯﹁鍙?preprocess to stdout, no #line
/X 蹇界暐鈥滄爣鍑嗕綅緗?ignore "standard places"
/P 棰勫鐞嗗埌鏂囦歡 preprocess to file
-璇█-
/Zi 鍚敤璋冭瘯淇℃伅 enable debugging information
/Zl 蹇界暐 .OBJ 涓殑榛樿搴撳悕 omit default library name in .OBJ
/ZI 鍚敤璋冭瘯淇℃伅鐨勨滅紪杈戝茍緇х畫鈥濆姛鑳?enable Edit and Continue debug info
/Zg 鐢熸垚鍑芥暟鍘熷瀷 generate function prototypes
/Z7 鍚敤鏃у紡璋冭瘯淇℃伅 enable old-style debug info
/Zs 鍙繘琛岃娉曟鏌?syntax check only
/Zd 浠呰琛屽彿璋冭瘯淇℃伅 line number debugging info only
/vd{0|1} 紱佺敤/鍚敤 vtordisp disable/enable vtordisp
/Zp[n] 鍦?n 瀛楄妭杈圭晫涓婂寘瑁呯粨鏋?pack structs on n-byte boundary
/vm 鎸囧悜鎴愬憳鐨勬寚閽堢被鍨?type of pointers to members
/Za 紱佺敤鎵╁睍錛堟殫鎸?/Op錛?disable extensions (implies /Op)
/noBool 紱佺敤鈥渂ool鈥濆叧閿瓧 disable "bool" keyword
/Ze 鍚敤鎵╁睍錛堥粯璁わ級 enable extensions (default)
- 鏉傞」 -
/?, /help 鎵撳嵃姝ゅ府鍔╂秷鎭?print this help message
/c 鍙紪璇戯紝涓嶉摼鎺?compile only, no link
/W 璁劇疆璀﹀憡絳夌駭錛堥粯璁?n=1錛?set warning level (default n=1)
/H 鏈澶у寲澶栭儴鍚嶇О闀垮害 max external name length
/J 榛樿 char 綾誨瀷鏄?unsigned default char type is unsigned
/nologo 鍙栨秷鏄劇ず鐗堟潈娑堟伅 suppress copyright message
/WX 灝嗚鍛婅涓洪敊璇?treat warnings as errors
/Tc 灝嗘枃浠剁紪璇戜負 .c compile file as .c
/Yc[file] 鍒涘緩 .PCH 鏂囦歡 create .PCH file
/Tp 灝嗘枃浠剁紪璇戜負 .cpp compile file as .cpp
/Yd 灝嗚皟璇曚俊鎭斁鍦ㄦ瘡涓?.OBJ 涓?put debug info in every .OBJ
/TC 灝嗘墍鏈夋枃浠剁紪璇戜負 .c compile all files as .c
/TP 灝嗘墍鏈夋枃浠剁紪璇戜負 .cpp compile all files as .cpp
/Yu[file] 浣跨敤 .PCH 鏂囦歡 use .PCH file
/V 璁劇疆鐗堟湰瀛楃涓?set version string
/YX[file] 鑷姩鐨?.PCH 鏂囦歡 automatic .PCH
/w 紱佺敤鎵鏈夎鍛?disable all warnings
/Zm 鏈澶у唴瀛樺垎閰嶏紙榛樿涓?%錛?max memory alloc (% of default)
-閾炬帴-
/MD 涓?MSVCRT.LIB 閾炬帴 link with MSVCRT.LIB
/MDd 涓?MSVCRTD.LIB 璋冭瘯搴撻摼鎺?link with MSVCRTD.LIB debug lib
/ML 涓?LIBC.LIB 閾炬帴 link with LIBC.LIB
/MLd 涓?LIBCD.LIB 璋冭瘯搴撻摼鎺?link with LIBCD.LIB debug lib
/MT 涓?LIBCMT.LIB 閾炬帴 link with LIBCMT.LIB
/MTd 涓?LIBCMTD.LIB 璋冭瘯搴撻摼鎺?link with LIBCMTD.LIB debug lib
/LD 鍒涘緩 .DLL Create .DLL
/F 璁劇疆鍫嗘爤澶у皬 set stack size
/LDd 鍒涘緩 .DLL 璋冭瘯搴?Create .DLL debug libary
/link [閾炬帴鍣ㄩ夐」鍜屽簱] [linker options and libraries]
qmake鏄敤鏉ヤ負涓嶅悓鐨勫鉤鍙扮殑寮鍙戦」鐩垱寤簃akefile鐨凾rolltech寮鍙戜竴涓槗浜庝嬌鐢ㄧ殑宸ュ叿銆?em>qmake綆鍖栦簡makefile鐨勭敓鎴愶紝鎵浠ヤ負浜嗗垱寤轟竴涓猰akefile鍙渶瑕佷竴涓彧鏈夊嚑琛屼俊鎭殑鏂囦歡銆?em>qmake鍙互渚涗換浣曚竴涓蔣浠墮」鐩嬌鐢紝鑰屼笉鐢ㄧ瀹冩槸涓嶆槸鐢≦t鍐欑殑錛屽敖綆″畠鍖呭惈浜嗕負鏀寔Qt寮鍙戞墍鎷ユ湁鐨勯澶栫殑鐗瑰緛銆?/p>
qmake鍩轟簬涓涓」鐩枃浠惰繖鏍風殑淇℃伅鏉ョ敓鎴恗akefile銆傞」鐩枃浠跺彲浠ョ敱寮鍙戣呯敓鎴愩傞」鐩枃浠墮氬父寰堢畝鍗曪紝浣嗘槸濡傛灉闇瑕佸畠鏄潪甯稿畬鍠勭殑銆備笉鐢ㄤ慨鏀歸」鐩枃浠訛紝qmake涔熷彲浠ヤ負涓篗icrosoft Visual Studio鐢熸垚欏圭洰銆?/p>
涓句緥鏉ヨ錛屽鏋滀綘鍦╓indows涓嬩嬌鐢∕icrosoft Visual Studio錛岀劧鍚庝綘闇瑕佹妸QMAKESPEC鐜鍙橀噺璁劇疆涓?em>win32-msvc銆傚鏋滀綘鍦⊿olaris涓婁嬌鐢╣cc錛屼綘闇瑕佹妸QMAKESPEC鐜鍙橀噺璁劇疆涓?em>solaris-g++銆?/p>
鍦╭t/mkspecs涓殑姣忎竴涓洰褰曢噷闈紝閮芥湁涓涓寘鍚簡騫沖彴鍜岀紪璇戝櫒鐗瑰畾淇℃伅鐨?em>qmake.conf鏂囦歡銆傝繖浜涜緗傜敤浜庝綘瑕佷嬌鐢?em>qmake鐨勪換浣曢」鐩紝璇蜂笉瑕佷慨鏀瑰畠錛岄櫎闈炰綘鏄竴涓笓瀹躲備緥濡傦紝鍋囧浣犳墍鏈夌殑搴旂敤紼嬪簭閮藉繀欏誨拰涓涓壒瀹氱殑搴撹繛鎺ワ紝浣犲彲浠ユ妸榪欎釜淇℃伅娣誨姞鍒扮浉搴旂殑qmake.conf鏂囦歡涓?/p>
涓涓」鐩枃浠舵槸鐢ㄦ潵鍛婅瘔qmake鍏充簬涓鴻繖涓簲鐢ㄧ▼搴忓垱寤簃akefile鎵闇瑕佺殑緇嗚妭銆備緥濡傦紝涓涓簮鏂囦歡鍜屽ご鏂囦歡鐨勫垪琛ㄣ佷換浣曞簲鐢ㄧ▼搴忕壒瀹氶厤緗佷緥濡備竴涓繀闇瑕佽繛鎺ョ殑棰濆搴撱佹垨鑰呬竴涓澶栫殑鍖呭惈璺緞錛岄兘搴旇鏀懼埌欏圭洰鏂囦歡涓?/p>
浣犲彲浠ヤ負欏圭洰鏂囦歡娣誨姞娉ㄩ噴銆傛敞閲婄敱鈥?鈥濈鍙峰紑濮嬶紝涓鐩村埌榪欎竴琛岀殑緇撴潫銆?/p>
妯℃澘鍙橀噺鍛婅瘔qmake涓鴻繖涓簲鐢ㄧ▼搴忕敓鎴愬摢縐峬akefile銆備笅闈㈡槸鍙緵浣跨敤鐨勯夋嫨錛?/p>
app - 寤虹珛涓涓簲鐢ㄧ▼搴忕殑makefile銆傝繖鏄粯璁ゅ鹼紝鎵浠ュ鏋滄ā鏉挎病鏈夎鎸囧畾錛岃繖涓皢琚嬌鐢ㄣ?/p>
lib - 寤虹珛涓涓簱鐨刴akefile銆?/p>
vcapp - 寤虹珛涓涓簲鐢ㄧ▼搴忕殑Visual Studio欏圭洰鏂囦歡銆?/p>
vclib - 寤虹珛涓涓簱鐨刅isual Studio欏圭洰鏂囦歡銆?/p>
subdirs - 榪欐槸涓涓壒孌婄殑妯℃澘錛屽畠鍙互鍒涘緩涓涓兘澶熻繘鍏ョ壒瀹氱洰褰曞茍涓斾負涓涓」鐩枃浠剁敓鎴恗akefile騫朵笖涓哄畠璋冪敤make鐨刴akefile銆?/p>
鈥渁pp鈥濇ā鏉垮憡璇?em>qmake涓哄緩绔嬩竴涓簲鐢ㄧ▼搴忕敓鎴愪竴涓猰akefile銆傚綋浣跨敤榪欎釜妯℃澘鏃訛紝涓嬮潰榪欎簺qmake緋葷粺鍙橀噺鏄鎵胯鐨勩備綘搴旇鍦ㄤ綘鐨?pro鏂囦歡涓嬌鐢ㄥ畠浠潵涓轟綘鐨勫簲鐢ㄧ▼搴忔寚瀹氱壒瀹氫俊鎭?/p>
HEADERS - 搴旂敤紼嬪簭涓殑鎵鏈夊ご鏂囦歡鐨勫垪琛ㄣ?/p>
SOURCES - 搴旂敤紼嬪簭涓殑鎵鏈夋簮鏂囦歡鐨勫垪琛ㄣ?/p>
FORMS - 搴旂敤紼嬪簭涓殑鎵鏈?ui鏂囦歡錛堢敱Qt璁捐鍣?/em>鐢熸垚錛夌殑鍒楄〃銆?/p>
LEXSOURCES - 搴旂敤紼嬪簭涓殑鎵鏈塴ex婧愭枃浠剁殑鍒楄〃銆?/p>
YACCSOURCES - 搴旂敤紼嬪簭涓殑鎵鏈墆acc婧愭枃浠剁殑鍒楄〃銆?/p>
TARGET - 鍙墽琛屽簲鐢ㄧ▼搴忕殑鍚嶇О銆傞粯璁ゅ間負欏圭洰鏂囦歡鐨勫悕縐般傦紙濡傛灉闇瑕佹墿灞曞悕錛屼細琚嚜鍔ㄥ姞涓娿傦級
DESTDIR - 鏀劇疆鍙墽琛岀▼搴忕洰鏍囩殑鐩綍銆?/p>
DEFINES - 搴旂敤紼嬪簭鎵闇鐨勯澶栫殑棰勫鐞嗙▼搴忓畾涔夌殑鍒楄〃銆?/p>
INCLUDEPATH - 搴旂敤紼嬪簭鎵闇鐨勯澶栫殑鍖呭惈璺緞鐨勫垪琛ㄣ?/p>
DEPENDPATH - 搴旂敤紼嬪簭鎵渚濊禆鐨勬悳绱㈣礬寰勩?/p>
VPATH - 瀵繪壘琛ュ厖鏂囦歡鐨勬悳绱㈣礬寰勩?/p>
DEF_FILE - 鍙湁Windows闇瑕侊細搴旂敤紼嬪簭鎵瑕佽繛鎺ョ殑.def鏂囦歡銆?/p>
RC_FILE - 鍙湁Windows闇瑕侊細搴旂敤紼嬪簭鐨勮祫婧愭枃浠躲?/p>
RES_FILE - 鍙湁Windows闇瑕侊細搴旂敤紼嬪簭鎵瑕佽繛鎺ョ殑璧勬簮鏂囦歡銆?/p>
浣犲彧闇瑕佷嬌鐢ㄩ偅浜涗綘宸茬粡鏈夊肩殑緋葷粺鍙橀噺錛屼緥濡傦紝濡傛灉浣犱笉闇瑕佷換浣曢澶栫殑INCLUDEPATH錛岄偅涔堜綘灝變笉闇瑕佹寚瀹氬畠錛?em>qmake浼氫負鎵闇鐨勬彁渚涢粯璁ゅ箋備緥濡傦紝涓涓疄渚嬮」鐩枃浠朵篃璁稿氨鍍忚繖鏍鳳細
TEMPLATE = app
DESTDIR = c:\helloapp
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
DEFINES += QT_DLL
CONFIG += qt warn_on release
濡傛灉鏉$洰鏄崟鍊肩殑錛屾瘮濡倀emplate鎴栬呯洰鐨勭洰褰曪紝鎴戜滑鏄敤鈥?鈥濓紝浣嗗鏋滄槸澶氬兼潯鐩紝鎴戜滑浣跨敤鈥?=鈥濇潵涓鴻繖涓被鍨?em>娣誨姞鐜版湁鐨勬潯鐩備嬌鐢ㄢ?鈥濅細鐢ㄦ柊鍊兼浛鎹㈠師鏈夌殑鍊鹼紝渚嬪錛屽鏋滄垜浠啓浜?tt>DEFINES=QT_DLL錛屽叾瀹冩墍鏈夌殑瀹氫箟閮藉皢琚垹闄ゃ?/p>
鈥渓ib鈥濇ā鏉垮憡璇?em>qmake涓哄緩绔嬩竴涓簱鑰岀敓鎴恗akefile銆傚綋浣跨敤榪欎釜妯℃澘鏃訛紝闄や簡鈥渁pp鈥濇ā鏉夸腑鎻愬埌緋葷粺鍙橀噺錛岃繕鏈変竴涓?em>VERSION鏄鏀寔鐨勩備綘闇瑕佸湪涓哄簱鎸囧畾鐗瑰畾淇℃伅鐨?pro鏂囦歡涓嬌鐢ㄥ畠浠?/p>
VERSION - 鐩爣搴撶殑鐗堟湰鍙鳳紝姣斿錛?.3.1銆?/p>
鈥渟ubdirs鈥濇ā鏉垮憡璇塹make鐢熸垚涓涓猰akefile錛屽畠鍙互榪涘叆鍒扮壒瀹氬瓙鐩綍騫朵負榪欎釜鐩綍涓殑欏圭洰鏂囦歡鐢熸垚makefile騫朵笖涓哄畠璋冪敤make銆?/p>
鍦ㄨ繖涓ā鏉夸腑鍙湁涓涓郴緇熷彉閲?em>SUBDIRS鍙互琚瘑鍒傝繖涓彉閲忎腑鍖呭惈浜嗘墍瑕佸鐞嗙殑鍚湁欏圭洰鏂囦歡鐨勫瓙鐩綍鐨勫垪琛ㄣ傝繖涓」鐩枃浠剁殑鍚嶇О鏄拰瀛愮洰褰曞悓鍚嶇殑錛岃繖鏍?em>qmake灝卞彲浠ュ彂鐜板畠銆備緥濡傦紝濡傛灉瀛愮洰閲屾槸鈥渕yapp鈥濓紝閭d箞鍦ㄨ繖涓洰褰曚腑鐨勯」鐩枃浠跺簲璇ヨ鍙仛myapp.pro銆?/p>
閰嶇疆鍙橀噺鎸囧畾浜嗙紪璇戝櫒鎵瑕佷嬌鐢ㄧ殑閫夐」鍜屾墍闇瑕佽榪炴帴鐨勫簱銆傞厤緗彉閲忎腑鍙互娣誨姞浠諱綍涓滆タ錛屼絾鍙湁涓嬮潰榪欎簺閫夐」鍙互琚玵make璇嗗埆銆?/p>
涓嬮潰榪欎簺閫夐」鎺у埗鐫浣跨敤鍝簺緙栬瘧鍣ㄦ爣蹇楋細
release - 搴旂敤紼嬪簭灝嗕互release妯″紡榪炵紪銆傚鏋溾渄ebug鈥濊鎸囧畾錛屽畠灝嗚蹇界暐銆?/p>
debug - 搴旂敤紼嬪簭灝嗕互debug妯″紡榪炵紪銆?/p>
warn_on - 緙栬瘧鍣ㄤ細杈撳嚭灝藉彲鑳藉鐨勮鍛婁俊鎭傚鏋溾渨arn_off鈥濊鎸囧畾錛屽畠灝嗚蹇界暐銆?/p>
warn_off - 緙栬瘧鍣ㄤ細杈撳嚭灝藉彲鑳藉皯鐨勮鍛婁俊鎭?/p>
涓嬮潰榪欎簺閫夐」瀹氫箟浜嗘墍瑕佽繛緙栫殑搴?搴旂敤紼嬪簭鐨勭被鍨嬶細
qt - 搴旂敤紼嬪簭鏄竴涓猀t搴旂敤紼嬪簭錛屽茍涓擰t搴撳皢浼氳榪炴帴銆?/p>
thread - 搴旂敤紼嬪簭鏄竴涓綰跨▼搴旂敤紼嬪簭銆?/p>
x11 - 搴旂敤紼嬪簭鏄竴涓猉11搴旂敤紼嬪簭鎴栧簱銆?/p>
windows - 鍙敤浜庘渁pp鈥濇ā鏉匡細搴旂敤紼嬪簭鏄竴涓猈indows涓嬬殑紿楀彛搴旂敤紼嬪簭銆?/p>
console - 鍙敤浜庘渁pp鈥濇ā鏉匡細搴旂敤紼嬪簭鏄竴涓猈indows涓嬬殑鎺у埗鍙板簲鐢ㄧ▼搴忋?/p>
dll - 鍙敤浜庘渓ib鈥濇ā鏉匡細搴撴槸涓涓叡浜簱錛坉ll錛夈?/p>
staticlib - 鍙敤浜庘渓ib鈥濇ā鏉匡細搴撴槸涓涓潤鎬佸簱銆?/p>
plugin - 鍙敤浜庘渓ib鈥濇ā鏉匡細搴撴槸涓涓彃浠訛紝榪欏皢浼氫嬌dll閫夐」鐢熸晥銆?/p>
渚嬪錛屽鏋滀綘鐨勫簲鐢ㄧ▼搴忎嬌鐢≦t搴擄紝騫朵笖浣犳兂鎶婂畠榪炵紪涓轟竴涓彲璋冭瘯鐨勫綰跨▼鐨勫簲鐢ㄧ▼搴忥紝浣犵殑欏圭洰鏂囦歡搴旇浼氭湁涓嬮潰榪欒錛?/p>
CONFIG += qt thread debug
娉ㄦ剰錛屼綘蹇呴』浣跨敤鈥?=鈥濓紝涓嶈浣跨敤鈥?鈥濓紝鍚﹀垯qmake灝變笉鑳芥紜嬌鐢ㄨ繛緙朡t鐨勮緗簡錛屾瘮濡傛病娉曡幏寰楁墍緙栬瘧鐨凲t搴撶殑綾誨瀷浜嗐?/p>
1,鐢≦t designer鍒涘緩 BaseClass.ui 鏂囦歡 鍜?BaseClass.ui.h 錛堝鏈夊繀瑕侊級銆?/p>
2,鐢?ui鏂囦歡鐢熸垚鐩稿簲鐨?.h 鍜?.cpp 鏂囦歡錛?br />uic -o BaseClass.h BaseClass.ui
uic -o BaseClass.cpp -i(-impl) BaseClass.h BaseClass.ui
3,鐢熸垚瀛愮被鐨?.h 鍜?.cpp 鏂囦歡錛堝鏈夊繀瑕侊級錛?br />uic -o SubClass.h -subdecl SubClassBaseClassBaseClass.ui
uic -o SubClass.cpp -subimpl SubclassSubClass.h BaseClass.ui
4,鐢熸垚moc鏂囦歡錛?br />moc -o moc_BaseClass.cpp BaseClass.h
moc -o moc_SubClass.cpp SubClass.h
5,鐢熸垚欏圭洰鏂囦歡.pro錛?br />qmake -o Project.pro -project
濡備笉鎸囧畾鏂囦歡鍚嶏紝鍒欐枃浠跺悕榛樿涓哄綋鍓嶇洰褰曠殑鍚嶅瓧銆?/p>
6,鐢熸垚Makefile
qmake
7,緙栬瘧閾炬帴錛歮ake
娉細Linux Redhat 9.0, Qt3.3銆傜豢鑹插彲鏍規嵁瀹為檯欏圭洰鑷鏇存敼銆?/p>
鍙傝錛?br />Integrating Qt Designer Files Into Your Project
http://docsrv.caldera.com:8457/en/QtTutorial/chap5_4.html聽
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=933964
鍏抽敭璇嶏細QtE ARM9 GUI SBC-2410X
寮曡█
榪?
騫存潵錛岀敱浜嶢RM(Advanced RISC
Machines)鍦ㄦц兘銆佸姛鑰椼佹垚鏈拰浣撶Н涓婄殑浼樺娍錛屼嬌寰楀畠鍦ㄥ祵鍏ュ紡緋葷粺涓殑鍙戝睍濡傛棩涓ぉ錛屽畠鍦ㄥ伐涓氭帶鍒躲佽埅絀鴻埅澶┿佸啗浜嬮鍩熴佹秷璐圭數瀛愩佹櫤鑳藉鐢靛拰瑙?
棰戠洃鎺х瓑鏂歸潰閮藉彂鎸ヤ簡閲嶅ぇ鐨勪綔鐢ㄣ傚緢澶氫漢閮借揩鍒囧湴鎯沖涔燗RM錛屼互絎旇呯殑緇忛獙錛屼粠鏈鍩烘湰鐨凩ED鎺у埗瀛﹁搗錛屾槸涓涓笉閿欑殑閫夋嫨銆?/p>
濡?
鏋滀笉鐔熸倝Linux錛屽彲鑳藉QtE鐨勬蹇電煡涔嬬敋灝戯紝瀹冩槸鎸▉Trolltech鍏徃涓哄悇縐嶇郴緇熻璁$殑鍥懼艦鐢ㄦ埛鐣岄潰宸ュ叿鍖咃紝閲囩敤c++璇█緙栫▼銆俀tE鐨勪紭
鐐規湁錛氳法騫沖彴錛屽彲浠ユ柟渚跨殑榪炴帴鏁版嵁搴擄紝鍙互灝嗙▼搴忎笌Java闆嗘垚絳夈傚叾瀹烇紝QtE鍦ㄤ竴浜涢珮绔殑縐誨姩鎵嬫寔璁懼涓棭宸叉繁鍏ヤ漢蹇冿紝Troll鈥攖ech鍏徃鍦?
QtE鐨勫熀紜涓婂紑鍙戜簡涓涓簲鐢ㄧ幆澧僎topia錛岀洰鍓嶅凡鏈夊緢澶氬叕鍙擱噰鐢≦topia鏉ュ紑鍙戜粬浠殑涓繪祦PDA銆傚綋鐒訛紝Qt涔熸湁瀹冪殑緙虹偣錛屾棦涓嶈兘鎻愪緵IDE
(闆嗘垚寮鍙戠幆澧?錛屼絾榪欎釜緙虹偣鍦ㄥ己澶х殑Linux涓嬫樉寰楀井涓嶈凍閬撱備嬌鐢╣cc錛廹++錛屽姞涓奞t鐨勫紑鍙戝伐鍏鳳細Qt
Designer錛宼make錛弎make錛孶IC絳夛紝寮鍙戝彲瑙嗗寲紼嬪簭灝嗗彉寰楀崄鍒嗗鏄撱?/p>
瑕佸涔燗RM錛岄夋嫨涓嬈懼ソ鐨勫紑鍙戞澘鏄繀涓?
鍙皯鐨勩係BC涓2410X鏄箍宸炲弸鍠勪箣鑷傚叕鍙歌璁$殑涓嬈懼熀浜嶢RM9鐨勫紑鍙戞澘錛屾搷浣滅郴緇熸槸闊╁浗鐨刴izi-linux銆係BC-2410X涓嶅悓浜?
uClinux錛屽畠鐨勬帴鍙d赴瀵岋紝涓旀敮鎸丮MU銆丵tE2錛?錛?錛屽悓鏃舵彁渚涗簡鎺у埗LED鐨勫懡浠よ鏂瑰紡銆?/p>
1 緋葷粺闇姹?/p>
鈼囧畬鍏ㄥ畨瑁匯edHat9錛?銆?br />鈼囧湪Linux涓嬪緩绔婹tE緙栬瘧鐜銆?br />鈼囧紑鍙戞澘涓婂凡緇忓姞杞絃ED璁懼椹卞姩紼嬪簭銆?/p>
娉ㄦ剰錛氫綘鎵寤虹珛鐨凲tE鐗堟湰蹇呴』涓庡紑鍙戞澘鎵鏀寔鐨勭増鏈竴鑷淬?/p>
2 紼嬪簭璁捐
鍦↙inux
涓嬶紝鐢ㄧ郴緇熻嚜甯︾殑Qt Designer鏉ョ紪鍐欑▼搴忋俀t
Designer鏄竴涓紭縐鐨勫彲瑙嗗寲寮鍙戝伐鍏鳳紝鐢ㄥ畠鏉ヨ璁″崄鍒嗗鏄撱傚畠鐨勭晫闈㈢被浼間簬Delphi錛屼絾浣跨敤C++璇█緙栧啓搴旂敤紼嬪簭銆俀t紼嬪簭璁捐閲岀殑涓涓寒
鐐瑰氨鏄疭ignaI-_Slot鏈哄埗錛屽畠鏈夌偣綾諱技浜嶸C++閲岀殑娑堟伅鏈哄埗銆傚綋涓涓粍浠跺彂鍑篠ignal鏃訛紝鍏朵粬涓涓粍浠舵垨澶氫釜緇勪歡鍙互閫氳繃Slot鎺ユ敹鍙?
鏉ョ殑SignaI錛岀粍浠舵湰韜篃鍙互鎺ユ敹鑷繁鐨凷ignal錛岃繖鏍峰鐞嗕竴涓簨浠跺皢鍙樺緱闈炲父瀹規槗銆俀t
Designer鐨勪紭鐐逛笉浠呭湪浜庡畠鍙互鍗佸垎鏂逛究鐨勮璁″浘褰㈢敤鎴風晫闈紝榪樿〃鐜板湪鍙互鐢ㄨ繛鎺ュ伐鍏峰緢瀹規槗鐨勬妸Signals鍜孲lots榪炴帴璧鋒潵銆傜敤鎴瘋嚜宸辮璁?
鐨勭▼搴忔坊鍔犲湪**錛巙i錛巋涓?/p>
鎵撳紑Qt Deslgner錛岄夋嫨File錛弉ew
C++Project錛屽懡鍚嶄負led錛巔ro騫朵繚瀛樸傛帴鐫閫夋嫨File錛弉ew-Dialog錛屽茍鍦ㄦ璁捐鑷繁鐨勭敤鎴風晫闈€傛渶鍚庨夋嫨File錛弉ew
C++Main鈥擣ile錛岀郴緇熻嚜鍔ㄧ敓鎴愪竴涓猰ain錛巆pp鏂囦歡銆傚浘褰㈢敤鎴風晫闈㈠鍥?鎵紺猴紝Initlalize鎸夐挳涓昏瀹屾垚LED璁懼鐨勬墦寮錛屽畾鏃跺櫒
鐨勫叧闂拰鍏朵粬涓浜涘垵濮嬪寲宸ヤ綔錛汢egim鎸夐挳鍒欓拡瀵筁ED Display
Mode鐨勫紑濮嬶紱Exit鎸夐挳涓洪鍑哄簲鐢ㄧ▼搴忋傚乏闈㈢殑緇勫悎妗嗗寘鎷?涓猂adioButton錛屽搴?涓狶ED鐨勪寒鎴栫伃錛涘彸闈㈢殑緇勫悎妗嗗寘鎷?涓?
RadioButton(瀵瑰簲涓嶅悓鐨勯棯鐑佹ā寮忓拰闂儊蹇參)鍜?涓狶CDNumber(鐢ㄦ潵鏄劇ず闂儊鐨勬椂闂撮棿闅?銆傛湰紼嬪簭寤虹珛鐨凷ignal鈥擲1ot榪炴帴
鏈夎澶氾紝涓嬮潰瀵瑰嚑涓噸瑕佺殑榪炴帴鍜屽嚱鏁拌繘琛岃鏄庛?/p>

(1)connect(initPushButton錛嶴IGNAL(clicked())錛宼his錛嶴LOT(initial()))
褰揑nitialize
鎸夐挳鎸変笅鏃訛紝LedForm瀵硅瘽妗嗘帴鏀舵淇″彿錛屽茍鎵цinitial()鍑芥暟銆侺inux鎿嶄綔緋葷粺鎶婃墍鏈夌殑璁懼閮界湅鎴愭枃浠訛紝鍥犳瀵硅澶囩殑鎿嶄綔鎺у埗鍙互閫氳繃
open()銆乮octl()絳夊嚱鏁板疄鐜般傚湪initial()鍑芥暟涓氨鏄皟鐢ㄤ簡open()鍑芥暟鏉ユ墦寮LED璁懼鐨勩?/p>
(2)connect(okPushButton錛孲IGNAL(clicked())錛宼his錛孲LOT(modeSel()))
褰揃egin
鎸夐挳鎸変笅鏃訛紝LedForm瀵硅瘽妗嗘帴鏀舵淇″彿錛屽茍鎵цmodeSel()鍑芥暟銆傚湪modeSel()鍑芥暟涓紑鍚畾鏃跺櫒錛屽茍鍒涘緩鍙﹀涓涓繛鎺ョ敤鏉ュ驚鐜樉紺?
LED銆傚湪鍛戒護琛屾柟寮忎腑錛孡ED鐨勫驚鐜樉紺鴻鐢ㄥ埌姝誨驚鐜紝騫剁敤閿洏涓柇鏉ユ帶鍒跺驚鐜紱鑰屽湪Qt鎴栧叾浠栧彲瑙嗗寲璇█涓紝鍒欒鐢ㄥ埌瀹氭椂鍣ㄦ潵鎺у埗寰幆銆?/p>
(3)鍑芥暟open()
鍦ㄤ腑澹版槑錛屽惈涔変負鎵撳紑璁懼鏂囦歡銆傛墦寮鎴愬姛榪斿洖0錛涘け璐ヨ繑鍥炰竴1銆?/p>
(4)鍑芥暟ioctl()
鍦ㄤ腑澹版槑錛屾帶鍒禝錛廜绔彛銆備緥濡傦細
Int fd=open(鈥濓紡dev錛弆eds鈥濓紝0)錛?br />ioctl(fd錛?錛?)錛?錛忥紡璁㎜ED4鐏?/p>
(5)鍑芥暟select()
鍦ㄤ腑澹版槑錛屽惈涔変負緇忚繃澶氶暱鏃墮棿璁塊棶涓嬈¤澶囥?/p>
3 紼嬪簭縐繪涓庤繍琛?/p>
瑕佹兂浣跨▼搴忚繍琛屽湪寮鍙戞澘鐨凲topia涓紝鍒欏繀欏誨湪寤虹珛鐨凲tE鐜涓嬬紪璇戯紝騫惰緗ソ鐜鍙橀噺銆傜粓绔繘鍏ユ墍寤虹珛鐨凲tE鐩綍鍚庯紝鐜鍙橀噺鎴栬繍琛岀幆澧冨彉閲忓拰鑴氭湰璁劇疆濡備笅錛?/p>
export QTDIR=$PWD錛弎t
export QPEDlR=$PWD錛弎topia
export TMAKEDIR=$PWD錛弔make
export TMAKEPATH=$TMAKEDIR錛弆ib錛弎ws錛弆inux-armg++
export PATH=$QTDIR錛廱in錛?QPEDIR錛廱in錛?TMAKEDIR錛?br />bin錛?PATH
鍊煎緱娉ㄦ剰鐨勪竴鐐規槸錛氱敤Linux鑷甫鐨凲t Designer鍒涘緩鐨勫伐紼嬫枃浠跺彧閫傜敤浜巕make錛岃岀瑪鑰呭緩绔嬬殑QtE鐜鍙兘鐢╰make鏉ョ敓鎴恗akefile錛屽洜姝ら渶瑕佷慨鏀筶ed錛巔ro鏂囦歡錛岃瀹冮傜敤浜巘make錛屼慨鏀瑰涓嬶細
TEMPLATE =app
CoNFIG +=qtopia warn_on release
SoURCES +=main錛巈pp
INTERFACES =led錛巙i
TARGET =led
浠ヤ笂鐨勫伐浣滃仛瀹屽悗錛屽氨鍙互緙栬瘧浜嗐傜紪璇戞垚鍔熷悗鐢熸垚鍙墽琛岀殑浜岃繘鍒舵枃浠秎ed錛岀劧鑰岃浣跨▼搴忚繍琛屽湪寮鍙戞澘涓婄殑qtopia妗岄潰涓婏紝榪橀渶瑕佷竴涓闈㈡枃浠秎ed錛巇esktop鍜岃嚜瀹氫箟鐨勪竴涓浘鏍噇ed錛巔ng銆傛闈㈡枃浠跺涓嬶細
[Desktop Entry]
Comment=a LED Control Program
Exee=led
Icon=led
Type=Application
Name=LED Control
鐒?
鍚庯紝鎶妉ed澶嶅埗鍒癝BC-2410X涓嬶紡opt錛弎topia錛廱in鐩綍涓嬶紝led錛巔ng澶嶅埗鍒幫紡opt錛弎topia錛弍ics鐩綍涓嬶紝led錛?
desktop澶嶅埗鍒幫紡0pt錛弎topia錛廰pps錛廇pplications鐩綍涓嬨傛渶鍚庯紝鐢╡hmod a+X
led鏀瑰彉鏂囦歡led鐨勬潈闄愶紝閲嶆柊鍚姩緋葷粺錛屼究鍙湅鍒發ed錛巔ng鐨勫浘鏍囨樉紺哄湪qtopia妗岄潰涓婏紝鐐瑰嚮姝ゅ浘鏍囧氨鍙繍琛岀▼搴忎簡銆?/p>
4 閮ㄥ垎婧愮▼搴忓強娉ㄩ噴
鐢變簬婧愮▼搴忎唬鐮佹瘮杈冮暱錛岃繖閲屽氨涓嶅叏閮ㄥ垪鍑轟簡錛屼粎緇欏嚭閲嶈閮ㄥ垎鐨勪唬鐮佸強娉ㄩ噴錛屼互渚涜鑰呭弬鑰冦?/p>
(1) 紼嬪簭鐨勫垵濮嬪寲
int fd錛?錛忥紡LED璁懼鏂囦歡鍙ユ焺
int type=1錛?錛忥紡榛樿鏂瑰紡涓鴻鏁板櫒
double period=0錛?錛?錛忥紡榛樿鏃墮棿闂撮殧
QTimer*t=new QTimer(Q鈥硉imer鈥?錛涳紡錛忓垱寤哄畾鏃跺櫒
void LedForm錛氾細initial(){
fd=open(鈥籌紡dev錛弆eds鈥籌紝0)錛?錛忥紡鎵撳紑LED璁懼
錛忥紡鍏朵粬涓浜涘垵濮嬪寲璇彞
涓>stop()錛?錛忥紡鍏抽棴瀹氭椂鍣?br />锝?/p>
(2) LED鏄劇ず鏂瑰紡鐨勮緗?br />void LedForm錛氾細push-leds(void){
static unsigned step錛?br />unsigned led鈥攂itmap錛?br />inti錛?br />switch(type){
case 0錛?錛忥紡鏂瑰紡0錛氳窇椹伅
if(step>=14){step=0錛泒
if(step<7){led_bitmap=1<else{led_bitmap=1<<(14涓step)錛泒
break錛?br />case 1錛?錛忥紡鏂瑰紡1錛氳鏁板櫒
if(step>255){step=0錛?
Ied_bitmap=step!
break錛?br />case 2錛?錛忥紡鏂瑰紡2錛氬仠姝?br />led_bitmap=0錛?br />break;
step鍗佸崄;
for(i=0錛沬<8錛沴++){
ioctl(fd錛宭ed_bitmap錛?錛宨)錛?br />led_bitmap>>=1錛?br />}
}
(3) LED璁懼鐨勮鍙栧強璋冪敤LED鏄劇ず紼嬪簭
void LedForm錛氾細ledDisplay(){
fd_set rds錛?br />struct timeval step錛?br />FD_ZERO(&rds)錛?br />step錛巘v_sec=period錛?br />step錛巘v_usec=(pefiod鈥攕tep錛嶹_sec)*1000000L錛?br />select(fd錛?amp;rds錛孨ULL錛孨ULL錛?amp;step)錛?br />push_leds()錛?br />}
(4)寰幆鏄劇ず鐨勫疄鐜?br />void LedForm錛氾細modeSel(){
t-->start(O)錛涳紡錛忓惎鍔ㄥ畾鏃跺櫒錛屽茍绔嬪嵆鍙戝嚭Signal- timeout()
connect(t錛孲IGNAL(timeout())錛宼his錛嶴LOT(1edDisplay()))錛?br />}
緇?璇?/p>
闅?
鐫閫氫俊琛屼笟鐨勮繀鐚涘彂灞曪紝縐誨姩鎵嬫寔璁懼蹇呭皢鎴愪負浜轟滑宸ヤ綔銆佸涔犲拰鐢熸椿鐨勪富嫻侊紝鐢≦t璁捐縐誨姩鎵嬫寔璁懼鐨凣UI鏈夌潃寰楀ぉ鐙帤鐨勪紭鍔褲傜洰鍓嶏紝Qt搴旂敤浜庡叏涓栫晫涓?
鐧句釜杞歡寮鍙戦」鐩腑銆傚湪鎴戝浗錛孮t鐨勫彂灞曚篃鏈夋槦鏄熶箣鐏彲浠ョ噹鍘熶箣鍔褲傛湰鏂囬氳繃涓涓渶鍩虹鐨勫皬紼嬪簭鍚戣鑰呮紨紺轟簡鎬庢牱浣跨敤Qt寮鍙戝簲鐢ㄧ▼搴忥紝浠ュ強鎬庢牱寤虹珛Qt
涓嶢RM鐨勮仈緋伙紝甯屾湜瀵硅鑰呭涔燗RM鍜孮t璧峰埌涓瀹氱殑甯姪浣滅敤銆?/p>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
聽
pthread_key_t key;
聽
void echomsg(int t)
{
聽printf("destructor excuted in thread %d,param=%d\n",pthread_self(),t);聽聽聽
聽
}
void child()
{
聽int tid;
聽
聽tid = pthread_self();聽
聽聽 printf("thread %d enter\n",tid);
聽sleep(1);
聽聽 pthread_setspecific(key,(void *)tid);
聽聽 printf("thread %d returns %d\n",tid,pthread_getspecific(key));
聽sleep(1);
}
int main(int argc,char** argv)
{
聽 int * status;
聽 int gc;
聽 char command[64]="./clu";
聽 char comarg[64]="";
聽 argv[1]=comarg;
聽 while(1)
聽聽聽 {
聽聽聽聽聽 if((gc=getchar())=='g')
聽{
聽聽 if(fork()==0)
聽聽聽聽 {
聽聽聽聽聽聽 if(execve(command,argv,0)==-1)
聽聽{
聽聽聽 printf("process error is %s\n",strerror(errno));
聽聽}
聽聽聽聽聽聽 printf("process is ok\n");
聽聽聽聽 }
聽}
聽聽聽聽聽 if(gc=='k')
聽{
聽聽 printf("to be continue\n");
聽}
聽聽聽聽聽 if(gc=='e')
聽{
聽聽 return 1;
聽}
聽聽聽 }
聽}
鍔熻兘鏄繖鏍風殑錛屽惎鍔ㄤ互鍚庝細浠庨敭鐩樻帴鍙楀瓧絎︼紝濡傛灉鏄痝灝辮繍琛岄鍏堟寚瀹氬ソ鐨勭▼搴忥紙鍦ㄨ繖閲屾槸涓涓彨clu鐨勭▼搴忥級錛屽鏋滄槸k灝辨墦鍗皌o be continue錛屽鏋滄槸e灝遍鍑?br />涓嬮潰鏄繖涓彨clu鐨勭▼搴忕殑浠g爜
#include <stdio.h>
#include <time.h>
int main()
{
聽 long begin=0;
聽 long end=24000;
聽 long finish=0;
聽 long loop1,loop2;
聽 time_t flag;
聽 time_t nowtime1,nowtime2;
聽 if((flag=time(&nowtime1))==-1)exit(1);
聽 for(loop1=begin;loop1<end;loop1++)
聽聽聽 {
聽聽聽聽聽 for(loop2=begin;loop2<end;loop2++)
聽{
聽聽 if((loop1%2)==0)
聽聽聽聽 {
聽聽聽聽聽聽 if((loop2%2)==0)
聽聽{
聽聽聽 if(finish>65535)
聽聽聽聽聽 finish=0;
聽聽聽 finish+=((loop1/2+loop2/2)%2)%2;
聽聽}
聽聽聽聽 }
聽}
聽聽聽 }
聽 if((flag=time(&nowtime2))==-1)exit(1);
聽 printf("%ld\n",finish);
聽 printf("proccess time %ldsec\n",nowtime2-nowtime1);
}
榪欎釜紼嬪簭鏈韓娌℃湁浠諱綍鎰忎箟錛屽彧鏄函綺圭殑寤惰涓涓嬫椂闂達紝杈撳嚭涓涓嬭繍琛岀殑鏃墮棿錛屼究浜庢祴璇曪紝鍦ㄦ垜鐨凙MD2500+涓婏紝澶ф鏄?縐掞紝浣犲彲浠ヨ瘯璇曞摝^_^
瑕佹祴璇曡繖涓▼搴忥紝鍙互鍦ㄧ▼搴忚繍琛屾椂杈撳叆g錛屼絾鏄繖涓綆椾笉浼氶┈涓婄粨鏉燂紝鍦ㄥ睆騫曡繕娌℃湁杈撳嚭鐨勬椂鍊欏啀杈撳叆k錛屽氨浼氬厛杈撳嚭k鐨勫唴瀹癸紝鍚庡彴clu鐨勭粨鏋滃嚭鏉ュ悗鎵嶈緭鍑哄埌灞忓箷錛屼篃灝辨槸clu鍦ㄥ悗鍙拌繍琛屼簡
鈥︹?br />
/* Type of a signal handler.聽聽 */
typedef void (*__sighandler_t)(int);
鈥︹?br />
#ifdef __KERNEL__
struct old_sigaction {
聽聽聽聽聽聽聽聽聽 __sighandler_t sa_handler;
聽聽聽聽聽聽聽聽 old_sigset_t sa_mask;
聽聽聽聽聽聽聽聽 unsigned long sa_flags;
聽聽聽聽聽聽聽聽 void (*sa_restorer)(void);
};
struct sigaction {
聽聽聽聽聽聽聽聽 __sighandler_t sa_handler;
聽聽聽聽聽聽聽 unsigned long sa_flags;
聽聽聽聽聽聽聽 void (*sa_restorer)(void);
聽聽聽聽聽聽聽 sigset_t sa_mask;聽聽 /* mask last for extensibility */
};
struct k_sigaction {
聽聽聽聽聽聽聽 struct sigaction sa;
};
#else
/* Here we must cater to libcs that poke about in kernel headers.聽聽 */
struct sigaction {
聽聽聽聽聽聽聽聽聽 union {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 __sighandler_t _sa_handler;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 void (*_sa_sigaction)(int, struct siginfo *, void *);
聽聽聽聽聽聽聽聽聽 } _u;
聽聽聽聽聽聽聽聽聽 sigset_t sa_mask;
聽聽聽聽聽聽聽聽聽 unsigned long sa_flags;
聽聽聽聽聽聽聽聽聽 void (*sa_restorer)(void);
};
#define sa_handler聽聽 _u._sa_handler
#define sa_sigaction _u._sa_sigaction
#endif /* __KERNEL__ */
sa_handler鐨勫師鍨嬫槸涓涓弬鏁頒負int錛岃繑鍥炵被鍨嬩負void鐨勫嚱鏁版寚閽堛傚弬鏁板嵆涓轟俊鍙峰鹼紝鎵浠ヤ俊鍙蜂笉鑳戒紶閫掗櫎淇″彿鍊間箣澶栫殑浠諱綍淇℃伅;
sa_sigaction鐨勫師鍨嬫槸涓涓甫涓変釜鍙傛暟錛岀被鍨嬪垎鍒負int錛宻truct siginfo *錛寁oid *,榪斿洖綾誨瀷涓簐oid鐨勫嚱鏁版寚閽堛傜涓涓弬鏁頒負淇″彿鍊?絎簩涓弬鏁版槸涓涓寚鍚憇truct siginfo緇撴瀯鐨勬寚閽堬紝姝ょ粨鏋勪腑鍖呭惈淇″彿鎼哄甫鐨勬暟鎹?絎笁涓弬鏁版病鏈変嬌鐢ㄣ?/p>
sa_mask鎸囧畾鍦ㄤ俊鍙峰鐞嗙▼搴忔墽琛岃繃紼嬩腑錛屽摢浜涗俊鍙峰簲褰撹闃誨銆傞粯璁ゅ綋鍓嶄俊鍙鋒湰韜闃誨銆?/p>
sa_flags鍖呭惈浜嗚澶氭爣蹇椾綅錛屾瘮杈冮噸瑕佺殑涓涓槸SA_SIGINFO錛屽綋璁懼畾浜嗚鏍囧織浣嶆椂錛岃〃紺轟俊鍙烽檮甯︾殑鍙傛暟鍙互浼犻掑埌淇″彿澶勭悊鍑芥暟涓傚嵆 浣縮a_sigaction鎸囧畾淇″彿澶勭悊鍑芥暟錛屽鏋滀笉璁劇疆SA_SIGINFO錛屼俊鍙峰鐞嗗嚱鏁板悓鏍蜂笉鑳藉緱鍒頒俊鍙蜂紶閫掕繃鏉ョ殑鏁版嵁錛屽湪淇″彿澶勭悊鍑芥暟涓榪欎簺淇? 鎭殑璁塊棶閮藉皢瀵艱嚧孌甸敊璇?/p>
sa_restorer宸茶繃鏃訛紝POSIX涓嶆敮鎸佸畠錛屼笉搴斿啀浣跨敤銆?/p>
聽聽聽聽聽聽聽 鍥犳錛屽綋浣犵殑淇″彿闇瑕佹帴鏀墮檮鍔犱俊鎭殑鏃跺欙紝浣犲繀欏葷粰sa_sigaction璧嬩俊鍙峰鐞嗗嚱鏁版寚閽堬紝鍚屾椂榪樿緇檚a_flags璧婼A_SIGINFO,綾諱技涓嬮潰鐨勪唬鐮侊細
聽聽聽聽 #include <signal.h>
聽聽聽聽 鈥︹?br />
聽聽聽聽 void sig_handler_with_arg(int sig,siginfo_t *sig_info,void *unused){鈥︹
聽聽聽聽
聽聽聽聽 int main(int argc,char **argv)
聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽 struct sigaction sig_act;
聽聽聽聽聽聽聽聽聽聽聽聽聽 鈥︹?br />
聽聽聽聽聽聽聽聽聽聽聽聽聽 sigemptyset(&sig_act.sa_mask);
聽聽聽聽聽聽聽聽聽聽聽聽聽 sig_act.sa_sigaction=sig_handler_with_arg;
聽聽聽聽聽聽聽聽聽聽聽聽聽 sig_act.sa_flags=SA_SIGINFO;
聽聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 鈥︹?br />
聽聽聽聽 }
聽聽聽聽聽聽聽 濡傛灉浣犵殑搴旂敤紼嬪簭鍙渶瑕佹帴鏀朵俊鍙鳳紝鑰屼笉闇瑕佹帴鏀墮澶栦俊鎭紝閭d綘闇瑕佺殑璁劇疆鐨勬槸sa_handler,鑰屼笉鏄痵a_sigaction,浣犵殑紼嬪簭鍙兘綾諱技涓嬮潰鐨勪唬鐮侊細
聽聽聽聽 #include <signal.h>
聽聽聽聽 鈥︹?br />
聽聽聽聽 void sig_handler(int sig){鈥︹
聽聽聽聽
聽聽聽聽 int main(int argc,char **argv)
聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽 struct sigaction sig_act;
聽聽聽聽聽聽聽聽聽聽聽聽聽 鈥︹?br />
聽聽聽聽聽聽聽聽聽聽聽聽聽 sigemptyset(&sig_act.sa_mask);
聽聽聽聽聽聽聽聽聽聽聽聽聽 sig_act.sa_handler=sig_handler;
聽聽聽聽聽聽聽聽聽聽聽聽聽 sig_act.sa_flags=0;
聽聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 鈥︹?br />
聽聽聽聽聽 }
聽聽聽聽聽 濡傛灉闇瑕佹洿璇︾粏璇存槑錛岃鍙傞槄sigaction鐨刴an鎵嬪唽銆?/p>
void signal_rec(int signum, siginfo_t *info, void *myop)
{
聽printf("receive signal %d\n", signum);
聽sleep(5);聽
}
int main(int argc,char **argv)
{
聽struct sigaction act;
聽int sig,i;
聽
聽sigemptyset(&act.sa_mask);
聽act.sa_flags = SA_SIGINFO;
聽act.sa_sigaction = signal_rec;
聽
聽for(i=1; i<argc; i++){ //argv[0]涓鴻皟鐢ㄧ▼搴忓悕
聽聽sig = atoi(argv[i]);
聽聽if(sigaction(sig, &act, NULL) <0){
聽聽聽printf("install signal error\n");
聽聽}聽
聽}
聽
聽while(1){
聽聽sleep(2);
聽聽printf("wait for the signal\n");
聽}
}
鐢ㄦ硶錛?br />灝嗘枃浠朵繚瀛樹負test.c錛屾墽琛宮ake test錛岀紪璇戠敓鎴恡est鏂囦歡銆?br />./test 36 39&
鍛戒護鐨勬剰鎬濇槸娉ㄥ唽淇″彿36,39銆傚懡浠ょ粨鏋滀細榪斿洖pid錛屽亣璁句負2625銆?br />閫氳繃鍙﹀涓涓粓绔悜2625榪涚▼鍙戦佷俊鍙楓備緥濡?kill -s 36 2625
鍒欐垜浠彲浠ョ湅鍒皊ignal_rec鍑芥暟琚墽琛屼簡銆?br />褰撴垜浠彂閫?0淇″彿錛屾垜浠細鍙戦佺▼搴忕粓姝簡錛岃繖鏄洜涓哄浜庡疄鏃朵俊鍙鳳紝榛樿鐨勬搷浣滄槸緇堟銆?br />鍏充簬淇″彿錛?br />聽Linux
鏀寔鐨勪俊鍙峰垎涓哄彲闈犱俊鍙峰拰涓嶅彲闈犱俊鍙楓傛澶勭殑鍙潬涓庝笉鍙潬涓嶆槸鎸囩郴緇熸槸涓嶆槸鍙潬鐨勫彲闈狅紝鑰屾槸瀵逛簬鍙潬淇℃伅鏉ヨ錛屾瘡涓嬈′俊鍙峰彂瀹為兘姣忚鍔犲埌淇″彿閾句腑錛屾墍浠ユ槸
鍙潬鐨勶紱鑰屽浜庝笉鍙潬淇″彿鏉ヨ錛屽鏋滆繘紼嬩箣鍓嶅凡緇忔帴鏀跺埌璇ヤ俊鍙鳳紝鍒欎笉浼氳鍔犲埌淇″彿閾句腑錛屽洜姝ゅ浜庢嬈″彂閫佺殑淇″彿鏉ヨ錛屽浜庤榪涚▼鏉ヨ鏄笉鐭ラ亾鐨勶紝鎵灝辨槸璇?
淇″彿涓㈠け浜嗭紝鍥犳鏄笉鍙潬鐨勩?br />聽涓嶅彲闈犱俊鍙蜂富瑕佹槸鍦ㄦ棭鏈熶俊鍙鋒満鍒朵笂鐨勪俊鍙楓備竴鑸潵璇達紝淇″彿鍊煎皬浜嶴IGRTMIN鐨勪俊鍙蜂負涓嶅彲闈犱俊鍙鳳紝涓嶅彲闈犱俊鍙峰張縐頒負闈炲疄鏃朵俊鍙楓傚彲闈犱俊鍙峰張縐頒負瀹炴椂淇″彿銆傚疄鏃朵俊鍙鋒槸SIGRTMIN鍜孲IGRTMAX闂寸殑鎵鏈変俊鍙楓?br />聽鎴戜滑鍙互閫氳繃kill -l鏌ョ湅SIGRTMIN鍜孲IGRTMAX鐨勫箋傚湪Debian緋葷粺鍜孯edhat涓婇潰錛屼竴鑸琒IGRTMIN=33,SIGRTMAX=64銆?br />聽Linux鏃㈡敮鎸佹柊鐨勪俊鍙峰畨瑁呭嚱鏁皊igation浠ュ強淇″彿鍙戦佸嚱鏁皊igqueue錛屽張鏀寔鏃╂湡鐨剆ignal淇″彿瀹夎鍑芥暟鍜宬ill淇″彿鍙戦佸嚱鏁般?br />聽淇″彿鐨勫彲闈犱笌涓嶅彲闈犲彧涓庝俊鍙峰兼湁鍏籌紝涓庝俊鍙風殑鍙戦佸拰瀹夎鍑芥暟鏃犲叧錛屼篃灝辨槸璇村湪Linux涓嬪嵆浣夸嬌鐢╯igaction鍜宻igqueue涔熶笉鍙兘灝嗕笉鍙潬淇″彿鍙樹負鍙潬淇″彿銆?br />淇″彿鍙戦佸嚱鏁頒富瑕佹湁浠ヤ笅鍑犱釜錛歬ill,raise,sigqueue,alarm,settimer,abort銆?br />淇″彿瀹夎鍑芥暟涓昏鏈塻ignal鍜宻igaction銆俿igaction涓昏鐢ㄤ簬涓巗igqueue緋葷粺璋冪敤閰嶅悎浣跨敤錛屼富瑕佺敤浜庡疄鏃朵俊鍙峰鐞嗐?br />淇″彿闆嗘搷浣滀富瑕佹湁浠ヤ笅鍑犱釜鍑芥暟錛歴igemptyset,sigfillset,sigaddset,sigdelset,sigismember銆?br />淇″彿鐨勯樆濉炵殑鏈喅涓昏鏈変互涓嬪嚑涓嚱鏁幫細sigprocmask,sigsuspend,sigpending銆?br />鏈鍚庝互涓涓涓插彛璁懼鏃剁敤鍒扮殑淇″彿澶勭悊浣滀負緇撳熬(鍦ㄤ笂嬈$殑鍒濆鍖栦覆鍙h澶囦腑宸茬粡鍑虹幇榪?錛?br />鍦ㄨ鍙栬澶囨暟鎹垨鑰呰繘琛岀綉緇滃簲鐢ㄧ殑鏃跺欙紝涓轟簡闃叉紼嬪簭榪涘叆姝婚攣錛屾垜浠渶瑕佽緗秴鏃舵搷浣滐紝鍗蟲瘮濡傛垜浠涓插彛璁懼錛屽皾璇曚竴瀹氭椂闂村悗浠嶇劧娌℃湁鍝嶅簲錛屽垯鍙兘璁懼娌℃湁姝e父宸ヤ綔銆傞偅涔堝湪瓚呮椂浠ュ悗鎴戜滑闇瑕侀鍑猴紝鍚﹀垯紼嬪簭灝遍攣浣忎簡銆?br />鎴戜滑鐜板湪浣跨敤SIGALRM淇″彿鏉ヨ繘琛岃繖涓鐞?榪欑鏂瑰紡騫朵笉鏄渶濂界殑鍔炴硶)錛?br />鎴戜滑鍋囪鏈変竴涓爣璁版槸鍚﹁秴鏃剁殑鍏ㄥ眬鍙橀噺caught_alrm錛岄粯璁や負0錛屼負1鏃跺垯琛ㄧず瓚呮椂銆?br />static volatile sig_atomic_t caught_alrm;
static void sig_alrm(int signo){//淇″彿澶勭悊鍑芥暟錛岃緗秴鏃跺叏灞鍙橀噺涓?銆?br />聽聽聽聽聽聽聽 caught_alrm = 1;
聽聽聽聽聽聽聽 return;
}
int a_function{
聽鈥︹?br />聽聽聽 if(signal(SIGALRM, sig_alrm) == SIG_ERR){
聽聽聽 聽syslog(LOG_ERR,"signal error in function:%s",__FUNCTION__);
聽聽聽聽聽聽聽 return -1;
聽聽聽 }
聽聽聽 caught_alrm = 0;
聽聽聽 alarm(expalarm);
聽聽聽 do{
聽聽聽 聽//do something
聽聽聽 聽//if the work is finished,call alarm(0) to clean the timer.
聽聽聽 }while(caught_alrm == 0);
}
娉細
1銆佹湰鏂囦負鏁寸悊浠ュ墠鐨勫伐浣滅瑪璁幫紝濡傛灉鎮ㄨ杞澆錛岃娉ㄦ剰鏉ユ簮涓哄皵闆咃紝浣滆呰澹浗銆傚鏋滄偍鏈変換浣曢棶棰樻榪庝氦嫻侊細shiguo.qin@gmail.com
2銆?
姝ゆ枃浠呬粎鏄竴鍒欑瑪璁幫紝濡傛灉鎮ㄦ鍦ㄥ鎵懼叧浜嶭inux淇″彿緙栫▼鏂歸潰鐨勮祫鏂欙紝鍙互鍙傝冮儜褰﹀叴鐨勪竴綃囨枃绔?http://www-
128.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html銆傛鏂囪緇嗘弿榪頒簡寰堝鍏充簬淇?
鍙峰鐞嗕腑鐨勭粨鏋勭瓑鍐呭錛屾槸瀛︿範淇″彿緙栫▼鐨勪竴綃囦笉閿欑殑鏁欑▼寮忔枃绔犮?/p>
聽
wait鐨勫嚱鏁板師鍨嬫槸錛?/strong>
銆銆
銆銆#include /* 鎻愪緵綾誨瀷pid_t鐨勫畾涔?*/
銆銆#include
銆銆 pid_t wait(int *status)
銆銆
銆銆榪涚▼涓鏃﹁皟鐢ㄤ簡wait錛屽氨绔嬪嵆闃誨鑷繁錛岀敱wait鑷姩鍒嗘瀽鏄惁褰撳墠榪涚▼鐨勬煇涓瓙榪涚▼宸茬粡閫鍑猴紝濡傛灉璁╁畠鎵懼埌浜嗚繖鏍蜂竴涓凡緇忓彉鎴愬兊灝哥殑瀛愯繘紼嬶紝
wait灝變細鏀墮泦榪欎釜瀛愯繘紼嬬殑淇℃伅錛屽茍鎶婂畠褰誨簳閿姣佸悗榪斿洖錛涘鏋滄病鏈夋壘鍒拌繖鏍蜂竴涓瓙榪涚▼錛寃ait灝變細涓鐩撮樆濉炲湪榪欓噷錛岀洿鍒版湁涓涓嚭鐜頒負姝€?br />
銆銆
銆銆鍙傛暟status鐢ㄦ潵淇濆瓨琚敹闆嗚繘紼嬮鍑烘椂鐨勪竴浜涚姸鎬侊紝瀹冩槸涓涓寚鍚慽nt綾誨瀷鐨勬寚閽堛備絾濡傛灉鎴戜滑瀵硅繖涓瓙榪涚▼鏄浣曟鎺夌殑姣笉鍦ㄦ剰錛屽彧鎯蟲妸榪欎釜鍍靛案榪涚▼娑堢伃鎺夛紝錛堜簨瀹炰笂緇濆ぇ澶氭暟鎯呭喌涓嬶紝鎴戜滑閮戒細榪欐牱鎯籌級錛屾垜浠氨鍙互璁懼畾榪欎釜鍙傛暟涓篘ULL錛屽氨璞′笅闈㈣繖鏍鳳細
銆銆
銆銆pid = wait(NULL);
銆銆
銆銆濡傛灉鎴愬姛錛寃ait浼氳繑鍥炶鏀墮泦鐨勫瓙榪涚▼鐨勮繘紼婭D錛屽鏋滆皟鐢ㄨ繘紼嬫病鏈夊瓙榪涚▼錛岃皟鐢ㄥ氨浼氬け璐ワ紝姝ゆ椂wait榪斿洖-1錛屽悓鏃秂rrno琚疆涓篍CHILD銆?br />
銆
waitpid鐨勫嚱鏁板師鍨嬫槸錛?/strong>
銆銆綆浠?br />
銆銆waitpid緋葷粺璋冪敤鍦↙inux鍑芥暟搴撲腑鐨勫師鍨嬫槸錛?br />
銆銆
銆銆#include /* 鎻愪緵綾誨瀷pid_t鐨勫畾涔?*/
銆銆#include
銆銆pid_t waitpid(pid_t pid,int *status,int options)
浠庢湰璐ㄤ笂璁詫紝緋葷粺璋冪敤waitpid鍜寃ait鐨勪綔鐢ㄦ槸瀹屽叏鐩稿悓鐨勶紝浣唚aitpid澶氬嚭浜嗕袱涓彲鐢辯敤鎴鋒帶鍒剁殑鍙傛暟pid鍜宱ptions錛屼粠鑰屼負鎴戜滑緙栫▼鎻愪緵浜嗗彟涓縐嶆洿鐏墊椿鐨勬柟寮忋備笅闈㈡垜浠氨鏉ヨ緇嗕粙緇嶄竴涓嬭繖涓や釜鍙傛暟錛?br />
銆銆
銆銆鈼?pid
銆銆
銆銆浠庡弬鏁扮殑鍚嶅瓧pid鍜岀被鍨媝id_t涓氨鍙互鐪嬪嚭錛岃繖閲岄渶瑕佺殑鏄竴涓繘紼婭D銆備絾褰損id鍙栦笉鍚岀殑鍊兼椂錛屽湪榪欓噷鏈変笉鍚岀殑鎰忎箟銆?br />
銆銆
銆銆pid>0鏃訛紝鍙瓑寰呰繘紼婭D絳変簬pid鐨勫瓙榪涚▼錛屼笉綆″叾瀹冨凡緇忔湁澶氬皯瀛愯繘紼嬭繍琛岀粨鏉熼鍑轟簡錛屽彧瑕佹寚瀹氱殑瀛愯繘紼嬭繕娌℃湁緇撴潫錛寃aitpid灝變細涓鐩寸瓑涓嬪幓銆?br />
銆銆
銆銆pid=-1鏃訛紝絳夊緟浠諱綍涓涓瓙榪涚▼閫鍑猴紝娌℃湁浠諱綍闄愬埗錛屾鏃秝aitpid鍜寃ait鐨勪綔鐢ㄤ竴妯′竴鏍楓?br />
銆銆
銆銆pid=0鏃訛紝絳夊緟鍚屼竴涓繘紼嬬粍涓殑浠諱綍瀛愯繘紼嬶紝濡傛灉瀛愯繘紼嬪凡緇忓姞鍏ヤ簡鍒殑榪涚▼緇勶紝waitpid涓嶄細瀵瑰畠鍋氫換浣曠悊鐫?br />
銆銆
銆銆pid<-1鏃訛紝絳夊緟涓涓寚瀹氳繘紼嬬粍涓殑浠諱綍瀛愯繘紼嬶紝榪欎釜榪涚▼緇勭殑ID絳変簬pid鐨勭粷瀵瑰箋?br />
銆銆鈼?options
銆銆options鎻愪緵浜嗕竴浜涢澶栫殑閫夐」鏉ユ帶鍒秝aitpid錛岀洰鍓嶅湪Linux涓彧鏀寔WNOHANG鍜學UNTRACED涓や釜閫夐」錛岃繖鏄袱涓父鏁幫紝鍙互鐢?|"榪愮畻絎︽妸瀹冧滑榪炴帴璧鋒潵浣跨敤錛屾瘮濡傦細
銆銆ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);
銆銆濡傛灉鎴戜滑涓嶆兂浣跨敤瀹冧滑錛屼篃鍙互鎶妎ptions璁句負0錛屽錛?/p>
銆銆ret=waitpid(-1,NULL,0);
銆銆
銆銆濡傛灉浣跨敤浜哤NOHANG鍙傛暟璋冪敤waitpid錛屽嵆浣挎病鏈夊瓙榪涚▼閫鍑猴紝瀹冧篃浼氱珛鍗寵繑鍥烇紝涓嶄細鍍弚ait閭f牱姘歌繙絳変笅鍘匯?br />
銆銆
銆銆鑰學UNTRACED鍙傛暟錛岀敱浜庢秹鍙婂埌涓浜涜窡韙皟璇曟柟闈㈢殑鐭ヨ瘑錛屽姞涔嬫瀬灝戠敤鍒幫紝榪欓噷灝變笉澶氳垂絎斿ⅷ浜嗭紝鏈夊叴瓚g殑璇昏呭彲浠ヨ嚜琛屾煡闃呯浉鍏蟲潗鏂欍?br />
銆銆
銆銆鐪嬪埌榪欓噷錛岃仾鏄庣殑璇昏呭彲鑳藉凡緇忕湅鍑虹鍊簡--wait涓嶅氨鏄粡榪囧寘瑁呯殑waitpid鍚楋紵娌¢敊錛屽療鐪?lt;鍐呮牳婧愮爜鐩綍>/include/unistd.h鏂囦歡349-352琛屽氨浼氬彂鐜頒互涓嬬▼搴忔錛?br />
銆銆
銆銆static inline pid_t wait(int * wait_stat)
銆銆{
銆銆 return waitpid(-1,wait_stat,0);
銆銆}
銆銆
銆銆榪斿洖鍊煎拰閿欒
銆銆
銆銆waitpid鐨勮繑鍥炲兼瘮wait紼嶅井澶嶆潅涓浜涳紝涓鍏辨湁3縐嶆儏鍐碉細
銆銆
銆銆鈼?褰撴甯歌繑鍥炵殑鏃跺欙紝waitpid榪斿洖鏀墮泦鍒扮殑瀛愯繘紼嬬殑榪涚▼ID錛?br />
銆銆
銆銆鈼?濡傛灉璁劇疆浜嗛夐」WNOHANG錛岃岃皟鐢ㄤ腑waitpid鍙戠幇娌℃湁宸查鍑虹殑瀛愯繘紼嬪彲鏀墮泦錛屽垯榪斿洖0錛?br />
銆銆
銆銆鈼?濡傛灉璋冪敤涓嚭閿欙紝鍒欒繑鍥?1錛岃繖鏃秂rrno浼氳璁劇疆鎴愮浉搴旂殑鍊間互鎸囩ず閿欒鎵鍦紱
銆銆
銆銆褰損id鎵鎸囩ず鐨勫瓙榪涚▼涓嶅瓨鍦紝鎴栨榪涚▼瀛樺湪錛屼絾涓嶆槸璋冪敤榪涚▼鐨勫瓙榪涚▼錛寃aitpid灝變細鍑洪敊榪斿洖錛岃繖鏃秂rrno琚緗負ECHILD
鍏跺畠錛?/font>
璋冪敤 wait錛唚aitpid 鏉ュ鐞嗙粓姝㈢殑瀛愯繘紼嬶細
pid_t wait(int* statloc);
pid_t waitpid(pid_t pid, int*statloc, int options);涓や釜鍑芥暟閮借繑鍥炰袱涓鹼細鍑芥暟鐨勮繑鍥炲煎拰緇堟鐨勫瓙榪涚▼ID錛岃屽瓙榪涚▼緇堟鐨勭姸鎬佸垯鏄氳繃statloc鎸囬拡榪斿洖鐨勩?br />
聽聽聽聽 wait錛唚aitpid 鐨勫尯鍒槸鏄捐屾槗瑙佺殑錛寃ait絳夊緟絎竴涓粓姝㈢殑瀛愯繘紼嬶紝鑰寃aitpid鍒欏彲浠ユ寚瀹氱瓑寰呯壒瀹氱殑瀛愯繘紼嬨傝繖鏍風殑鍖哄埆鍙兘浼氬湪涓嬮潰榪欑鎯呭喌鏃惰〃鐜板緱鏇村姞鏄庢樉錛?br /> 聽聽聽聽聽聽聽聽 褰撳悓鏃舵湁5涓鎴瘋繛涓婃湇鍔″櫒錛屼篃灝辨槸璇存湁浜斾釜瀛愯繘紼嬪垎鍒搴斾簡5涓鎴鳳紝姝ゆ椂錛屼簲涓鎴峰嚑涔庡湪鍚屾椂璇鋒眰緇堟錛岃繖鏍蜂竴鏉ワ紝鍑犱箮鍚屾椂錛屼簲涓狥IN鍙戝悜鏈嶅姟鍣紝 鍚屾牱鐨勶紝浜斾釜SIGCHLD淇″彿鍒拌揪鏈嶅姟鍣紝鐒惰岋紝UNIX鐨勪俊鍙峰線寰鏄笉浼氭帓闃熺殑錛屾樉鐒惰繖鏍蜂竴鏉ワ紝淇″彿澶勭悊鍑芥暟灝嗗彧浼氭墽琛屼竴嬈★紝孌嬬暀鍓╀綑鍥涗釜瀛愯繘紼嬩綔涓? 鍍靛案榪涚▼椹葷暀鍦ㄥ唴鏍哥┖闂淬傛鏃訛紝姝g‘鐨勮В鍐沖姙娉曟槸鍒╃敤waitpid(-1, &stat, WNOHANG)闃叉鐣欎笅鍍靛案榪涚▼銆傚叾涓殑pid涓猴紞1琛ㄦ槑絳夊緟絎竴涓粓姝㈢殑瀛愯繘紼嬶紝鑰學NOHANG閫夋嫨欏歸氱煡鍐呮牳鍦ㄦ病鏈夊凡緇堟榪涚▼欏規椂涓嶈闃誨銆?
wait錛唚aitpid 鍖哄埆
聽聽聽聽聽聽 waitpid鎻愪緵浜唚ait鍑芥暟涓嶈兘瀹炵幇鐨?涓姛鑳?
榪欎袱涓嚱鏁拌繑鍥炵殑瀛愯繘紼嬬姸鎬侀兘淇濆瓨鍦╯tatloc鎸囬拡涓? 鐢ㄤ互涓?涓畯鍙互媯鏌ヨ鐘舵?
聽聽聽 if(fork()>0) /* 濡傛灉鏄埗榪涚▼ */
聽聽聽聽聽聽 wait(NULL);聽聽聽 /* 鏀墮泦鍍靛案榪涚▼ */
}
聽聽聽 澶у鐪嬪畬浠g爜鍚庯紝灝變細瑙夊緱榪欎釜浠g爜姝f槸鎴戝垰鎵嶈鐨勮繘紼嬩竴鐢熸槸鎬庝箞鏍風殑錛岃繘紼嬫鍚庯紝涓瀹氳涓轟粬鏀跺案錛屽惁鍒欎粬灝變細緙栫▼鍍靛案榪涚▼銆備笅闈㈠氨璁╂垜浠潵鐪嬬湅鏈兘鎶婃鍘葷殑榪涚▼鏀跺案浼氬彉鎴愪粈涔堟牱瀛愶紵
/**********************************鍍靛案榪涚▼******zombie.c*****************************************************/
#include <sys/types.h>
#include <unistd.h>
main()
{
聽聽聽聽聽聽 fork(); /*寮濮嬪垱寤轟竴涓瓙榪涚▼*/
聽聽聽 if(fork>0) /* 濡傛灉鏄埗榪涚▼ */
聽聽聽聽聽聽 sleep(30);聽聽聽 /* 浼戠湢30縐掞紝榪欐鏃墮棿閲岋紝鐖惰繘紼嬩粈涔堜篃騫蹭笉浜?*/
聽聽聽聽聽聽 wait(NULL);聽聽聽 /* 鏀惰搗鍍靛案榪涚▼ */
聽聽 /*鍥犱負鐖惰繘紼嬫浜嗭紝瀛愯繘紼嬩篃寰椾竴璧烽櫔钁紝閭d箞鎴戜滑灝辮鐖惰繘紼嬬潯鐪?0縐掞紝鍦ㄨ繖30縐掑唴鎴戜滑灝卞彲浠ョ湅鍒板兊灝歌繘紼嬨?br />聽聽聽聽 30縐掕繃鍚庯紝鐖惰繘紼嬮啋鏉ュ悗灝卞緱姝伙紝鎵浠ュ埌閭f椂瀛愯繘紼嬩篃灝辨鍘匯?/
}
/********************************************************************************************/
聽聽聽 涓轟簡璁╁ぇ瀹舵洿娓呮鐨勭湅鍒板兊灝歌繘紼嬫垜浠妸榪欎釜鍍靛案榪涚▼浠g爜緙栬瘧錛岀劧鍚庢墽琛岋紝
#gcc -o zombie zombie.c
緙栬瘧鎴愬姛鍚庢垜浠紑濮嬫墽琛岃繖涓▼搴忓洜涓轟唬鐮侀噷鐨剆leep(30)鏄鐖惰繘紼嬬潯鐪?0縐掞紝濡傛灉鎴戜滑鍦ㄥ墠鍙版墽琛屾垜浠繖涓▼搴忥紝閭d箞灝變笉鑳芥墽琛屽叾浠杝hell鍛戒護浜嗭紝鎵浠ヨ繖閲屾垜浠湪鎵ц鐨勫懡浠ゅ悗闈㈠姞涓涓?amp; 浠h〃鍚庡彴榪愯鐨勬剰鎬濄?br />#./zomber &
濂戒簡錛屾垜浠湪30縐掑唴鎵ц鏌ョ湅榪涚▼鍛戒護鏉ョ湅鐪嬫垜浠繖涓獄ombie榪涚▼鏄粈涔堟牱鐨勶紵
#ps -aux |grep zombie
榪欎釜鍛戒護鏄樉紺烘湁鍏硓ombie鐨勬墍鏈変俊鎭傚叿浣撴搷浣滆鐪嬪浘錛?錛夈?/font>
聽聽聽 鐪嬪埌榪欓噷鍚庯紝鑱槑鐨勬湅鍙嬩細闂紝鏃㈢劧瀛愯繘紼嬫槸鐢辯埗榪涚▼鍒涢犲嚭鏉ョ殑錛岄偅涔堝鏋滀竴涓埗紼嬪簭鎵ц瀹岄鍑哄悗錛屽瓙榪涚▼涓嶇鏄笉鏄兊灝歌繘紼嬩篃鐩存帴灝遍鍑轟簡錛屽洜涓虹埗榪涚▼姝? 浜嗗槢銆傞偅涔堣繖涔熶笉浼氶犳垚澶氬ぇ鍗卞鍟婏紵濡傛灉澶у榪欎箞璁や負閭e彲灝遍敊浜嗭紝褰撴垜浠垰鎵嶇敤ps鍛戒護瑙傚療榪涚▼鐨勬墽琛岀姸鎬佹椂錛岀湅鍒版煇浜涜繘紼嬬殑鐘舵佹爮涓篸efunct錛岃繖 灝辨槸鎵璋撶殑鈥滃兊灝糕濊繘紼嬨傗滃兊灝糕濊繘紼嬫槸涓涓棭宸叉浜$殑榪涚▼錛屼絾鍦ㄨ繘紼嬭〃錛坧rocesss table錛変腑浠嶅崰浜嗕竴涓綅緗紙slot錛夈傜敱浜庤繘紼嬭〃鐨勫閲忔槸鏈夐檺鐨勶紝鎵浠ワ紝defunct榪涚▼涓嶄粎鍗犵敤緋葷粺鐨勫唴瀛樿祫婧愶紝褰卞搷緋葷粺鐨勬ц兘錛岃屼笖濡傛灉鍏舵暟 鐩お澶氾紝榪樹細瀵艱嚧緋葷粺鐦棯錛屽叿浣撹鐪嬩笅闈㈢殑浠g爜錛?br />/***********************************鏃犻檺鍒涘緩瀛愯繘紼?*******************************************/
#include <sys/types.h>
#include <unistd.h>
main()
{
聽聽聽聽聽聽 for (;;)聽 /*鍒朵綔涓涓寰幆*/
聽聽聽聽聽聽
聽聽聽聽聽聽聽聽 fork(); /*寮濮嬪垱寤轟竴涓瓙榪涚▼*/
}
/********************************************************************************************/
鎳侰璇█鐨勬湅鍙嬩細鐭ラ亾for(;;)鏄竴涓寰幆銆傞偅涔堣繖浠呮湁2琛屼唬鐮佺殑紼嬪簭灝卞彲浠ユ妸浣犵殑linux鐬棿姝繪満錛屽洜涓轟粬鐨勪綔鐢ㄦ槸鏃犻檺鍒剁殑鍦ㄥ唴瀛橀噷澧炲姞鏂扮殑瀛愯繘紼嬶紝涓涓郴緇熸牴鎹唴瀛樼殑瀹歸噺浼氬垎閰嶈繘紼嬬殑鏈澶ч檺鍒訛紝涓鏃﹀悓鏃惰繍琛岀殑榪涚▼鏁拌秴絎﹀悎錛岄偅涔堜綘鐨勬満鍣ㄥ繀鐒朵細姝繪満銆?br />聽聽 鎴戣繖閲屽垎鍒敤浜?涓敤鎴瘋繘琛屾祴璇曡繃錛屼竴涓槸鏅氭潈闄愮殑鐢ㄦ埛錛屼竴涓槸Root鐢ㄦ埛錛屾祴璇曠粨鏋滄槸鈥滀換浣曠敤鎴峰彧瑕佹墽琛岃繖涓▼搴忛兘浼氳鏈哄櫒姝繪帀鈥濄傚師鍥犲氨鏄粯璁ょ殑 Linux緋葷粺娌℃湁瀵規櫘閫氱敤鎴風殑浣跨敤鏈澶ц繘紼嬭繘琛岄檺鍒躲傛墍浠ヨ繖鏍峰緋葷粺閫犳垚寰堝ぇ涓涓▉鑳侊紝閭d箞鎴戜滑濡備綍閬垮厤鏅氱敤鎴烽潪娉曟墽琛岃繃澶氳祫婧愭垨榪涚▼瀵艱嚧緋葷粺鎷栨錛? 鎵浠ユ垜浠殑緇欓櫎浜哛oot鐨勭敤鎴峰仛涓涓嬮檺鍒躲?/font>
瀵規櫘閫氱敤鎴瘋繘琛岄檺鍒訛細
絎?姝ワ細棣栧厛榪涘埌Linux緇堢鐢╲i緙栬緫/etc/security /limits.conf鏂囦歡錛屽湪閲岄潰鍔犲叆錛?
銆銆* hard core 0
銆銆* hard rss 5000
銆銆* hard nproc 20
聽
聽
榪欓噷鐨? 浠h〃闄や簡Root鐨勬墍鏈夌敤鎴鳳紝(* hard core 0) 鏄姝ore files鈥渃ore 0鈥濓紝(* hard rss
5000) 鏄檺鍒跺唴瀛樹嬌鐢ㄤ負5MB鈥渞ss聽 5000鈥? (* hard nproc 20 )鏄檺鍒惰繘紼嬫暟涓衡渘proc
50鈥溿傚ぇ瀹跺彲浠ユ牴鎹嚜宸辯郴緇熷唴瀛樺ぇ灝忚繘琛屽悎鐞嗛厤緗?/font>
絎?姝ワ細鐢╲i緙栬緫/etc/pam.d/login鏂囦歡錛岀劧鍚庡姞涓婁笅闈㈣繖琛屼繚瀛橀鍑哄氨鍙互銆?
銆銆session required /lib/security/pam_limits.so
聽聽聽 濂戒簡錛岀幇鍦ㄦ垜浠凡緇忓鏅氱敤鎴烽檺鍒朵簡榪涚▼鍜屽唴瀛樹嬌鐢ㄦ瀬闄愶紝淇敼瀹岄厤緗互鍚庡ぇ瀹跺彲浠ョ敤Root鍜屾櫘閫氱敤鎴峰垎鍒繘琛屾祴璇曪紝緇撴灉褰撶劧鏄櫘閫氱敤鎴鋒墽琛屽畬鎴戜滑鍒氭墠鍋氱殑紼嬪簭涓嶄細姝繪満浜嗐?/font>
聽聽聽 涓涓郴緇熺殑瀹夊叏鎬т笉鍙栧喅涓庢墦涓嶆墦琛ヤ竵錛岃櫧鐒舵墦琛ヤ竵寰堥噸瑕侊紝浣嗘槸瀵圭郴緇熷仛鍑虹浉搴旂殑閰嶇疆涔熸槸鐩稿綋閲嶈鐨勩?br />
銆聽
錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛?/p>
鍦╢ork
()/execve()榪囩▼涓紝鍋囪瀛愯繘紼嬬粨鏉熸椂鐖惰繘紼嬩粛瀛樺湪錛岃岀埗榪涚▼fork()涔嬪墠鏃㈡病瀹夎SIGCHLD淇″彿澶勭悊鍑芥暟璋冪敤waitpid()絳夊緟
瀛愯繘紼嬬粨鏉燂紝鍙堟病鏈夋樉寮忓拷鐣ヨ淇″彿錛屽垯瀛愯繘紼嬫垚涓哄兊灝歌繘紼嬶紝鏃犳硶姝e父緇撴潫錛屾鏃跺嵆浣挎槸root韜喚kill
-9涔熶笉鑳芥潃姝誨兊灝歌繘紼嬨傝ˉ鏁戝姙娉曟槸鏉姝誨兊灝歌繘紼嬬殑鐖惰繘紼?鍍靛案榪涚▼鐨勭埗榪涚▼蹇呯劧瀛樺湪)錛屽兊灝歌繘紼嬫垚涓?瀛ゅ効榪涚▼"錛岃繃緇х粰1鍙瘋繘紼媔nit錛宨nit濮?
緇堜細璐熻矗娓呯悊鍍靛案榪涚▼銆偮犅?br />
===========================================
鍦↙inux涓彲浠ョ敤
ps auwx聽聽
鍙戠幇鍍靛案榪涚▼
a all w/ tty, including other users 鎵鏈夌獥鍙e拰緇堢錛屽寘鎷叾浠栫敤鎴風殑榪涚▼
u user-oriented 闈㈠悜鐢ㄦ埛(鐢ㄦ埛鍙嬪ソ)
-w,w wide output 瀹芥牸寮忚緭鍑?
x processes w/o controlling ttys聽聽
鍦ㄥ兊灝歌繘紼嬪悗闈?浼氭爣娉?
ps axf聽聽
鐪嬭繘紼嬫爲錛屼互鏍戝艦鏂瑰紡鐜板疄榪涚▼鍒楄〃
ps axm聽聽
浼氭妸綰跨▼鍒楀嚭鏉?鍦╨inux涓嬭繘紼嬪拰綰跨▼鏄粺涓鐨勶紝鏄交閲忕駭榪涚▼鐨勪袱縐嶆柟寮忋?
ps axu聽聽
鏄劇ず榪涚▼鐨勮緇嗙姸鎬?
===========================================
killall
kill -15
kill -9
涓鑸兘涓嶈兘鏉鎺?defunct榪涚▼
鐢ㄤ簡kill -15,kill -9浠ュ悗 涔嬪悗鍙嶈屼細澶氬嚭鏇村鐨勫兊灝歌繘紼?
kill -kill pid
fuser -k pid聽聽
鍙互鑰冭檻鏉姝諱粬鐨刾arent process錛?
kill -9 浠栫殑parent process
===========================================
涓涓凡緇忕粓姝?浣嗘槸鍏剁埗榪涚▼灝氭湭瀵瑰叾榪涜鍠勫悗澶勭悊錛堣幏鍙栫粓姝㈠瓙榪涚▼鐨勬湁鍏充俊鎭侀噴鏀懼畠浠嶅崰鐢ㄧ殑璧勬簮錛夌殑榪涚▼琚О涓哄兊姝昏繘紼?Zombie Process)銆?
閬垮厤zombie鐨勬柟娉曪細
1)鍦⊿VR4涓紝濡傛灉璋冪敤signal鎴杝igset灝哠IGCHLD鐨勯厤緗緗負蹇界暐,鍒欎笉浼氫駭鐢熷兊姝誨瓙榪涚▼銆傚彟澶?浣跨敤SVR4鐗堢殑sigaction,鍒欏彲璁劇疆SA_NOCLDWAIT鏍囧織浠ラ伩鍏嶅瓙榪涚▼鍍墊銆?
Linux涓篃鍙嬌鐢ㄨ繖涓紝鍦ㄤ竴涓▼搴忕殑寮濮嬭皟鐢ㄨ繖涓嚱鏁?
signal(SIGCHLD,SIG_IGN);聽聽
聽聽
2)璋冪敤fork涓ゆ銆傜▼搴? - 5 瀹炵幇浜嗚繖涓鐐廣?
3)鐢╳aitpid絳夊緟瀛愯繘紼嬭繑鍥?聽聽
===========================================
zombie榪涚▼鏄兊姝昏繘紼嬨傞槻姝㈠畠鐨勫姙娉曪紝涓鏄敤wait,waitpid涔嬬被鐨勫嚱鏁拌幏寰?
榪涚▼鐨勭粓姝㈢姸鎬侊紝浠ラ噴鏀捐祫婧愩傚彟涓涓槸fork涓ゆ聽聽
===========================================
defunct榪涚▼鍙槸鍦╬rocess table閲岃繕鏈変竴涓褰曪紝鍏朵粬鐨勮祫婧愭病鏈夊崰鐢紝闄ら潪浣犵殑緋葷粺鐨刾rocess涓暟鐨勯檺鍒跺凡緇忓揩瓚呰繃浜嗭紝zombie榪涚▼涓嶄細鏈夋洿澶氱殑鍧忓銆?
鍙兘鍞竴鐨勬柟娉曞氨鏄痳eboot緋葷粺鍙互娑堥櫎zombie榪涚▼銆?
===========================================
浠諱綍紼嬪簭閮芥湁鍍靛案鐘舵侊紝瀹冨崰鐢ㄤ竴鐐瑰唴瀛樿祫婧?涔熷氨鏄繘紼嬭〃閲岃繕鏈変竴涓褰?錛屼粎浠呮槸琛ㄨ薄鑰屽凡涓嶅繀瀹蟲曘傚鏋滅▼搴忔湁闂鏈夋満浼氶亣瑙侊紝瑙e喅澶ф壒閲忓兊灝哥畝鍗曟湁鏁堢殑鍔炴硶鏄噸璧楓俴ill鏄棤浠諱綍鏁堟灉鐨?
fork涓巣ombie/defunct"
鍦║nix
涓嬬殑涓浜涜繘紼嬬殑榪愪綔鏂瑰紡銆傚綋涓涓繘紼嬫浜℃椂,瀹冨茍涓嶆槸瀹屽叏鐨勬秷澶變簡銆傝繘紼嬬粓姝?瀹冧笉鍐嶈繍琛?浣嗘槸榪樻湁涓浜涙畫鐣欑殑灝忎笢瑗跨瓑寰呯埗榪涚▼鏀跺洖銆傝繖浜涙畫鐣欑殑涓滆タ鍖呮嫭
瀛愯繘紼嬬殑榪斿洖鍊煎拰鍏朵粬鐨勪竴浜涗笢瑗褲傚綋鐖惰繘紼?fork() 涓涓瓙榪涚▼鍚?瀹冨繀欏葷敤 wait() 鎴栬?waitpid()
絳夊緟瀛愯繘紼嬮鍑恒傛鏄繖涓?wait() 鍔ㄤ綔鏉ヨ瀛愯繘紼嬬殑孌嬬暀鐗╂秷澶便?
鑷劧鐨勶紝鍦ㄤ笂榪拌鍒欎箣澶栨湁涓緥澶?鐖惰繘紼嬪彲浠ュ拷鐣?SIGCLD 杞腑鏂屼笉蹇呰 wait()銆傚彲浠ヨ繖鏍峰仛鍒?鍦ㄦ敮鎸佸畠鐨勭郴緇熶笂,姣斿Linux):
main()
{
signal(SIGCLD, SIG_IGN); /* now I don't have to wait()! */
.
.
fork();
fork();
fork(); /* Rabbits, rabbits, rabbits! */
锝?
鐜板湪錛屽瓙榪涚▼姝諱骸鏃剁埗榪涚▼娌℃湁 wait()錛岄氬父鐢?ps 鍙互鐪嬪埌瀹冭鏄劇ず涓衡溾濄傚畠灝嗘案榪滀繚鎸佽繖鏍?鐩村埌 鐖惰繘紼?wait()錛屾垨鑰呮寜浠ヤ笅鏂規硶澶勭悊銆?
榪?
閲屾槸浣犲繀欏葷煡閬撶殑鍙︿竴涓鍒?褰撶埗榪涚▼鍦ㄥ畠wait()瀛愯繘紼嬩箣鍓嶆浜′簡(鍋囧畾瀹冩病鏈夊拷鐣?SIGCLD),瀛愯繘紼嬪皢鎶?init(pid
1)榪涚▼浣滀負瀹冪殑鐖惰繘紼嬨傚鏋滃瓙榪涚▼宸ヤ綔寰楀緢濂藉茍鑳藉鎺у埗錛岃繖騫朵笉鏄棶棰樸備絾濡傛灉瀛愯繘紼嬪凡緇忔槸
defunct錛屾垜浠氨鏈変簡涓鐐瑰皬楹葷儲銆傜湅錛屽師鍏堢殑鐖惰繘紼嬩笉鍙兘鍐?wait()錛屽洜涓哄畠宸茬粡娑堜骸浜嗐傝繖鏍鳳紝init 鎬庝箞鐭ラ亾 wait() 榪欎簺
zombie 榪涚▼銆?
絳旀錛氫笉鍙鏂欑殑銆傚湪涓浜涚郴緇熶笂錛宨nit鍛ㄦ湡鎬х殑鐮村潖鎺夊畠鎵鏈夌殑defunct榪涚▼銆傚湪鍙﹀涓浜涚郴緇熶腑,瀹冨共
鑴嗘嫆緇濇垚涓轟換浣昫efunct榪涚▼鐨勭埗榪涚▼錛岃屾槸椹笂姣佺伃瀹冧滑銆傚鏋滀綘浣跨敤涓婅堪緋葷粺鐨勪竴縐?鍙互鍐欎竴涓畝鍗曠殑寰幆錛岀敤灞炰簬init鐨刣efunct榪涚▼濉?
婊¤繘紼嬭〃銆傝繖澶ф涓嶄細浠や綘鐨勭郴緇熺鐞嗗憳寰堥珮鍏村惂?
浣犵殑浠誨姟錛氱‘瀹氫綘鐨勭埗榪涚▼涓嶈蹇界暐 SIGCLD錛屼篃涓嶈 wait() 瀹?
fork() 鐨勬墍鏈夎繘紼嬨備笉榪囷紝浣犱篃鏈繀 瑕?鎬繪槸榪欐牱鍋氾紙姣斿錛屼綘瑕佽搗涓涓?daemon 鎴栨槸鍒殑浠涔堜笢瑗匡級,浣嗘槸浣犲繀欏誨皬蹇冪紪紼嬶紝濡傛灉浣犳槸涓涓?
fork() 鐨勬柊鎵嬨傚彟澶栵紝涔熶笉瑕佸湪蹇冪悊涓婃湁浠諱綍鏉熺細銆?
鎬葷粨錛?
瀛愯繘紼嬫垚涓?defunct 鐩村埌鐖惰繘紼?wait()錛岄櫎闈炵埗榪涚▼蹇界暐浜?SIGCLD 銆?
鏇磋繘涓姝ワ紝鐖惰繘紼嬫病鏈?wait() 灝辨秷浜★紙浠嶅亣璁劇埗榪涚▼娌℃湁蹇界暐 SIGCLD 錛夌殑瀛愯繘紼嬶紙媧誨姩鐨勬垨鑰?defunct錛夋垚涓?init 鐨勫瓙榪涚▼錛宨nit 鐢ㄩ噸鎵嬫硶澶勭悊瀹冧滑銆?/b>
聽
錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳
聽