锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美视频你懂的,国产农村妇女毛片精品久久麻豆,欧美精品xxxxbbbbhttp://www.shnenglu.com/elva/category/4331.htmlzh-cnSat, 18 Feb 2012 12:08:00 GMTSat, 18 Feb 2012 12:08:00 GMT60Ubuntu 鏇存柊婧愮鍚嶉敊璇?鈥揃ADSIG 40976EAF437D05B5http://www.shnenglu.com/elva/archive/2012/02/18/165876.html鍙跺瓙鍙跺瓙Fri, 17 Feb 2012 19:10:00 GMThttp://www.shnenglu.com/elva/archive/2012/02/18/165876.htmlhttp://www.shnenglu.com/elva/comments/165876.htmlhttp://www.shnenglu.com/elva/archive/2012/02/18/165876.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/165876.htmlhttp://www.shnenglu.com/elva/services/trackbacks/165876.html

Ubuntu 鏇存柊婧愮鍚嶉敊璇?–BADSIG 40976EAF437D05B5

2011-02-19 xiao H Posted in 緋葷粺綆$悊

閿欒鎻愮ず錛?/p>

GPG 閿欒錛歨ttp://mirrors.163.com maverick-updates Release: 涓嬪垪絳懼悕鏃犳晥錛?BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key <ftpmaster @ubuntu.com> </ftpmaster>

淇鏂規(guī)硶
gpg --keyserver keyserver.ubuntu.com --recv 40976EAF437D05B5 gpg --export --armor 40976EAF437D05B5 | sudo apt-key add -

涓婇潰鐨勬柟娉曚笉琛屽彲浠ヨ瘯璇曚笅闈㈣繖涓?/p>

sudo aptitude -o Acquire::http::No-Cache=True -o Acquire::BrokenProxy=true update

緇堟瀬澶ф硶

sudo apt-get clean cd /var/lib/apt sudo mv lists lists.old sudo mkdir -p lists/partial sudo apt-get clean sudo apt-get update

浠ヤ笂鏂規(guī)硶鏉ヨ嚜錛?/p>

http://forum.ubuntu.org.



杞嚜錛?br />
http://www.linuxbyte.org/ubuntu-geng-xin-yuan-qian-ming-cuo-wu-badsig-40976eaf437d05b5.html


鍙跺瓙 2012-02-18 03:10 鍙戣〃璇勮
]]>
Linux鏃犳硶鐧誨綍錛屾樉紺簃odule is unknownhttp://www.shnenglu.com/elva/archive/2012/01/06/163709.html鍙跺瓙鍙跺瓙Fri, 06 Jan 2012 04:35:00 GMThttp://www.shnenglu.com/elva/archive/2012/01/06/163709.htmlhttp://www.shnenglu.com/elva/comments/163709.htmlhttp://www.shnenglu.com/elva/archive/2012/01/06/163709.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/163709.htmlhttp://www.shnenglu.com/elva/services/trackbacks/163709.html浠婂ぉ鍦ㄩ厤緗甇racle瀹夎鐜鏃訛紝鏇存敼浜嗕竴浜涚郴緇熷弬鏁幫紝娉ㄩ攢閲嶆柊鐧誨綍鏃跺彂鐜板嵆浣胯緭鍏ユ紜殑鐢ㄦ埛鍚嶅拰瀵嗙爜錛屼篃鏃犳硶鐧誨綍錛屽湪鎸夊洖杞︾殑閭d竴鐬棿鍙互鐪嬪埌瀵嗙爜涓嬫柟鏈変竴琛屽揩閫熼棯榪囩殑鎻愮ず“module is unknown”銆備笉瑙d綍鎰忋?

    鏈漢鐨勭郴緇熼粯璁ゆ槸鍛戒護(hù)琛岀晫闈㈠惎鍔ㄧ殑銆備簬鏄噸鍚互RunLevel 5榪涘叆鍥懼艦鐣岄潰銆傚彂鐜板浘褰㈢晫闈㈠彲浠ユ甯歌繘鍏ャ備笅闈㈠氨鏌ヨ鏃ュ織鍚э細(xì)

   1:  # cd /var/log/
   2:  #cat security 

鍦ㄦ棩蹇楁枃浠朵腑錛屾垜鐪嬪埌浜嗗涓嬩俊鎭細(xì)

PAM unable to dlopen(/lib/security/pam_limits.so)

PAM [error: /lib/security/pam_limits.so: wrong ELF class: ELFCLASS32]

PAM adding faulty module: /lib/security/pam_limits.so

pam_unix(login:session): session opened for user Oracle by LOGIN(uid=0)

Module is unknown

鐪嬪埌榪欓噷錛屾垜鎯寵搗鎴戝湪/etc/pam.d/login涓姞鍏ヤ簡:

session required /lib/security/pam_limits.so

session required pam_limits.so

涓ゆ潯閰嶇疆璇彞銆傛牴鎹棩蹇椾俊鎭互涓奓ogin涓婄殑鍏朵粬閰嶇疆淇℃伅錛屽皢絎竴鏉¤鍙ユ敞閲婃帀錛?br />

#session required /lib/security/pam_limits.so

session required pam_limits.so

閲嶅惎錛岀櫥褰曪紝涓鍒囨甯搞傞棶棰樿В鍐熾?/p>

########################鏇存柊##########################33

浠ヤ笂闂鐨勫嚭鐜版槸鐢變簬鎿嶄綔緋葷粺鐨勯棶棰樸傛垜鏈兂瀹夎32浣峜entos錛岀粨鏋滈敊鎵嬫嬁浜嗕竴涓?4bit Centos瀹夎錛岀劧鍚庢寜鐓?2浣嶇殑閰嶇疆榪涜浜嗛厤緗傛紜厤緗湪64浣嶄笅搴斾負(fù)錛?/p>

   1:  session required /lib64/security/pam_limits.so
   2:   
   3:  session required pam_limits.so


杞嚜錛?div>http://www.zhaofengcao.com/archives/138

鍙跺瓙 2012-01-06 12:35 鍙戣〃璇勮
]]>
/dev/sdc is apparently in use by the system; will not make a filesystem here! http://www.shnenglu.com/elva/archive/2011/11/22/160717.html鍙跺瓙鍙跺瓙Tue, 22 Nov 2011 08:20:00 GMThttp://www.shnenglu.com/elva/archive/2011/11/22/160717.htmlhttp://www.shnenglu.com/elva/comments/160717.htmlhttp://www.shnenglu.com/elva/archive/2011/11/22/160717.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/160717.htmlhttp://www.shnenglu.com/elva/services/trackbacks/160717.htmlRe: /dev/sdc is apparently in use by the system; will not make a filesystem here!
Quote:
Originally Posted by abriejo View Post
Hi

I was about to try the CD startup when I tried one last thing again.

sudo mdadm --stop /dev/md0

It worked, but I find it strange because I did it before and md0 did not appear in the fdisk -l screen.

Immdiately after that I was able to run the sudo mkfs.ext3 /dev/sdc


Maybe it is because I ran the zero-superblock tasks overnight - something that made me nervous, since I have no idea what it does.

Than You for your help!

It worked for me. Thanks!


鍙跺瓙 2011-11-22 16:20 鍙戣〃璇勮
]]>
Linux Signalshttp://www.shnenglu.com/elva/archive/2010/08/11/123050.html鍙跺瓙鍙跺瓙Wed, 11 Aug 2010 04:12:00 GMThttp://www.shnenglu.com/elva/archive/2010/08/11/123050.htmlhttp://www.shnenglu.com/elva/comments/123050.htmlhttp://www.shnenglu.com/elva/archive/2010/08/11/123050.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/123050.htmlhttp://www.shnenglu.com/elva/services/trackbacks/123050.htmlSignals

Linux Signals are:

Signal Name Number Description
SIGHUP 1 Hangup (POSIX)
SIGINT 2 Terminal interrupt (ANSI)
SIGQUIT 3 Terminal quit (POSIX)
SIGILL 4 Illegal instruction (ANSI)
SIGTRAP 5 Trace trap (POSIX)
SIGIOT 6 IOT Trap (4.2 BSD)
SIGBUS 7 BUS error (4.2 BSD)
SIGFPE 8 Floating point exception (ANSI)
SIGKILL 9 Kill(can't be caught or ignored) (POSIX)
SIGUSR1 10 User defined signal 1 (POSIX)
SIGSEGV 11 Invalid memory segment access (ANSI)
SIGUSR2 12 User defined signal 2 (POSIX)
SIGPIPE 13 Write on a pipe with no reader, Broken pipe (POSIX)
SIGALRM 14 Alarm clock (POSIX)
SIGTERM 15 Termination (ANSI)
SIGSTKFLT 16 Stack fault
SIGCHLD 17 Child process has stopped or exited, changed (POSIX)
SIGCONT 18 Continue executing, if stopped (POSIX)
SIGSTOP 19 Stop executing(can't be caught or ignored) (POSIX)
SIGTSTP 20 Terminal stop signal (POSIX)
SIGTTIN 21 Background process trying to read, from TTY (POSIX)
SIGTTOU 22 Background process trying to write, to TTY (POSIX)
SIGURG 23 Urgent condition on socket (4.2 BSD)
SIGXCPU 24 CPU limit exceeded (4.2 BSD)
SIGXFSZ 25 File size limit exceeded (4.2 BSD)
SIGVTALRM 26 Virtual alarm clock (4.2 BSD)
SIGPROF 27 Profiling alarm clock (4.2 BSD)
SIGWINCH 28 Window size change (4.3 BSD, Sun)
SIGIO 29 I/O now possible (4.2 BSD)
SIGPWR 30 Power failure restart (System V)

As noted above, processes can ignore, block, or catch all signals except SIGSTOP and SIGKILL. If a process catches a signal, it means that it includes code that will take appropriate action when the signal is received. If the signal is not caught by the process, the kernel will take default action for the signal.

FIFOs

FIFOs are permanent objects and can be created using the mkfifo(1) or mknod(1) command. Inside the program, the FIFO can be created using the mknod command, then opened and read from or written to just like a normal file. The FIFO is normally in blocking mode when attempting to perform read operations.


寮曠敤鑷細(xì)http://www.comptechdoc.org/os/linux/programming/linux_pgsignals.html



鍦ㄧ粓绔嬌鐢╧ill -l 鍛戒護(hù)鍙互鏄劇ず鎵鏈夌殑淇″彿銆?br> $kill -l
1) SIGHUP
2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

鍏朵腑鍓嶉潰31涓俊鍙蜂負(fù)涓嶅彲闈犱俊鍙?闈炲疄鏃剁殑錛屽彲鑳戒細(xì)鍑虹幇淇″彿鐨勪涪澶?錛屽悗闈㈢殑淇″彿涓哄彲闈犱俊鍙?瀹炴椂鐨剅eal_time,瀵逛俊鍙?br> 鎺掗槦錛屼笉浼?xì)涓㈠?銆?/strong>

1) SIGHUP (鎸傝搗) 褰撹繍琛岃繘紼嬬殑鐢ㄦ埛娉ㄩ攢鏃墮氱煡璇ヨ繘紼嬶紝浣胯繘紼嬬粓姝?/strong>

2) SIGINT (涓柇) 褰撶敤鎴鋒寜涓嬫椂,閫氱煡鍓嶅彴榪涚▼緇勭粓姝㈣繘紼?/strong>

3) SIGQUIT (閫鍑? 鐢ㄦ埛鎸変笅鎴栨椂閫氱煡榪涚▼錛屼嬌榪涚▼緇堟

4) SIGILL (闈炴硶鎸囦護(hù)) 鎵ц浜嗛潪娉曟寚浠わ紝濡傚彲鎵ц鏂囦歡鏈韓鍑虹幇閿欒銆佽瘯鍥炬墽琛屾暟鎹銆佸爢鏍堟孩鍑?/strong>

5) SIGTRAP 鐢辨柇鐐規(guī)寚浠ゆ垨鍏跺畠trap鎸囦護(hù)浜х敓. 鐢眃ebugger浣跨敤

6) SIGABRT (寮傚父涓) 璋冪敤abort鍑芥暟鐢熸垚鐨勪俊鍙?/strong>

7) SIGBUS 闈炴硶鍦板潃, 鍖呮嫭鍐呭瓨鍦板潃瀵歸綈(alignment)鍑洪敊. eg: 璁塊棶涓涓洓涓瓧闀跨殑鏁存暟, 浣嗗叾鍦板潃涓嶆槸4鐨勫嶆暟.

8) SIGFPE (綆楁湳寮傚父) 鍙戠敓鑷村懡綆楁湳榪愮畻閿欒,鍖呮嫭嫻偣榪愮畻閿欒銆佹孩鍑哄強(qiáng)闄ゆ暟涓?.

9) SIGKILL (紜鏉姝? 褰撶敤鎴烽氳繃kill -9鍛戒護(hù)鍚戣繘紼嬪彂閫佷俊鍙鋒椂錛屽彲闈犵殑緇堟榪涚▼

10) SIGUSR1 鐢ㄦ埛浣跨敤

11) SIGSEGV (孌佃秺鐣? 褰撹繘紼嬪皾璇曡闂笉灞炰簬鑷繁鐨勫唴瀛樼┖闂村鑷村唴瀛橀敊璇椂錛岀粓姝㈣繘紼?/strong>

12) SIGUSR2 鐢ㄦ埛浣跨敤

13) SIGPIPE 鍐欒嚦鏃犺榪涚▼鐨勭閬? 鎴栬匰ocket閫氫俊SOCT_STREAM鐨勮榪涚▼宸茬粡緇堟錛岃屽啀鍐欏叆銆?/strong>

14) SIGALRM (瓚呮椂) alarm鍑芥暟浣跨敤璇ヤ俊鍙鳳紝鏃墮挓瀹氭椂鍣ㄨ秴鏃跺搷搴?/strong>

15) SIGTERM (杞腑鏂? 浣跨敤涓嶅甫鍙傛暟鐨刱ill鍛戒護(hù)鏃剁粓姝㈣繘紼?/strong>

17) SIGCHLD (瀛愯繘紼嬬粨鏉? 褰撳瓙榪涚▼緇堟鏃墮氱煡鐖惰繘紼?/strong>

18) SIGCONT (鏆傚仠榪涚▼緇х畫) 璁╀竴涓仠姝?stopped)鐨勮繘紼嬬戶緇墽琛? 鏈俊鍙蜂笉鑳借闃誨.

19) SIGSTOP (鍋滄) 浣滀笟鎺у埗淇″彿,鏆傚仠鍋滄(stopped)榪涚▼鐨勬墽琛? 鏈俊鍙蜂笉鑳借闃誨, 澶勭悊鎴栧拷鐣?

20) SIGTSTP (鏆傚仠/鍋滄) 浜や簰寮忓仠姝俊鍙? Ctrl-Z 鍙戝嚭榪欎釜淇″彿

21) SIGTTIN 褰撳悗鍙頒綔涓氳浠庣敤鎴風(fēng)粓绔鏁版嵁鏃? 緇堢椹卞姩紼嬪簭浜х敓SIGTTIN淇″彿

22) SIGTTOU 褰撳悗鍙頒綔涓氳寰鐢ㄦ埛緇堢鍐欐暟鎹椂, 緇堢椹卞姩紼嬪簭浜х敓SIGTTOU淇″彿

23) SIGURG 鏈?绱ф?鏁版嵁鎴栫綉緇滀笂甯﹀鏁版嵁鍒拌揪socket鏃朵駭鐢?

24) SIGXCPU 瓚呰繃CPU鏃墮棿璧勬簮闄愬埗. 榪欎釜闄愬埗鍙互鐢眊etrlimit/setrlimit鏉ヨ鍙?鏀瑰彉銆?/strong>

25) SIGXFSZ 褰撹繘紼嬩紒鍥炬墿澶ф枃浠朵互鑷充簬瓚呰繃鏂囦歡澶у皬璧勬簮闄愬埗銆?/strong>

26) SIGVTALRM 铏氭嫙鏃墮挓淇″彿. 綾諱技浜嶴IGALRM, 浣嗘槸璁$畻鐨勬槸璇ヨ繘紼嬪崰鐢ㄧ殑CPU鏃墮棿.

27) SIGPROF (姊楁鏃墮棿瓚呮椂) setitimer(2)鍑芥暟璁劇疆鐨勬姒傜粺璁¢棿闅旇鏃跺櫒(profiling interval timer)

28) SIGWINCH 紿楀彛澶у皬鏀瑰彉鏃跺彂鍑?

29) SIGIO(寮傛I/O) 鏂囦歡鎻忚堪絎﹀噯澶囧氨緇? 鍙互寮濮嬭繘琛岃緭鍏?杈撳嚭鎿嶄綔.

30) SIGPWR 鐢墊簮澶辨晥/閲嶅惎鍔?/strong>

31) SIGSYS 闈炴硶鐨勭郴緇熻皟鐢ㄣ?/strong>

鍦ㄤ互涓婂垪鍑虹殑淇″彿涓紝
紼嬪簭涓嶅彲鎹曡幏銆侀樆濉炴垨蹇界暐鐨勪俊鍙鋒湁錛歋IGKILL,SIGSTOP
涓嶈兘鎭㈠鑷抽粯璁ゅ姩浣滅殑淇″彿鏈夛細(xì)SIGILL,SIGTRAP
榛樿浼?xì)瀵艰嚧杩浗E嬫祦浜х殑淇″彿鏈夛細(xì)SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
榛樿浼?xì)瀵艰嚧杩浗E嬮鍑虹殑淇″彿鏈夛細(xì)SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
榛樿浼?xì)瀵艰嚧杩浗E嬪仠姝㈢殑淇″彿鏈夛細(xì)SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
榛樿榪涚▼蹇界暐鐨勪俊鍙鋒湁錛歋IGCHLD,SIGPWR,SIGURG,SIGWINCH

姝ゅ錛孲IGIO鍦⊿VR4鏄鍑猴紝鍦?.3BSD涓槸蹇界暐錛汼IGCONT鍦ㄨ繘紼嬫寕璧鋒椂鏄戶緇紝鍚﹀垯鏄拷鐣ワ紝涓嶈兘琚樆濉炪?/strong>

鍦║nix/Linux涓璼ignal鍑芥暟鏄瘮杈冨鏉傜殑涓涓?鍏跺畾涔夊師鍨嬪涓?
void (*signal(int signo,void (*func)(int))) (int)
榪欎釜鍑芥暟涓?鏈澶栧眰鐨勫嚱鏁頒綋
void (* XXX )(int)琛ㄦ槑鏄竴涓寚閽?鎸囧悜涓涓嚱鏁癤XX鐨勬寚閽?XXX鎵浠h〃鐨勫嚱鏁伴渶瑕佷竴涓猧nt鍨嬬殑鍙傛暟,榪斿洖void
signal(int signo, void(*func)(int))鏄痵ignal鍑芥暟鐨勪富浣?
闇瑕佷袱涓弬鏁癷nt鍨嬬殑signo浠ュ強(qiáng)涓涓寚鍚戝嚱鏁扮殑鍑芥暟.
void (*func)(int).
姝f槸鐢變簬鍏跺鏉傛?鍦╗Plauger 1992]鐢╰ypedef鏉ュ鍏惰繘琛岀畝鍖?br> typedef void Sigfuc(int);//榪欓噷鍙互鐪嬫垚涓涓繑鍥炲?.
鍐嶅signal鍑芥暟榪涜綆鍖栧氨鏄繖鏍風(fēng)殑浜?br> Sigfunc *signal(int,Sigfuc *);


鍦╯ignal.h澶存枃浠朵腑榪樻湁浠ヤ笅鍑犱釜瀹氫箟
#define SIG_ERR (void (*)())-1
#define SIG_DFL (void (*)())0
#define SIG_IGN (void (*)())1


鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?/strong> http://blog.csdn.net/nevercgoodbye/archive/2008/11/25/3367853.aspx





鍙跺瓙 2010-08-11 12:12 鍙戣〃璇勮
]]>
gdb澶氱嚎紼嬭皟璇?http://www.shnenglu.com/elva/archive/2010/08/02/121940.html鍙跺瓙鍙跺瓙Mon, 02 Aug 2010 03:41:00 GMThttp://www.shnenglu.com/elva/archive/2010/08/02/121940.htmlhttp://www.shnenglu.com/elva/comments/121940.htmlhttp://www.shnenglu.com/elva/archive/2010/08/02/121940.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/121940.htmlhttp://www.shnenglu.com/elva/services/trackbacks/121940.html

gdb瀵逛簬澶氱嚎紼嬬▼搴忕殑璋冭瘯鏈夊涓嬬殑鏀寔錛?br>銆銆
銆銆綰跨▼浜х敓閫氱煡錛氬湪浜х敓鏂扮殑綰跨▼鏃? gdb浼?xì)缁欏嚭鎻惤C轟俊鎭?br>銆銆(gdb) r
銆銆Starting program: /root/thread 
銆銆[New Thread 1073951360 (LWP 12900)] 
銆銆[New Thread 1082342592 (LWP 12907)]---浠ヤ笅涓変釜涓烘柊浜х敓鐨勭嚎紼?br>銆銆[New Thread 1090731072 (LWP 12908)]
銆銆[New Thread 1099119552 (LWP 12909)]
銆銆
銆銆鏌ョ湅綰跨▼錛氫嬌鐢╥nfo threads鍙互鏌ョ湅榪愯鐨勭嚎紼嬨?br>銆銆(gdb) info threads
銆銆 4 Thread 1099119552 (LWP 12940) 0xffffe002 in ?? ()
銆銆 3 Thread 1090731072 (LWP 12939) 0xffffe002 in ?? ()
銆銆 2 Thread 1082342592 (LWP 12938) 0xffffe002 in ?? ()
銆銆* 1 Thread 1073951360 (LWP 12931) main (argc=1, argv=0xbfffda04) at thread.c:21
銆銆(gdb) 
銆銆
銆銆
銆銆娉ㄦ剰錛岃棣栫殑钃濊壊鏂囧瓧涓篻db鍒嗛厤鐨勭嚎紼嬪彿錛屽綰跨▼榪涜鍒囨崲鏃訛紝浣跨敤璇ヨ鍙風(fēng)爜錛岃屼笉鏄笂鏂囨爣鍑虹殑緇胯壊鏁板瓧銆?br>銆銆
銆銆鍙﹀錛岃棣栫殑綰㈣壊鏄熷彿鏍囪瘑浜嗗綋鍓嶆椿鍔ㄧ殑綰跨▼
銆銆
銆銆鍒囨崲綰跨▼錛氫嬌鐢?thread THREADNUMBER 榪涜鍒囨崲錛孴HREADNUMBER 涓轟笂鏂囨彁鍒扮殑綰跨▼鍙楓備笅渚嬫樉紺哄皢媧誨姩綰跨▼浠?1 鍒囨崲鑷?4銆?br>銆銆(gdb) info threads
銆銆 4 Thread 1099119552 (LWP 12940) 0xffffe002 in ?? ()
銆銆 3 Thread 1090731072 (LWP 12939) 0xffffe002 in ?? ()
銆銆 2 Thread 1082342592 (LWP 12938) 0xffffe002 in ?? ()
銆銆* 1 Thread 1073951360 (LWP 12931) main (argc=1, argv=0xbfffda04) at thread.c:21
銆銆(gdb) thread 4
銆銆[Switching to thread 4 (Thread 1099119552 (LWP 12940))]#0 0xffffe002 in ?? ()
銆銆(gdb) info threads
銆銆* 4 Thread 1099119552 (LWP 12940) 0xffffe002 in ?? ()
銆銆 3 Thread 1090731072 (LWP 12939) 0xffffe002 in ?? ()
銆銆 2 Thread 1082342592 (LWP 12938) 0xffffe002 in ?? ()
銆銆 1 Thread 1073951360 (LWP 12931) main (argc=1, argv=0xbfffda04) at thread.c:21
銆銆(gdb) 
銆銆
銆銆
銆銆 浠ヤ笂鍗充負(fù)浣跨敤gdb鎻愪緵鐨勫澶氱嚎紼嬭繘琛岃皟璇曠殑涓浜涘熀鏈懡浠ゃ傚彟澶栵紝gdb涔熸彁渚涘綰跨▼鐨勬柇鐐硅緗互鍙?qiáng)瀵规寚瀹氭垨鎵鏈夌嚎紼嬪彂甯冨懡浠ょ殑鍛戒護(hù)銆?br>銆銆
銆銆 鍒濇鎺ヨЕgdb涓嬪綰跨▼鐨勮皟璇曪紝寰寰浼?xì)蹇借gdb涓椿鍔ㄧ嚎紼嬬殑姒傚康銆備竴鑸潵璁詫紝鍦ㄤ嬌鐢╣db璋冭瘯鐨勬椂鍊欙紝鍙湁涓涓嚎紼嬩負(fù)媧誨姩綰跨▼錛屽鏋滃笇鏈涘緱鍒板叾浠栫殑綰跨▼鐨勮緭鍑虹粨鏋滐紝蹇呴』浣跨敤thread鍛戒護(hù)鍒囨崲鑷蟲寚瀹氱殑綰跨▼錛屾墠鑳藉璇ョ嚎紼嬭繘琛岃皟璇曟垨瑙傚療杈撳嚭緇撴灉銆?/p>


鍙跺瓙 2010-08-02 11:41 鍙戣〃璇勮
]]>
time鍛戒護(hù)璇﹁Вhttp://www.shnenglu.com/elva/archive/2009/09/21/96829.html鍙跺瓙鍙跺瓙Mon, 21 Sep 2009 02:43:00 GMThttp://www.shnenglu.com/elva/archive/2009/09/21/96829.htmlhttp://www.shnenglu.com/elva/comments/96829.htmlhttp://www.shnenglu.com/elva/archive/2009/09/21/96829.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/96829.htmlhttp://www.shnenglu.com/elva/services/trackbacks/96829.html

銆愬懡浠ゃ憈ime 鈥?鎵ц鍛戒護(hù)騫惰鏃?/span>

銆愭牸寮忋憈ime [-p] command [arguments...]

銆愯鏄庛?/span>

鎵ц鍛戒護(hù)琛?command [arguments...]"錛屽懡浠よ鎵ц緇撴潫鏃跺湪鏍囧噯杈撳嚭涓墦鍗版墽琛岃鍛戒護(hù)琛岀殑鏃墮棿緇熻緇撴灉錛屽叾緇熻緇撴灉鍖呭惈浠ヤ笅鏁版嵁錛?/font>

1)瀹為檯鏃墮棿(real time): 浠巆ommand鍛戒護(hù)琛屽紑濮嬫墽琛屽埌榪愯緇堟鐨勬秷閫濇椂闂達(dá)紱

2)鐢ㄦ埛CPU鏃墮棿(user CPU time): 鍛戒護(hù)鎵ц瀹屾垚鑺辮垂鐨勭敤鎴稢PU鏃墮棿錛屽嵆鍛戒護(hù)鍦ㄧ敤鎴鋒佷腑鎵ц鏃墮棿鎬誨拰錛?/font>

3)緋葷粺CPU鏃墮棿(system CPU time): 鍛戒護(hù)鎵ц瀹屾垚鑺辮垂鐨勭郴緇烠PU鏃墮棿錛屽嵆鍛戒護(hù)鍦ㄦ牳蹇冩佷腑鎵ц鏃墮棿鎬誨拰銆?/font>

鍏朵腑錛岀敤鎴稢PU鏃墮棿鍜岀郴緇烠PU鏃墮棿涔嬪拰涓篊PU鏃墮棿錛屽嵆鍛戒護(hù)鍗犵敤CPU鎵ц鐨勬椂闂存誨拰銆傚疄闄呮椂闂磋澶т簬CPU鏃墮棿錛屽洜涓篖inux鏄浠誨姟鎿嶄綔緋葷粺錛屽線寰鍦ㄦ墽琛屼竴鏉″懡浠ゆ椂錛岀郴緇熻繕瑕佸鐞嗗叾瀹冧換鍔°?/font>

鍙︿竴涓渶瑕佹敞鎰忕殑闂鏄嵆浣挎瘡嬈℃墽琛岀浉鍚屽懡浠わ紝浣嗘墍鑺辮垂鐨勬椂闂翠篃鏄笉涓鏍鳳紝鍏惰姳璐規(guī)椂闂存槸涓庣郴緇熻繍琛岀浉鍏崇殑銆?/font>

渚?錛?/font>

           1. # time date
             2. Sun Mar 26 22:45:34 GMT-8 2006
             3. 
             4. real    0m0.136s
             5. user    0m0.010s
             6. sys     0m0.070s
             7. #

鍦ㄤ緥1涓紝鎵ц鍛戒護(hù)"time date"(瑙佺1琛?銆傜郴緇熷厛鎵ц鍛戒護(hù)"date"錛岀2琛屼負(fù)鍛戒護(hù)"date"鐨勬墽琛岀粨鏋溿傜3-6琛屼負(fù)鎵ц鍛戒護(hù)"date"鐨勬椂闂寸粺璁$粨鏋滐紝鍏朵腑絎? 琛?real"涓哄疄闄呮椂闂達(dá)紝絎?琛?user"涓虹敤鎴稢PU鏃墮棿錛岀6琛?sys"涓虹郴緇烠PU鏃墮棿銆備互涓婁笁縐嶆椂闂寸殑鏄劇ず鏍煎紡鍧囦負(fù) MMmNN[.FFF]s銆?/font>

鍦ㄤ緥1涓紝CPU鏃墮棿 = 鐢ㄦ埛CPU鏃墮棿 + 緋葷粺CPU鏃墮棿 = 0m0.010s + 0m0.070s = 0m0.080s錛屽疄闄呮椂闂村ぇ浜嶤PU鏃墮棿錛岃鏄庡湪date鍛戒護(hù)榪愯鐨勫悓鏃訛紝榪樻湁鍏跺畠浠誨姟鍦ㄨ繍琛屻?/font>

銆愬弬鏁拌鏄庛?/span>

-p 浠OSIX緙虹渷鐨勬椂闂存牸寮忔墦鍗版椂闂寸粺璁$粨鏋滐紝鍗曚綅涓虹銆傝緇嗙殑杈撳嚭鏍煎紡瑙佷緥2銆?/font>

渚?錛?/font>

            1. # time -p date
             2. Wed Mar 27 00:33:11 GMT-8 2006
             3. real 0.11
             4. user 0.00
             5. sys 0.02
             6. #

鍦ㄤ緥2涓紝鍚屾牱鎵ц鍛戒護(hù)"time date"(瑙佺1琛?銆傜郴緇熷厛鎵ц鍛戒護(hù) "date"錛岀2琛屼負(fù)璇ュ懡浠ょ殑鎵ц緇撴灉銆傜3-5琛屼負(fù)鎵ц鍛戒護(hù)"date"鐨勬椂闂寸粺璁$粨鏋溿傛敞鎰忔湰渚嬬殑鏃墮棿鏍煎紡涓庝緥1涓殑鏃墮棿鏍煎紡宸埆錛屼嬌鐢?p 鍙傛暟鍚庣殑鏃墮棿鏄劇ず鏍煎紡涓篘N.FF錛屽叾鍗曚綅涓虹銆?/font>

銆愮浉鍏崇幆澧冨彉閲忚鏄庛?/span>

TIMEFORMAT 鑷畾涔夎緭鍑虹殑鏃墮棿鏍煎紡銆?/font>

鎴戜滑涔熷彲浠ラ氳繃鐜鍙橀噺TIMEFORMAT鏉ヨ嚜瀹氫箟杈撳嚭鐨勬椂闂存牸寮廩1]銆傛牸寮忎腑浣跨敤鍜屾爣鍑咰涓殑鍑芥暟printf涓鑷寸殑杞箟絎︼紝浠ュ強(qiáng)浣跨敤浠ヤ笅鐨勮漿涔夊簭鍒楁潵鎸囧畾杈撳嚭鐨勬椂闂存牸寮忥細(xì)

&lt;font size=&quot;3&quot;&gt; %[prec][l][RUS]&lt;br&gt;&lt;/font&gt;

鍏朵腑錛岄夐」prec涓烘寚瀹氭椂闂寸簿搴︼紝鍗沖皬鏁扮偣鍚庨潰鐨勪綅鏁幫紱閫夐」l琛ㄧず浣跨敤鍒嗙(鍏蜂綋鏍煎紡涓猴細(xì)MMmNN[.FFF]s)鐨勬牸寮忥紱鏈鍚庝竴涓瓧絎﹁〃紺烘椂闂寸殑綾誨瀷錛屽叾涓璕琛ㄧず瀹為檯鏃墮棿錛孶琛ㄧず鐢ㄦ埛CPU鏃墮棿錛孲琛ㄧず緋葷粺CPU 鏃墮棿錛屽畠浠殑鍗曚綅鍧囦負(fù)縐掋?/font>

time鍛戒護(hù)緙虹渷杈撳嚭鐨勬椂闂存牸寮忓悓 TIMEFORMAT=$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'銆?/font>

浣跨敤-p鍙傛暟鐨則ime鍛戒護(hù)杈撳嚭鐨勬椂闂存牸寮忓悓 TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S'銆?/font>

渚?錛?/font>

             1. # export TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S'
             2. # time date
             3. Wed Mar 27 00:52:03 GMT-8 2006
             4. real 0.04
             5. user 0.00
             6. sys 0.01
             7. #

姣旇緝渚?鍜屼緥3鏄劇ず緇撴灉錛屽緢瀹規(guī)槗鍙戠幇渚?铏界劧娌℃湁浣跨敤鍙傛暟-p錛屼絾鍏惰緭鍑虹殑緇撴灉鍜屼緥2涓妯′竴鏍楓?/font>

褰撶劧錛屾垜浠篃鍙互淇敼涓轟換浣曡嚜宸卞枩嬈㈢殑鏃墮棿鏍煎紡銆?/font>

渚?錛?/font>

             1. # export TIMEFORMAT=$'\nHello, ThinkerABC!\nreal time :       %lR\nuser CUP time :   %lU\nsystem CPU time : %lS'
             2. # time date
             3. Wed Mar 27 01:09:26 GMT-8 2006
             4.
             5. Hello, ThinkerABC!
             6. real time :       0m0.016s
             7. user CUP time :   0m0.006s
             8. system CPU time : 0m0.008s
             9. #

渚?鐨勭4-8琛屾鏄垜浠嚜瀹氫箟鐨勮緭鍑烘牸寮忋?/font>

浠庝互涓婁粙緇嶄簡涓夌鎸囧畾鏃墮棿鏍煎紡鐨勬柟娉曪紝鍗崇己鐪佺殑鏃墮棿鏍煎紡銆佷嬌鐢ㄥ弬鏁?p鐨凱OSIX緙虹渷鐨勬椂闂存牸寮忓拰璁懼畾鐜鍙橀噺TIMEFORMAT鑷畾涔夌殑鏃墮棿鏍煎紡錛孡inux緋葷粺浣跨敤鐨勫厛鍚庨『搴忓涓嬶細(xì)

1.鍙傛暟-p鐨凱OSIX緙虹渷鏃墮棿鏍煎紡錛?/font>

2.鐜鍙橀噺TIMEFORMAT鑷畾涔夌殑鏃墮棿鏍煎紡錛?/font>

3.緙虹渷鐨勬椂闂存牸寮忋?/font>

銆愰鍑虹姸鎬佽鏄庛?/span>

濡傛灉鑳芥墽琛宑ommand鍛戒護(hù)錛屽垯榪斿洖璇ュ懡浠ょ殑閫鍑虹姸鎬侊紝鍚﹀垯榪斿洖濡備笅鐨勯鍑虹姸鎬佸鹼細(xì)

127 鍛戒護(hù)鏈壘鍒?/font>

126 鍛戒護(hù)鎵懼埌錛屼絾涓嶈兘鎵ц

1-125 鍏跺畠閿欒



鍙跺瓙 2009-09-21 10:43 鍙戣〃璇勮
]]>
鍦―ebian涓墦閫犲睘浜庤嚜宸辯殑deb鍖?/title><link>http://www.shnenglu.com/elva/archive/2009/08/25/94373.html</link><dc:creator>鍙跺瓙</dc:creator><author>鍙跺瓙</author><pubDate>Tue, 25 Aug 2009 08:03:00 GMT</pubDate><guid>http://www.shnenglu.com/elva/archive/2009/08/25/94373.html</guid><wfw:comment>http://www.shnenglu.com/elva/comments/94373.html</wfw:comment><comments>http://www.shnenglu.com/elva/archive/2009/08/25/94373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/elva/comments/commentRss/94373.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/elva/services/trackbacks/94373.html</trackback:ping><description><![CDATA[     鎽樿: 闂錛氬鏋滀綘瑕佸湪Debian緋葷粺涓彂甯冧竴嬈捐蔣浠舵垨鑰呬竴涓寘錛岃濡備綍鍋氬憿錛熷鏋滀綘鐨勯」鐩腑鏈夊悇縐嶄簩榪涘埗鍖咃紝璇ュ浣曠淮鎶ゅ憿錛熷鏋滀綘鑷繁鍋氫簡涓嬈懼皬灝忕殑瀹炵敤杞歡錛岃濡備綍涓庢湅鍙嬪垎浜憿錛?#8230;….    妗堜緥錛氬亣濡傛垜浠庣綉涓婁笅杞戒簡eclipse-SDK-3.1-linux-gtk.tar.gz鍘嬬緝鏂囦歡錛屾垜鎯蟲妸浠栧畨瑁呭埌/opt/eclipse鐩綍涓嬶紝涓旇彍鍗旳pps-->...  <a href='http://www.shnenglu.com/elva/archive/2009/08/25/94373.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/elva/aggbug/94373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/elva/" target="_blank">鍙跺瓙</a> 2009-08-25 16:03 <a href="http://www.shnenglu.com/elva/archive/2009/08/25/94373.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title> [Pthread] Linux紼嬪簭璋冭瘯鐨勫熀鐭?浜?--Inside GDB http://www.shnenglu.com/elva/archive/2009/07/25/91148.html鍙跺瓙鍙跺瓙Sat, 25 Jul 2009 09:56:00 GMThttp://www.shnenglu.com/elva/archive/2009/07/25/91148.htmlhttp://www.shnenglu.com/elva/comments/91148.htmlhttp://www.shnenglu.com/elva/archive/2009/07/25/91148.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/91148.htmlhttp://www.shnenglu.com/elva/services/trackbacks/91148.htmlGDB鏄疓NU鍙戝竷鐨勪竴涓己澶х殑紼嬪簭璋冭瘯宸ュ叿錛岀敤浠ヨ皟璇旵/C++紼嬪簭銆傚彲浠ヤ嬌紼嬪簭鍛樺湪紼嬪簭榪愯鐨勬椂鍊欒瀵熺▼搴忓湪鍐呭瓨/瀵勫瓨鍣ㄤ腑鐨勪嬌鐢ㄦ儏鍐點傚畠鐨勫疄鐜頒篃鏄熀浜巔trace緋葷粺璋冪敤鏉ュ畬鎴愮殑銆?br>鍏? 鍘熺悊鏄埄鐢╬trace緋葷粺璋冪敤錛屽湪琚皟璇曠▼搴忓拰gdb涔嬮棿寤虹珛璺熻釜鍏崇郴銆傜劧鍚庢墍鏈夊彂閫佺粰琚皟璇曠▼搴忕殑淇″彿(闄IGKILL)閮戒細(xì)琚玤db鎴幏錛実db 鏍規(guī)嵁鎴幏鐨勪俊鍙鳳紝鏌ョ湅琚皟璇曠▼搴忕浉搴旂殑鍐呭瓨鍦板潃錛屽茍鎺у埗琚皟璇曠殑紼嬪簭緇х畫榪愯銆侴DB甯哥敤鐨勪嬌鐢ㄦ柟娉曟湁鏂偣璁劇疆鍜屽崟姝ヨ窡韙紝鎺ヤ笅鏉ユ垜浠潵鍒嗘瀽涓涓嬩粬浠槸濡? 浣曞疄鐜扮殑銆?br>
3.1 寤虹珛璋冭瘯鍏崇郴
鐢╣db璋冭瘯紼嬪簭錛屽彲浠ョ洿鎺db ./test,涔熷彲浠db <pid>(test鐨勮繘紼嬪彿)銆傝繖瀵瑰簲鐫浣跨敤ptrace寤虹珛璺熻釜鍏崇郴鐨勪袱縐嶆柟寮?
1)fork: 鍒╃敤fork+execve鎵ц琚祴璇曠殑紼嬪簭錛屽瓙榪涚▼鍦ㄦ墽琛宔xecve涔嬪墠璋冪敤ptrace(PTRACE_TRACEME)錛屽緩绔嬩簡涓庣埗榪涚▼(debugger)鐨勮窡韙叧緋匯傚鎴戜滑鍦ㄥ垎鏋恠trace鏃舵墍紺烘剰鐨勭▼搴忋?br>2)attach: debugger鍙互璋冪敤ptrace(PTRACE_ATTACH錛宲id,...)錛屽緩绔嬭嚜宸變笌榪涚▼鍙蜂負(fù)pid鐨勮繘紼嬮棿鐨勮窡韙叧緋匯傚嵆鍒╃敤 PTRACE_ATTACH錛屼嬌鑷繁鍙樻垚琚皟璇曠▼搴忕殑鐖惰繘紼?鐢╬s鍙互鐪嬪埌)銆傜敤attach寤虹珛璧鋒潵鐨勮窡韙叧緋伙紝鍙互璋冪敤ptrace (PTRACE_DETACH錛宲id,...)鏉ヨВ闄ゃ傛敞鎰廰ttach榪涚▼鏃剁殑鏉冮檺闂錛屽涓涓潪root鏉冮檺鐨勮繘紼嬫槸涓嶈兘attach鍒頒竴涓? root榪涚▼涓婄殑銆?br>
3.2 鏂偣鍘熺悊
鏂偣鏄ぇ瀹跺湪璋冭瘯紼嬪簭鏃跺父鐢ㄧ殑涓涓姛鑳?濡俠reak linenumber錛屽綋鎵ц鍒發(fā)inenumber閭d竴琛岀殑鏃跺欒璋冭瘯紼嬪簭浼?xì)鍋滄锛尳{夊緟debugger鐨勮繘涓姝ユ搷浣溿?
鏂偣鐨勫疄鐜板師鐞嗭紝灝辨槸鍦ㄦ寚瀹氱殑浣嶇疆鎻掑叆鏂偣鎸囦護(hù)錛屽綋琚皟璇曠殑紼嬪簭榪愯鍒版柇鐐圭殑鏃跺欙紝浜х敓SIGTRAP淇″彿銆傝淇″彿琚玤db鎹曡幏騫惰繘琛屾柇鐐瑰懡涓垽瀹氾紝褰揼db鍒ゆ柇鍑鴻繖嬈IGTRAP鏄柇鐐瑰懡涓箣鍚庡氨浼?xì)铦{鍏ョ瓑寰呯敤鎴瘋緭鍏ヨ繘琛屼笅涓姝ュ鐞嗭紝鍚﹀垯緇х畫銆?br>鏂偣鐨勮緗師鐞? 鍦ㄧ▼搴忎腑璁劇疆鏂偣錛屽氨鏄厛灝嗚浣嶇疆鐨勫師鏉ョ殑鎸囦護(hù)淇濆瓨錛岀劧鍚庡悜璇ヤ綅緗啓鍏nt 3銆傚綋鎵ц鍒癷nt 3鐨勬椂鍊欙紝鍙戠敓杞腑鏂紝鍐呮牳浼?xì)缁欏瓙杩浗E嬪彂鍑篠IGTRAP淇″彿錛屽綋鐒惰繖涓俊鍙蜂細(xì)琚漿鍙戠粰鐖惰繘紼嬨傜劧鍚庣敤淇濆瓨鐨勬寚浠ゆ浛鎹nt3,絳夊緟鎭㈠榪愯銆?br>鏂偣鍛戒腑鍒ゅ畾:gdb鎶婃墍鏈夌殑鏂偣浣嶇疆閮藉瓨鏀懼湪涓涓摼琛ㄤ腑錛屽懡涓垽瀹氬嵆鎶婅璋冭瘯紼嬪簭褰撳墠鍋滄鐨勪綅緗拰閾捐〃涓殑鏂偣浣嶇疆榪涜姣旇緝錛岀湅鏄柇鐐逛駭鐢熺殑淇″彿錛岃繕鏄棤鍏充俊鍙楓?br>
3.3 鍗曟璺熻釜鍘熺悊
鍗曟璺熻釜灝辨槸鎸囧湪璋冭瘯紼嬪簭鐨勬椂鍊欙紝璁╃▼搴忚繍琛屼竴鏉℃寚浠?璇彞鍚庡氨鍋滀笅銆侴DB涓父鐢ㄧ殑鍛戒護(hù)鏈塶ext, step, nexti, stepi銆傚崟姝ヨ窡韙張甯稿垎涓鴻鍙ュ崟姝?next, step)鍜屾寚浠ゅ崟姝?濡俷exti, stepi)銆?br>
鍦╨inux涓婏紝鎸囦護(hù)鍗曟鍙互閫氳繃ptrace鏉ュ疄鐜般傝皟鐢╬trace(PTRACE_SINGLESTEP,pid,...)鍙互浣胯璋冭瘯鐨勮繘紼嬪湪姣忔墽琛屽畬涓鏉℃寚浠ゅ悗灝辮Е鍙戜竴涓猄IGTRAP淇″彿錛岃GDB榪愯銆備笅闈㈡潵鐪嬩竴涓緥瀛?
    child = fork();
    if(child == 0) {
         execl("./HelloWorld", "HelloWorld", NULL);
    }
    else {
        ptrace(PTRACE_ATTACH,child,NULL,NULL);
        while(1){
        wait(&val);
        if(WIFEXITED(val))
            break;
        count++;
        ptrace(PTRACE_SINGLESTEP,child,NULL,NULL);
        }
    printf("Total Instruction number= %d\n",count);
    }
榪? 孌電▼搴忔瘮杈冪畝鍗曪紝瀛愯繘紼嬭皟鐢╡xecve鎵цHelloWorld,鑰岀埗榪涚▼鍒欏厛璋冪敤ptrace(PTRACE_ATTACH,pid,...)寤虹珛涓? 瀛愯繘紼嬬殑璺熻釜鍏崇郴銆傜劧鍚庤皟鐢╬trace(PTRACE_SINGLESTEP, pid, ...)璁╁瓙榪涚▼涓姝ヤ竴鍋滐紝浠ョ粺璁″瓙榪涚▼涓鍏辨墽琛屼簡澶氬皯鏉℃寚浠?浣犱細(xì)鍙戠幇涓涓畝鍗曠殑HelloWorld瀹為檯涓婁篃鎵ц浜嗗ソ鍑犱竾鏉℃寚浠ゆ墠瀹屾垚)銆傚綋鐒朵綘涔熷畬 鍏ㄥ彲浠ュ湪榪欎釜鏃跺欐煡鐪婨IP瀵勫瓨鍣ㄤ腑瀛樻斁鐨勬寚浠わ紝鎴栬呮煇涓彉閲忕殑鍊鹼紝褰撶劧鍓嶆彁鏄綘寰楃煡閬撹繖涓彉閲忓湪瀛愯繘紼嬪唴瀛橀暅鍍忎腑鐨勪綅緗?br>鎸囦護(hù)鍗曟鍙互渚濋潬紜歡 瀹屾垚錛屽x86鏋舵瀯澶勭悊鍣ㄦ敮鎸佸崟姝ユā寮?閫氳繃璁劇疆EFLAGS瀵勫瓨鍣ㄧ殑TF鏍囧織瀹炵幇)錛屾瘡鎵ц涓鏉℃寚浠わ紝灝變細(xì)浜х敓涓嬈″紓甯?鍦↖ntel 80386浠ヤ笂鐨勫鐞嗗櫒涓婅繕鎻愪緵浜咲Rx璋冭瘯瀵勫瓨鍣ㄤ互鐢ㄤ簬杞歡璋冭瘯)銆備篃鍙互閫氳繃杞歡瀹屾垚錛屽嵆鍦ㄦ瘡鏉℃寚浠ゅ悗闈㈤兘鎻掑叆涓鏉℃柇鐐規(guī)寚浠わ紝榪欐牱姣忔墽琛屼竴鏉℃寚浠ら兘浼? 浜х敓涓嬈¤蔣涓柇銆?br>璇彞鍗曟鍩轟簬鎸囦護(hù)鍗曟瀹炵幇錛屽嵆GDB綆楀ソ姣忔潯璇彞鎵瀵瑰簲鐨勬寚浠わ紝浠庝粈涔堝湴鏂瑰紑濮嬪埌浠涔堝湴鏂圭粨鏉熴傜劧鍚庡湪緇撴潫鐨勫湴鏂規(guī)彃鍏ユ柇鐐癸紝鎴栬呮寚浠ゅ崟姝ヤ竴姝ヤ竴姝ョ殑璧板埌緇撴潫鐐癸紝鍐嶈繘琛屽鐞嗐?br>
褰? 鐒秅db鐨勫疄鐜拌繙姣斾粖澶╂垜浠墍璇寸殑鍐呭瑕佸鏉傦紝瀹冭兘璁╂垜浠緢瀹規(guī)槗鐨勭洃嫻嬶紝淇敼琚皟璇曠殑榪涚▼錛屾瘮濡傞氳繃琛屽彿錛屽嚱鏁板悕錛屽彉閲忓悕銆傝岃鐪熸瀹炵幇榪欎簺錛屼竴鏄渶瑕佸湪 緙栬瘧鐨勬椂鍊欐彁渚涜凍澶熺殑淇℃伅錛屽鍦╣cc鏃跺姞鍏?g閫夐」錛岃繖鏍穏cc浼?xì)鎶婁竴浜涚▼搴忎俊鎭斁鍒扮敓鎴愮殑ELF鏂囦歡涓紝鍖呮嫭鍑芥暟絎﹀彿琛紝琛屽彿錛屽彉閲忎俊鎭紝瀹忓畾涔夌瓑錛? 浠ヤ究鏃ュ悗gdb璋冭瘯錛屽綋鐒剁敓鎴愮殑鏂囦歡涔熶細(xì)澶т竴浜涖備簩鏄渶瑕佹垜浠ELF鏂囦歡鏍煎紡錛岃繘紼嬬殑鍐呭瓨闀滃儚(甯冨眬)浠ュ強(qiáng)紼嬪簭鐨勬寚浠ょ爜鍗佸垎鐔熸?zhèn)夈傝繖鏍鋒墠鑳戒繚璇佸湪姝g‘鐨? 鏃舵満(鏂偣鍙戠敓錛熷崟姝ワ紵)鎵懼埌姝g‘鐨勫唴瀛樺湴鍧(浠g爜錛熸暟鎹紵)騫墮摼鎺ュ洖姝g‘鐨勭▼搴忎唬鐮?榪欐槸鍝釜鍙橀噺錛熺▼搴忕鍑犺錛?銆傛劅鍏磋叮鐨勫悓瀛﹀彲浠ユ壘鍒扮浉搴旂殑浠g爜浠? 緇嗗垎鏋愪竴涓嬨?br>
灝忕粨:
ptrace鍙互瀹炴椂鐩戞祴鍜屼慨鏀瑰彟涓涓繘紼嬬殑榪愯錛屽畠鏄姝ょ殑寮哄ぇ浠ヨ嚦浜庢浘緇忓洜涓哄畠鍦╱nix-like騫沖彴 (濡侺inux, *BSD)涓婁駭鐢熶簡鍚勭婕忔礊銆備絾鎹㈣█涔嬶紝鍙鎴戜滑鑳芥帉鎻″畠鐨勪嬌鐢紝灝辮兘寮鍙戝嚭寰堝浠ュ墠鍦ㄧ敤鎴鋒佷笅涓嶅彲鑳藉疄鐜扮殑搴旂敤銆傚綋鐒惰繖鍙兘闇瑕佹垜浠帉鎻$紪璇戯紝鏂囦歡鏍? 寮忥紝紼嬪簭鍐呭瓨甯冨眬絳夌浉褰撳鐨勫簳灞傜煡璇嗐?br>
鏈鍚庤鎴戜滑鏉ュ洖欏句竴涓媝trace鐨勪嬌鐢?
1)鐢≒TRACE_ATTACH鎴栬匬TRACE_TRACEME 寤虹珛榪涚▼闂寸殑璺熻釜鍏崇郴銆?br>2)PTRACE_PEEKTEXT, PTRACE_PEEKDATA, PTRACE_PEEKUSR絳夎鍙栧瓙榪涚▼鍐呭瓨/瀵勫瓨鍣ㄤ腑淇濈暀鐨勫箋?br>3)PTRACE_POKETEXT, PTRACE_POKEDATA, PTRACE_POKEUSR絳夋妸鍊煎啓鍏ュ埌琚窡韙繘紼嬬殑鍐呭瓨/瀵勫瓨鍣ㄤ腑銆?br>4)鐢≒TRACE_CONT錛孭TRACE_SYSCALL, PTRACE_SINGLESTEP鎺у埗琚窡韙繘紼嬩互浣曠鏂瑰紡緇х畫榪愯銆?br>5)PTRACE_DETACH, PTRACE_KILL 鑴辯榪涚▼闂寸殑璺熻釜鍏崇郴銆?br>
TIPS:
    1. 榪涚▼鐘舵乀ASK_TRACED鐢ㄤ互琛ㄧず褰撳墠榪涚▼鍥犱負(fù)琚埗榪涚▼璺熻釜鑰岃緋葷粺鍋滄銆?br>    2. 濡傚湪瀛愯繘紼嬬粨鏉熷墠錛岀埗榪涚▼緇撴潫錛屽垯trace鍏崇郴瑙i櫎銆?br>    3. 鍒╃敤attach寤虹珛璧鋒潵鐨勮窡韙叧緋伙紝铏界劧ps鐪嬪埌鍙屾柟涓虹埗瀛愬叧緋伙紝浣嗗湪"瀛愯繘紼?涓皟鐢╣etppid()浠嶄細(xì)榪斿洖鍘熸潵鐨勭埗榪涚▼id銆?br>    4. 涓嶈兘attach鍒拌嚜宸變笉鑳借窡韙殑榪涚▼錛屽non-root榪涚▼璺熻釜root榪涚▼銆?br>    5. 宸茬粡琚玹race鐨勮繘紼嬶紝涓嶈兘鍐嶆琚玜ttach銆?br>    6. 鍗充嬌鏄敤PTRACE_TRACEME寤虹珛璧鋒潵鐨勮窡韙叧緋伙紝涔熷彲浠ョ敤DETACH鐨勬柟寮忎簣浠ヨВ闄ゃ?br>    7. 鍥犱負(fù)榪涘叆/閫鍑虹郴緇熻皟鐢ㄩ兘浼?xì)瑙﹀彂涓嬈IGTRAP錛屾墍浠ラ氬父鐨勫仛娉曟槸鍦ㄧ涓嬈?榪涘叆)鐨勬椂鍊欒鍙栫郴緇熻皟鐢ㄧ殑鍙傛暟錛屽湪絎簩嬈?閫鍑?鐨勬椂鍊欒鍙栫郴緇熻皟鐢ㄧ殑榪斿洖鍊箋備絾娉ㄦ剰execve鏄釜渚嬪銆?br>    8. 紼嬪簭璋冭瘯鏃剁殑鏂偣鐢眎nt 3璁劇疆瀹屾垚錛岃屽崟姝ヨ窡韙垯鍙敱ptrace(PTRACE_SINGLESTEP)瀹炵幇銆?br>   
Pthread 08/01/14

鍘熸枃鍦板潃錛歨ttp://blog.csdn.net/Javadino/archive/2008/09/06/2891434.aspx


鍙跺瓙 2009-07-25 17:56 鍙戣〃璇勮
]]>
[Pthread] Linux涓婄▼搴忚皟璇曠殑鍩虹煶(涓)--ptracehttp://www.shnenglu.com/elva/archive/2009/07/25/91147.html鍙跺瓙鍙跺瓙Sat, 25 Jul 2009 09:55:00 GMThttp://www.shnenglu.com/elva/archive/2009/07/25/91147.htmlhttp://www.shnenglu.com/elva/comments/91147.htmlhttp://www.shnenglu.com/elva/archive/2009/07/25/91147.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/91147.htmlhttp://www.shnenglu.com/elva/services/trackbacks/91147.html1.鍦↙inux緋葷粺涓紝榪涚▼鐘舵侀櫎浜嗘垜浠墍鐔熺煡鐨凾ASK_RUNNING錛孴ASK_INTERRUPTIBLE錛孴ASK_STOPPED絳夛紝榪樻湁涓涓猅ASK_TRACED銆傝繖琛ㄦ槑榪欎釜榪涚▼澶勪簬浠涔堢姸鎬侊紵
2.strace鍙互鏂逛究鐨勫府鍔╂垜浠褰曡繘紼嬫墍鎵ц鐨勭郴緇熻皟鐢紝瀹冩槸濡備綍璺熻釜鍒拌繘紼嬫墽琛岀殑錛?br>3.gdb鏄垜浠皟璇曠▼搴忕殑鍒╁櫒錛屽彲浠ヨ緗柇鐐癸紝鍗曟璺熻釜紼嬪簭銆傚畠鐨勫疄鐜板師鐞嗗張鏄粈涔堬紵

鎵鏈夎繖涓鍒囩殑鑳屽悗閮介殣钘忕潃Linux鎵鎻愪緵鐨勪竴涓己澶х殑緋葷粺璋冪敤ptrace().

1.ptrace緋葷粺璋冪敤
ptrace 緋葷粺璋冧粠鍚嶅瓧涓婄湅鏄敤浜庤繘紼嬭窡韙殑錛屽畠鎻愪緵浜嗙埗榪涚▼鍙互瑙傚療鍜屾帶鍒跺叾瀛愯繘紼嬫墽琛岀殑鑳藉姏錛屽茍鍏佽鐖惰繘紼嬫鏌ュ拰鏇挎崲瀛愯繘紼嬬殑鍐呮牳闀滃儚(鍖呮嫭瀵勫瓨鍣?鐨勫箋傚叾鍩? 鏈師鐞嗘槸: 褰撲嬌鐢ㄤ簡ptrace璺熻釜鍚庯紝鎵鏈夊彂閫佺粰琚窡韙殑瀛愯繘紼嬬殑淇″彿(闄や簡SIGKILL)錛岄兘浼?xì)琚浆鍙懢l欑埗榪涚▼錛岃屽瓙榪涚▼鍒欎細(xì)琚樆濉烇紝榪欐椂瀛愯繘紼嬬殑鐘舵佸氨浼?xì)琚? 緋葷粺鏍囨敞涓篢ASK_TRACED銆傝岀埗榪涚▼鏀跺埌淇″彿鍚庯紝灝卞彲浠ュ鍋滄涓嬫潵鐨勫瓙榪涚▼榪涜媯鏌ュ拰淇敼錛岀劧鍚庤瀛愯繘紼嬬戶緇繍琛屻?nbsp;   
    鍏跺師鍨嬩負(fù)錛?nbsp;   
    #include <sys/ptrace.h>
    long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
    ptrace鏈夊洓涓弬鏁?
    1). enum __ptrace_request request錛氭寚紺轟簡ptrace瑕佹墽琛岀殑鍛戒護(hù)銆?br>    2). pid_t pid: 鎸囩ずptrace瑕佽窡韙殑榪涚▼銆?br>    3). void *addr: 鎸囩ず瑕佺洃鎺х殑鍐呭瓨鍦板潃銆?br>    4). void *data: 瀛樻斁璇誨彇鍑虹殑鎴栬呰鍐欏叆鐨勬暟鎹?br>ptrace鏄姝ょ殑寮哄ぇ錛屼互鑷充簬鏈夊緢澶氬ぇ瀹舵墍甯哥敤鐨勫伐鍏烽兘鍩轟簬ptrace鏉ュ疄鐜幫紝濡俿trace鍜実db銆傛帴涓嬫潵錛屾垜浠熺敱瀵箂trace鍜実db鐨勫疄鐜幫紝鏉ョ湅鐪媝trace鏄浣曚嬌鐢ㄧ殑銆?br>
2. strace鐨勫疄鐜?br>strace甯稿父琚敤鏉ユ嫤鎴拰璁板綍榪涚▼鎵鎵ц鐨勭郴緇熻皟鐢紝浠ュ強(qiáng)榪涚▼鎵鏀跺埌鐨勪俊鍙楓傚鏈夎繖涔堜竴孌電▼搴忥細(xì)
HelloWorld.c:
#include <stdio.h>
int main(){
    printf("Hello World!\n");
    return 0;
}
緙栬瘧鍚庯紝鐢╯trace璺熻釜錛?strace ./HelloWorld
鍙互鐪嬪埌褰㈠:
execve("./HelloWorld", ["./HelloWorld"], [/* 67 vars */]) = 0
brk(0)                                  = 0x804a000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f18000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/home/supperman/WorkSpace/lib/tls/i686/sse2/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
...
鐨勪竴孌佃緭鍑猴紝榪欏氨鏄湪鎵цHelloWorld涓紝緋葷粺鎵鎵ц鐨勭郴緇熻皟鐢紝浠ュ強(qiáng)浠栦滑鐨勮繑鍥炲箋?br>
涓嬮潰鎴戜滑鐢╬trace鏉ョ爺絀朵竴涓嬪畠鏄庝箞瀹炵幇鐨勩?br>...
    switch(pid = fork())
    {
    case -1:
        return -1;
    case 0: //瀛愯繘紼?br>        ptrace(PTRACE_TRACEME,0,NULL,NULL);
        execl("./HelloWorld", "HelloWorld", NULL);
    default: //鐖惰繘紼?br>        wait(&val); //絳夊緟騫惰褰昬xecve
        if(WIFEXITED(val))
            return 0;
        syscallID=ptrace(PTRACE_PEEKUSER, pid, ORIG_EAX*4, NULL);
        printf("Process executed system call ID = %ld\n",syscallID);
        ptrace(PTRACE_SYSCALL,pid,NULL,NULL);
        while(1)
        {
            wait(&val); //絳夊緟淇″彿
            if(WIFEXITED(val)) //鍒ゆ柇瀛愯繘紼嬫槸鍚﹂鍑?br>                return 0;
            if(flag==0) //絎竴嬈?榪涘叆緋葷粺璋冪敤)錛岃幏鍙栫郴緇熻皟鐢ㄧ殑鍙傛暟
            {
                syscallID=ptrace(PTRACE_PEEKUSER, pid, ORIG_EAX*4, NULL);
                printf("Process executed system call ID = %ld ",syscallID);
                flag=1;
            }
            else //絎簩嬈?閫鍑虹郴緇熻皟鐢?錛岃幏鍙栫郴緇熻皟鐢ㄧ殑榪斿洖鍊?br>            {
                returnValue=ptrace(PTRACE_PEEKUSER, pid, EAX*4, NULL);
                printf("with return value= %ld\n", returnValue);
                flag=0;
            }
            ptrace(PTRACE_SYSCALL,pid,NULL,NULL);
        }
    }
...

鍦? 涓婇潰鐨勭▼搴忎腑錛宖ork鍑虹殑瀛愯繘紼嬪厛璋冪敤浜唒trace(PTRACE_TRACEME)琛ㄧず瀛愯繘紼嬭鐖惰繘紼嬭窡韙嚜宸便傜劧鍚庡瓙榪涚▼璋冪敤execl鍔犺澆鎵ц 浜咹elloWorld銆傝屽湪鐖惰繘紼嬩腑鍒欎嬌鐢╳ait緋葷粺璋冪敤絳夊緟瀛愯繘紼嬬殑鐘舵佹敼鍙樸傚瓙榪涚▼鍥犱負(fù)璁劇疆浜哖TRACE_TRACEME鑰屽湪鎵ц緋葷粺璋冪敤琚郴 緇熷仠姝?璁劇疆涓篢ASK_TRACED)錛岃繖鏃剁埗榪涚▼琚敜閱掞紝浣跨敤ptrace(PTRACE_PEEKUSER,pid,...)鍒嗗埆鍘昏鍙栧瓙榪涚▼鎵ц 鐨勭郴緇熻皟鐢↖D(鏀懼湪ORIG_EAX涓?浠ュ強(qiáng)緋葷粺璋冪敤榪斿洖鏃剁殑鍊?鏀懼湪EAX涓?銆傜劧鍚庝嬌鐢╬trace(PTRACE_SYSCALL, pid,...)鎸囩ず瀛愯繘紼嬭繍琛屽埌涓嬩竴嬈℃墽琛岀郴緇熻皟鐢ㄧ殑鏃跺?榪涘叆鎴栬呴鍑?錛岀洿鍒板瓙榪涚▼閫鍑轟負(fù)姝€?br>
紼嬪簭鐨勬墽琛岀粨鏋滃涓?
Process executed system call ID = 11
Process executed system call ID = 45 with return value= 134520832
Process executed system call ID = 192 with return value= -1208934400
Process executed system call ID = 33 with return value= -2
Process executed system call ID = 5 with return value= -2
...
鍏? 涓紝11鍙風(fēng)郴緇熻皟鐢ㄥ氨鏄痚xecve錛?5鍙鋒槸brk,192鏄痬map2,33鏄痑ccess,5鏄痮pen...緇忚繃姣斿鍙互鍙戠幇錛屽拰strace鐨? 杈撳嚭緇撴灉涓鏍楓傚綋鐒秙trace榪涜浜嗘洿璇﹀敖鍜屽畬鍠勭殑澶勭悊錛屾垜浠繖閲屽彧鏄彮紺哄叾鍘熺悊錛屾劅鍏磋叮鐨勫悓瀛﹀彲浠ュ幓鐮旂┒涓涓媠trace鐨勫疄鐜般?br>
PS:
    1). 鍦ㄧ郴緇熻皟鐢ㄦ墽琛岀殑鏃跺欙紝浼?xì)鎵цpushl %eax # 淇濆瓨緋葷粺璋冪敤鍙稯RIG_EAX鍦ㄧ▼搴忕敤鎴鋒爤涓?br>    2). 鍦ㄧ郴緇熻皟鐢ㄨ繑鍥炵殑鏃跺欙紝浼?xì)鎵цmovl %eax,EAX(%esp)灝嗙郴緇熻皟鐢ㄧ殑榪斿洖鍊兼斁鍏ュ瘎瀛樺櫒%eax涓?br>    3). WIFEXITED()瀹忕敤鏉ュ垽鏂瓙榪涚▼鏄惁涓烘甯擱鍑虹殑錛屽鏋滄槸錛屽畠浼?xì)杩斿洖涓涓潪闆跺箋?br>    4). 琚窡韙殑紼嬪簭鍦ㄨ繘鍏ユ垨鑰呴鍑烘煇嬈$郴緇熻皟鐢ㄧ殑鏃跺欓兘浼?xì)瑙﹀彂涓涓猄IGTRAP淇″彿錛岃岃鐖惰繘紼嬫崟鑾楓?br>    5). execve()緋葷粺璋冪敤鎵ц鎴愬姛鐨勬椂鍊欏茍娌℃湁榪斿洖鍊鹼紝鍥犱負(fù)瀹冨紑濮嬫墽琛屼竴孌墊柊鐨勭▼搴忥紝騫舵病鏈?榪斿洖"鐨勬蹇點傚け璐ョ殑鏃跺欎細(xì)榪斿洖-1銆?br>    6). 鍦ㄧ埗榪涚▼榪涜榪涜鎿嶄綔鐨勬椂鍊欙紝鐢╬s鏌ョ湅錛屽彲浠ョ湅鍒板瓙榪涚▼鐨勭姸鎬佷負(fù)T,琛ㄧず瀛愯繘紼嬪浜嶵ASK_TRACED鐘舵併傚綋鐒朵負(fù)浜嗘洿鍏鋒搷浣滄э紝浣犲彲浠ュ湪鐖惰繘紼嬩腑鍔犲叆sleep()銆?br>
(To Be Continued)

Pthread  08/01/13

鍘熸枃鍦板潃錛歨ttp://blog.csdn.net/Javadino/archive/2008/09/06/2891413.aspx


鍙跺瓙 2009-07-25 17:55 鍙戣〃璇勮
]]>
Ptrace鍙?qiáng)鍏跺懡渥o(hù)http://www.shnenglu.com/elva/archive/2009/07/25/91146.html鍙跺瓙鍙跺瓙Sat, 25 Jul 2009 09:52:00 GMThttp://www.shnenglu.com/elva/archive/2009/07/25/91146.htmlhttp://www.shnenglu.com/elva/comments/91146.htmlhttp://www.shnenglu.com/elva/archive/2009/07/25/91146.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/91146.htmlhttp://www.shnenglu.com/elva/services/trackbacks/91146.html鍦ㄧ敤鎴鋒ā寮忎腑錛岃櫧鐒跺彧鏈変竴涓嚱鏁板彲鐢紝鍗?/span>ptrace(int _request, pid_t _pid, caddr_t _addr, int _data)錛屼絾鏄繖涓嚱鏁拌兘鍋氭墍鏈夌殑浜嬫儏錛佸鏋滀綘鎰挎剰錛屼篃鍙互鑺辮垂鍑犱釜灝忔椂鏉ョ紪鍐欒嚜宸辯殑灝忚皟璇曞櫒錛屼互瑙e喅鐗瑰畾鐨勯棶棰樸?/span>

ptrace鍑芥暟鐨?/span>_request鍙傛暟鏄渶閲嶈鐨勪竴涓弬鏁幫紝鍥犱負(fù)瀹冪‘瀹氫綘灝嗗仛浠涔堛?/span>BSD鍜?/span>Linux鐨勫ご鏂囦歡浣跨敤涓嶅悓鐨勫畾涔夛紝榪欎嬌寰楀皢ptrace搴旂敤浠庝竴涓鉤鍙扮Щ妞嶅埌鍙︿竴涓鉤鍙板彉寰楀緢澶嶆潅銆傞粯璁ゅ湴錛屾垜浠嬌鐢?/span>BSD澶存枃浠朵腑鐨勫畾涔夈?/span>

r  PT_TRACE_ME錛?/span>PTRACE_TRACEME錛夊皢褰撳墠榪涚▼鍒囨崲鍒板仠姝㈢姸鎬併傚畠閫氬父鎬繪槸涓?/span>fork/exec涓璧蜂嬌鐢紝铏界劧涔熻兘閬囧埌鑷垜榪借釜鐨勫簲鐢ㄧ▼搴忋傚浜庢瘡涓涓繘紼嬶紝PT_TRACE_ME鍙兘琚皟鐢ㄤ竴嬈°傝拷韙竴涓琚拷韙殑榪涚▼鏄細(xì)澶辮觸鐨勶紙鍙︿竴涓緝涓嶉噸瑕佺殑緇撴灉鏄繘紼嬩笉鑳借拷韙畠鑷繁銆傚鏋滆榪欐牱鍋氾紝搴旇棣栧厛浠庤嚜韜淳鐢熶竴涓繘紼嬶級銆傚ぇ閲忕殑鍙嶈皟璇曟妧鏈兘鏄互榪欎竴浜嬪疄涓哄熀紜鐨勩備負(fù)浜嗗厠鏈嶈繖綾繪妧鏈紝蹇呴』浣跨敤緇曡繃ptrace鐨勮皟璇曞櫒銆備竴涓俊鍙瘋鍙戦佸埌姝h璋冭瘯鐨勮繘紼嬶紝騫跺皢璇ヨ繘紼嬪垏鎹㈠埌鍋滄鐘舵侊紝璇ヨ繘紼嬪彲浠ヤ嬌鐢ㄤ粠鐖惰繘紼嬩笂涓嬫枃涓皟鐢ㄧ殑PT_CONTINUE鍜?/span>PT_STEP鍛戒護(hù)浠庡仠姝㈢姸鎬侀鍑恒?/span>wait鍑芥暟浼?xì)鍤g榪熺埗榪涚▼鐨勬墽琛岋紝鐩村埌琚皟璇曠殑榪涚▼鍒囨崲涓哄仠姝㈢姸鎬佹垨鑰呯粓姝負(fù)姝紙緇堟鏃訛紝榪斿洖鍊間負(fù)1407錛夈傚叾浠栫殑鎵鏈夊弬鏁?span style="letter-spacing: 0.1pt;">閮借蹇界暐銆?/span>

r  PT_ATTACH錛?/span>PTRACE_ATTACH錛?/span>灝嗚繘紼嬫爣蹇椾負(fù)pid鐨勮繍琛岃繘紼嬪垏鎹負(fù)鍋滄鐘舵侊紝鍦ㄨ繖縐嶆儏褰笅錛岃皟璇曞櫒榪涚▼鎴愪負(fù)“鐖惰繘紼?#8221;銆傚叾浠栫殑鎵鏈夊弬鏁伴兘琚拷鐣ャ傝繘紼嬪繀欏誨叿鏈変笌璋冭瘯榪涚▼鐩稿悓鐨勭敤鎴鋒爣蹇楋紙UID錛夛紝騫朵笖涓嶈兘鏄?/span>setuid/setduid榪涚▼錛堝惁鍒欏氨瑕佺敤root鏉ヨ皟璇曪級銆?/span>

r  PT_DETACH錛?/span>PTRACE_DETACH錛?/span>鍋滄榪涚▼鏍囧織涓?/span>pid榪涚▼錛堢敱PT_ATTACH鍜?/span>PT_TRACE_ME鎸囧畾錛夌殑璋冭瘯錛屽茍緇х畫鍏跺父鎬佽繍琛屻傚叾浠栫殑鎵鏈夊弬鏁伴兘琚拷鐣ャ?/span>

r  PT_CONTINUE錛?/span>PTRACE_CONT錛?/span>緇х畫榪涚▼鏍囧織涓?/span>pid鐨勮璋冭瘯榪涚▼鐨勬墽琛岋紝鑰屼笉涓柇涓庤皟璇曞櫒榪涚▼鐨勯氫俊銆傚鏋?/span>addr 錛濓紳 1錛堝湪Linux涓負(fù)0錛夛紝浠庝笂嬈″仠姝㈢殑鍦板潃緇х畫鎵ц錛涘惁鍒欙紝浠庢寚瀹氱殑鍦板潃緇х畫鎵ц銆傚弬鏁?/span>_data鎸囧畾鍙戦佸埌琚皟璇曡繘紼嬬殑淇″彿鏁伴噺錛堥浂璇存槑娌℃湁淇″彿錛夈?/span>

r  PT_STEP錛?/span>PTRACE_SINGLESTEP錛?/span>榪涜榪涚▼鏍囧織涓?/span>pid鐨勮繘紼嬬殑鍗曟鎵ц錛屽嵆鎵ц涓嬩竴鏉℃満鍣ㄦ寚浠ゅ茍鍒囨崲涓哄仠姝㈢姸鎬侊紙鍦?/span>i386涓紝榪欐槸鏍規(guī)嵁璁劇疆榪借釜鏍囧織鏉ュ疄鐜?span style="letter-spacing: -0.1pt;">鐨勶紝铏界劧鏈変簺“榛戝”鍑芥暟搴撲嬌鐢ㄧ‖浠舵柇鐐癸級銆?/span>BSD瑕佹眰灝嗗弬鏁?/span>addr緗負(fù)1錛岃?/span>Linux瑕佹眰灝嗚鍙傛暟緗負(fù)0銆傚叾浠栫殑鎵鏈夊弬鏁伴兘琚拷鐣ャ?/span>

r  PT_READ_I鍜?/span>PT_READ_D錛?/span>PTRACE_PEEKTEXT鍜?/span>PTRACE_PEEKDATA錛夊垎鍒粠浠g爜鍖哄拰姝?/span>琚?/span>璋冭瘯榪涚▼鐨勫湴鍧絀洪棿鍖鴻鍙栨満鍣ㄥ瓧銆傚湪璁稿褰撲唬鐨勫鉤鍙頒腑錛岃繖涓や釜鎸囦護(hù)鏄瓑浠風(fēng)殑銆?/span>ptrace鍑芥暟鎺ユ敹鐩爣鍦板潃addr錛屽茍榪斿洖璇誨埌鐨勭粨鏋溿?/span>

r  PT_WRITE_I鍜?/span>PR_READ_D錛?/span>PTRACE_POKETEXT鍜?/span>PTRACE_POKEDATA錛?/span>灝嗙敱_data浼犲叆鐨勬満鍣ㄥ瓧鍐欏叆addr鎵鎸囧畾鐨勫湴鍧銆?/span>

r  PT_GETREGS錛?/span>PT_GETFPREGS鍜?/span>PT_GETDBREGS錛?/span>PTRACE_GETREGS錛?/span>PTRACE_ FPREGS鍜?/span>PT_GETFPXREGS錛?/span>灝嗕竴鑸敤閫斿瘎瀛樺櫒銆佹瀵勫瓨鍣ㄥ拰璋冭瘯瀵勫瓨鍣ㄧ殑鍊艱鍏ュ埌鍦板潃鐢?/span>_addr鎸囬拡鎵鎸囧畾鐨勮皟璇曞櫒榪涚▼鐨勫唴瀛樺尯涓傚彧鏈?/span>i386騫沖彴鎺ユ敹榪欎簺涓庣郴緇熺浉鍏崇殑鍛戒護(hù)銆傚瘎瀛樺櫒緇撴瀯鐨勬弿榪版斁鍦ㄥご鏂囦歡machine/reg.h鏂囦歡涓?/span>

r  PT_SETREGS錛?/span>PT_SETFPREGS鍜?/span>PT_SETDBREGS錛?/span>PTRACE_SETREGS錛?/span>PTRACE_ SETFPREGS鍜?/span>PT_SETFPXREGS錛?/span>閫氳繃鎷瘋礉鐢?/span>_addr鎸囬拡鎵鎸囧畾鐨勫唴瀛樺尯鍩熺殑鍐呭鏉ヨ緗璋冭瘯榪涚▼鐨勫瘎瀛樺櫒鐨勫箋?/span>

r  PT_KILL錛?/span>PTRACE_KILL錛?/span>灝?/span>sigkill鍙戦佸埌琚皟璇曡繘紼嬶紝浠ョ粓姝㈠叾鎵ц銆?/span>



鍙跺瓙 2009-07-25 17:52 鍙戣〃璇勮
]]>
Playing with ptrace, Part IIhttp://www.shnenglu.com/elva/archive/2009/07/25/91141.html鍙跺瓙鍙跺瓙Sat, 25 Jul 2009 09:45:00 GMThttp://www.shnenglu.com/elva/archive/2009/07/25/91141.htmlhttp://www.shnenglu.com/elva/comments/91141.htmlhttp://www.shnenglu.com/elva/archive/2009/07/25/91141.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/91141.htmlhttp://www.shnenglu.com/elva/services/trackbacks/91141.htmlIn Part I of this article [LJ, November 2002], we saw how ptrace can be used to trace system calls and change system call arguments. In this article, we investigate advanced techniques like setting breakpoints and injecting code into running programs. Debuggers use these methods to set up breakpoints and execute debugging handlers. As with Part I, all code in this article is i386 architecture-specific.

In Part I, we ran the process to be traced as a child after calling ptrace(PTRACE_TRACEME, ..). If you simply wanted to see how the process is making system calls and trace the program, this would be sufficient. If you want to trace or debug a process already running, then ptrace(PTRACE_ATTACH, ..) should be used.

When a ptrace(PTRACE_ATTACH, ..) is called with the pid to be traced, it is roughly equivalent to the process calling ptrace(PTRACE_TRACEME, ..) and becoming a child of the tracing process. The traced process is sent a SIGSTOP, so we can examine and modify the process as usual. After we are done with modifications or tracing, we can let the traced process continue on its own by calling ptrace(PTRACE_DETACH, ..).

The following is the code for a small example tracing program:

int main()
{ int i;
for(i = 0;i < 10; ++i) {
printf("My counter: %d\n", i);
sleep(2);
}
return 0;
}

Save the program as dummy2.c. Compile and run it:

gcc -o dummy2 dummy2.c
./dummy2 &
Now, we can attach to dummy2 by using the code below:
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h> /* For user_regs_struct
etc. */
int main(int argc, char *argv[])
{ pid_t traced_process;
struct user_regs_struct regs;
long ins;
if(argc != 2) {
printf("Usage: %s <pid to be traced>\n",
argv[0], argv[1]);
exit(1);
}
traced_process = atoi(argv[1]);
ptrace(PTRACE_ATTACH, traced_process,
NULL, NULL);
wait(NULL);
ptrace(PTRACE_GETREGS, traced_process,
NULL, &regs);
ins = ptrace(PTRACE_PEEKTEXT, traced_process,
regs.eip, NULL);
printf("EIP: %lx Instruction executed: %lx\n",
regs.eip, ins);
ptrace(PTRACE_DETACH, traced_process,
NULL, NULL);
return 0;
}
The above program simply attaches to a process, waits for it to stop, examines its eip (instruction pointer) and detaches.

To inject code use ptrace(PTRACE_POKETEXT, ..) and ptrace(PTRACE_POKEDATA, ..) after the traced process has stopped.

Setting Breakpoints

How do debuggers set breakpoints? Generally, they replace the instruction to be executed with a trap instruction, so that when the traced program stops, the tracing program, the debugger, can examine it. It will replace the original instruction once the tracing program continues the traced process. Here's an example:

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h>
const int long_size = sizeof(long);
void getdata(pid_t child, long addr,
char *str, int len)
{ char *laddr;
int i, j;
union u {
long val;
char chars[long_size];
}data;
i = 0;
j = len / long_size;
laddr = str;
while(i < j) {
data.val = ptrace(PTRACE_PEEKDATA, child,
addr + i * 4, NULL);
memcpy(laddr, data.chars, long_size);
++i;
laddr += long_size;
}
j = len % long_size;
if(j != 0) {
data.val = ptrace(PTRACE_PEEKDATA, child,
addr + i * 4, NULL);
memcpy(laddr, data.chars, j);
}
str[len] = '\0';
}
void putdata(pid_t child, long addr,
char *str, int len)
{ char *laddr;
int i, j;
union u {
long val;
char chars[long_size];
}data;
i = 0;
j = len / long_size;
laddr = str;
while(i < j) {
memcpy(data.chars, laddr, long_size);
ptrace(PTRACE_POKEDATA, child,
addr + i * 4, data.val);
++i;
laddr += long_size;
}
j = len % long_size;
if(j != 0) {
memcpy(data.chars, laddr, j);
ptrace(PTRACE_POKEDATA, child,
addr + i * 4, data.val);
}
}
int main(int argc, char *argv[])
{ pid_t traced_process;
struct user_regs_struct regs, newregs;
long ins;
/* int 0x80, int3 */
char code[] = {0xcd,0x80,0xcc,0};
char backup[4];
if(argc != 2) {
printf("Usage: %s <pid to be traced>\n",
argv[0], argv[1]);
exit(1);
}
traced_process = atoi(argv[1]);
ptrace(PTRACE_ATTACH, traced_process,
NULL, NULL);
wait(NULL);
ptrace(PTRACE_GETREGS, traced_process,
NULL, &regs);
/* Copy instructions into a backup variable */
getdata(traced_process, regs.eip, backup, 3);
/* Put the breakpoint */
putdata(traced_process, regs.eip, code, 3);
/* Let the process continue and execute
the int 3 instruction */
ptrace(PTRACE_CONT, traced_process, NULL, NULL);
wait(NULL);
printf("The process stopped, putting back "
"the original instructions\n");
printf("Press <enter> to continue\n");
getchar();
putdata(traced_process, regs.eip, backup, 3);
/* Setting the eip back to the original
instruction to let the process continue */
ptrace(PTRACE_SETREGS, traced_process,
NULL, &regs);
ptrace(PTRACE_DETACH, traced_process,
NULL, NULL);
return 0;
}

Here we replace the three bytes with the code for a trap instruction, and when the process stops, we replace the original instructions and reset the eip to original location. Figures 1-4 clarify how the instruction stream looks when above program is executed.

Figure 1. After the Process Is Stopped

Figure 2. After the Trap Instruction Bytes Are Set

Figure 3. Trap Is Hit and Control Is Given to the Tracing Program

Figure 4. After the Original Instructions Are Replaced and eip Is Reset to the Original Location

Now that we have a clear idea of how breakpoints are set, let's inject some code bytes into a running program. These code bytes will print “hello world”.

The following program is a simple “hello world” program with modifications to fit our needs. Compile the following program with:

gcc -o hello hello.c
void main()
{
__asm__("
jmp forward
backward:
popl %esi # Get the address of
# hello world string
movl $4, %eax # Do write system call
movl $2, %ebx
movl %esi, %ecx
movl $12, %edx
int $0x80
int3 # Breakpoint. Here the
# program will stop and
# give control back to
# the parent
forward:
call backward
.string \"Hello World\\n\""
);
}

The jumping backward and forward here is required to find the address of the “hello world” string.

We can get the machine code for the above assembly from GDB. Fire up GDB and disassemble the program:

(gdb) disassemble main
Dump of assembler code for function main:
0x80483e0 <main>: push %ebp
0x80483e1 <main+1>: mov %esp,%ebp
0x80483e3 <main+3>: jmp 0x80483fa <forward>
End of assembler dump.
(gdb) disassemble forward
Dump of assembler code for function forward:
0x80483fa <forward>: call 0x80483e5 <backward>
0x80483ff <forward+5>: dec %eax
0x8048400 <forward+6>: gs
0x8048401 <forward+7>: insb (%dx),%es:(%edi)
0x8048402 <forward+8>: insb (%dx),%es:(%edi)
0x8048403 <forward+9>: outsl %ds:(%esi),(%dx)
0x8048404 <forward+10>: and %dl,0x6f(%edi)
0x8048407 <forward+13>: jb 0x8048475
0x8048409 <forward+15>: or %fs:(%eax),%al
0x804840c <forward+18>: mov %ebp,%esp
0x804840e <forward+20>: pop %ebp
0x804840f <forward+21>: ret
End of assembler dump.
(gdb) disassemble backward
Dump of assembler code for function backward:
0x80483e5 <backward>: pop %esi
0x80483e6 <backward+1>: mov $0x4,%eax
0x80483eb <backward+6>: mov $0x2,%ebx
0x80483f0 <backward+11>: mov %esi,%ecx
0x80483f2 <backward+13>: mov $0xc,%edx
0x80483f7 <backward+18>: int $0x80
0x80483f9 <backward+20>: int3
End of assembler dump.

We need to take the machine code bytes from main+3 to backward+20, which is a total of 41 bytes. The machine code can be seen with the x command in GDB:

(gdb) x/40bx main+3
<main+3>: eb 15 5e b8 04 00 00 00
<backward+6>: bb 02 00 00 00 89 f1 ba
<backward+14>: 0c 00 00 00 cd 80 cc
<forward+1>: e6 ff ff ff 48 65 6c 6c
<forward+9>: 6f 20 57 6f 72 6c 64 0a
Now we have the instruction bytes to be executed. Why wait? We can inject them using the same method as in the previous example. The following is the source code; only the main function is given here:
int main(int argc, char *argv[])
{ pid_t traced_process;
struct user_regs_struct regs, newregs;
long ins;
int len = 41;
char insertcode[] =
"\xeb\x15\x5e\xb8\x04\x00"
"\x00\x00\xbb\x02\x00\x00\x00\x89\xf1\xba"
"\x0c\x00\x00\x00\xcd\x80\xcc\xe8\xe6\xff"
"\xff\xff\x48\x65\x6c\x6c\x6f\x20\x57\x6f"
"\x72\x6c\x64\x0a\x00";
char backup[len];
if(argc != 2) {
printf("Usage: %s <pid to be traced>\n",
argv[0], argv[1]);
exit(1);
}
traced_process = atoi(argv[1]);
ptrace(PTRACE_ATTACH, traced_process,
NULL, NULL);
wait(NULL);
ptrace(PTRACE_GETREGS, traced_process,
NULL, &regs);
getdata(traced_process, regs.eip, backup, len);
putdata(traced_process, regs.eip,
insertcode, len);
ptrace(PTRACE_SETREGS, traced_process,
NULL, &regs);
ptrace(PTRACE_CONT, traced_process,
NULL, NULL);
wait(NULL);
printf("The process stopped, Putting back "
"the original instructions\n");
putdata(traced_process, regs.eip, backup, len);
ptrace(PTRACE_SETREGS, traced_process,
NULL, &regs);
printf("Letting it continue with "
"original flow\n");
ptrace(PTRACE_DETACH, traced_process,
NULL, NULL);
return 0;
}
Injecting the Code into Free Space

In the previous example we injected the code directly into the executing instruction stream. However, debuggers can get confused with this kind of behaviour, so let's find the free space in the process and inject the code there. We can find free space by examining the /proc/pid/maps file of the traced process. The following function will find the starting address of this map:

long freespaceaddr(pid_t pid)
{
FILE *fp;
char filename[30];
char line[85];
long addr;
char str[20];
sprintf(filename, "/proc/%d/maps", pid);
fp = fopen(filename, "r");
if(fp == NULL)
exit(1);
while(fgets(line, 85, fp) != NULL) {
sscanf(line, "%lx-%*lx %*s %*s %s", &addr,
str, str, str, str);
if(strcmp(str, "00:00") == 0)
break;
}
fclose(fp);
return addr;
}

Each line in /proc/pid/maps represents a mapped region of the process. An entry in /proc/pid/maps looks like this:

map start-mapend    protection  offset     device
inode process file
08048000-0804d000 r-xp 00000000 03:08
66111 /opt/kde2/bin/kdeinit
The following program injects code into free space. It's similar to the previous injection program except the free space address is used for keeping our new code. Here is the source code for the main function:
int main(int argc, char *argv[])
{ pid_t traced_process;
struct user_regs_struct oldregs, regs;
long ins;
int len = 41;
char insertcode[] =
"\xeb\x15\x5e\xb8\x04\x00"
"\x00\x00\xbb\x02\x00\x00\x00\x89\xf1\xba"
"\x0c\x00\x00\x00\xcd\x80\xcc\xe8\xe6\xff"
"\xff\xff\x48\x65\x6c\x6c\x6f\x20\x57\x6f"
"\x72\x6c\x64\x0a\x00";
char backup[len];
long addr;
if(argc != 2) {
printf("Usage: %s <pid to be traced>\n",
argv[0], argv[1]);
exit(1);
}
traced_process = atoi(argv[1]);
ptrace(PTRACE_ATTACH, traced_process,
NULL, NULL);
wait(NULL);
ptrace(PTRACE_GETREGS, traced_process,
NULL, &regs);
addr = freespaceaddr(traced_process);
getdata(traced_process, addr, backup, len);
putdata(traced_process, addr, insertcode, len);
memcpy(&oldregs, &regs, sizeof(regs));
regs.eip = addr;
ptrace(PTRACE_SETREGS, traced_process,
NULL, &regs);
ptrace(PTRACE_CONT, traced_process,
NULL, NULL);
wait(NULL);
printf("The process stopped, Putting back "
"the original instructions\n");
putdata(traced_process, addr, backup, len);
ptrace(PTRACE_SETREGS, traced_process,
NULL, &oldregs);
printf("Letting it continue with "
"original flow\n");
ptrace(PTRACE_DETACH, traced_process,
NULL, NULL);
return 0;
}
Behind the Scenes

So what happens within the kernel now? How is ptrace implemented? This section could be an article on its own; however, here's a brief description of what happens.

When a process calls ptrace with PTRACE_TRACEME, the kernel sets up the process flags to reflect that it is being traced:

Source: arch/i386/kernel/ptrace.c
if (request == PTRACE_TRACEME) {
/* are we already being traced? */
if (current->ptrace & PT_PTRACED)
goto out;
/* set the ptrace bit in the process flags. */
current->ptrace |= PT_PTRACED;
ret = 0;
goto out;
}

When a system call entry is done, the kernel checks this flag and calls the trace system call if the process is being traced. The gory assembly details can be found in arch/i386/kernel/entry.S.

Now, we are in the sys_trace() function as defined in arch/i386/kernel/ptrace.c. It stops the child and sends a signal to the parent notifying that the child is stopped. This wakes up the waiting parent, and it does the ptrace magic. Once the parent is done, and it calls ptrace(PTRACE_CONT, ..) or ptrace(PTRACE_SYSCALL, ..), it wakes up the child by calling the scheduler function wake_up_process(). Some other architectures can implement this by sending a SIGCHLD to child.

Conclusion

ptrace may appear to be magic to some people, because it can examine and modify a running program. It is generally used by debuggers and system call tracing programs, such as ptrace. It opens up interesting possibilities for doing user-mode extensions as well. There have been a lot of attempts to extend the operating system on the user level. See Resources to read about UFO, a user-level extension to filesystems. ptrace also is used to employ security mechanisms.

All example code from this article and from Part I is available as a tar archive on the Linux Journal FTP site [ftp.ssc.com/pub/lj/listings/issue104/6210.tgz].


鍘熸枃錛?br>

http://www.linuxjournal.com/article/6210



鍙跺瓙 2009-07-25 17:45 鍙戣〃璇勮
]]>鐜╄漿ptrace(涓)http://www.shnenglu.com/elva/archive/2009/07/25/91140.html鍙跺瓙鍙跺瓙Sat, 25 Jul 2009 09:45:00 GMThttp://www.shnenglu.com/elva/archive/2009/07/25/91140.htmlhttp://www.shnenglu.com/elva/comments/91140.htmlhttp://www.shnenglu.com/elva/archive/2009/07/25/91140.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/91140.htmlhttp://www.shnenglu.com/elva/services/trackbacks/91140.html闃呰鍏ㄦ枃

鍙跺瓙 2009-07-25 17:45 鍙戣〃璇勮
]]>
SIGPIPE瀵艱嚧鐨勭▼搴忛鍑?/title><link>http://www.shnenglu.com/elva/archive/2009/07/21/90761.html</link><dc:creator>鍙跺瓙</dc:creator><author>鍙跺瓙</author><pubDate>Tue, 21 Jul 2009 10:56:00 GMT</pubDate><guid>http://www.shnenglu.com/elva/archive/2009/07/21/90761.html</guid><wfw:comment>http://www.shnenglu.com/elva/comments/90761.html</wfw:comment><comments>http://www.shnenglu.com/elva/archive/2009/07/21/90761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/elva/comments/commentRss/90761.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/elva/services/trackbacks/90761.html</trackback:ping><description><![CDATA[<span id="hvzpftn" class=Apple-style-span style="WORD-SPACING: 0px; FONT: 16px simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span id="hvzpftn" class=Apple-style-span style="FONT-SIZE: 12px; LINE-HEIGHT: 18px; FONT-FAMILY: Arial"> <table style="TABLE-LAYOUT: fixed"> <tbody> <tr> <td style="FONT-SIZE: 12px; FILTER: none; VISIBILITY: visible! important; WORD-BREAK: break-all; LINE-HEIGHT: 18px; ZOOM: 1! important; FONT-FAMILY: Arial; WORD-WRAP: break-word"> <div id="hvzpftn" class=cnt id=blog_text style="OVERFLOW-Y: hidden; FONT-SIZE: 14px; FILTER: none; VISIBILITY: visible! important; OVERFLOW-X: hidden; COLOR: rgb(51,51,51); WORD-BREAK: normal; LINE-HEIGHT: 20px; ZOOM: 1! important; FONT-FAMILY: Arial; POSITION: static; WORD-WRAP: break-word"> <p style="LINE-HEIGHT: normal">褰撴湇鍔″櫒close涓涓繛鎺ユ椂錛岃嫢client绔帴鐫鍙戞暟鎹傛牴鎹甌CP鍗忚鐨勮瀹氾紝浼?xì)鏀跺堫C竴涓猂ST鍝嶅簲錛宑lient鍐嶅線榪欎釜鏈嶅姟鍣ㄥ彂閫佹暟鎹椂錛岀郴緇熶細(xì)鍙戝嚭涓涓猄IGPIPE淇″彿緇欒繘紼嬶紝鍛婅瘔榪涚▼榪欎釜榪炴帴宸茬粡鏂紑浜嗭紝涓嶈鍐嶅啓浜嗐?br style="LINE-HEIGHT: normal">    鏍規(guī)嵁淇″彿鐨勯粯璁ゅ鐞嗚鍒橲IGPIPE淇″彿鐨勯粯璁ゆ墽琛屽姩浣滄槸terminate(緇堟銆侀鍑?,鎵浠lient浼?xì)閫鍑恒傝嫢涓嶆兂瀹㈡埛绔鍑哄彲浠ユ妸SIGPIPE璁句負(fù)SIG_IGN</p> <p style="LINE-HEIGHT: normal">    濡?    signal(SIGPIPE,SIG_IGN);<br style="LINE-HEIGHT: normal">    榪欐椂SIGPIPE浜ょ粰浜嗙郴緇熷鐞嗐?/p> <p style="LINE-HEIGHT: normal">鏈嶅姟鍣ㄩ噰鐢ㄤ簡fork鐨勮瘽錛岃鏀墮泦鍨冨溇榪涚▼錛岄槻姝㈠兊灝歌繘紼嬬殑浜х敓錛屽彲浠ヨ繖鏍峰鐞嗭細(xì)<br style="LINE-HEIGHT: normal">signal(SIGCHLD,SIG_IGN);銆浜ょ粰緋葷粺init鍘誨洖鏀躲?br style="LINE-HEIGHT: normal">   榪欓噷瀛愯繘紼嬪氨涓嶄細(xì)浜х敓鍍靛案榪涚▼浜嗐?/p> <p style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><a style="LINE-HEIGHT: normal" ><u><font color=#0000ff>http://www.cublog.cn/u/31357/showart_242605.html</font></u></a></p> <p style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">濂戒箙娌″仛榪嘋寮鍙戜簡錛屾渶榪戦噸鎿嶆棫涓氥?span class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">鍚鍙﹀涓涓」鐩粍socket寮鍙戦亣鍒伴棶棰橈紝鍙戦佺鍜屾帴鍙楃鏁版嵁澶у皬涓嶄竴鑷淬傚緩璁粬浠噰鐢╳riten鐨勯噸鍙戞満鍒訛紝浠ラ伩鍏嶄俊鍙蜂腑鏂敊璇傞噰鐢ㄥ悗榪樻槸鏈夐棶棰樸侾M璁╂垜甯繖鐮旂┒涓嬨?span class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">UNP n騫翠互鍓嶇湅榪囷紝寰堜箙娌″仛榪囧簳灞傚紑鍙戯紝鎵嬭竟涔熸病鏈塙NP vol1榪欐湰涔︼紝鎵浠ュ仛浜嗕釜嫻嬭瘯紼嬪簭錛岀爺絀朵笅瀹為檯鍙兘鍙戠敓鐨勬儏鍐典簡銆?span class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">嫻嬭瘯鐜錛欰S3鍜宺edhat 9(緙虹渷娌℃湁nc)<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">鍏堜笅杞絬np婧愮爜:<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">wget<span id="hvzpftn" class=Apple-converted-space> </span><a style="LINE-HEIGHT: normal" ><u><font color=#0000ff>http://www.unpbook.com/unpv13e.tar.gz</font></u></a><span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">tar xzvf *.tar.gz;<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">configure;make lib.<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">鐒跺悗鍙傝僺tr_cli.c鍜宼cpcli01.c錛屽啓浜嗘祴璇曚唬鐮乧lient.c<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">#include    "unp.h"</p> <p style="LINE-HEIGHT: normal">#define MAXBUF 40960<br style="LINE-HEIGHT: normal">void processSignal(int signo)<br style="LINE-HEIGHT: normal">{<br style="LINE-HEIGHT: normal">    printf("Signal is %d\n", signo);<br style="LINE-HEIGHT: normal">    signal(signo, processSignal);<br style="LINE-HEIGHT: normal">}<br style="LINE-HEIGHT: normal">void<br style="LINE-HEIGHT: normal">str_cli(FILE *fp, int sockfd)<br style="LINE-HEIGHT: normal">{<br style="LINE-HEIGHT: normal">    char    sendline[MAXBUF], recvline[MAXBUF];</p> <p style="LINE-HEIGHT: normal">    while (1) {</p> <p style="LINE-HEIGHT: normal">        memset(sendline, 'a', sizeof(sendline));<br style="LINE-HEIGHT: normal">        printf("Begin send %d data\n", MAXBUF);<br style="LINE-HEIGHT: normal">        Writen(sockfd, sendline, sizeof(sendline));<br style="LINE-HEIGHT: normal">        sleep(5);</p> <p style="LINE-HEIGHT: normal">    }<br style="LINE-HEIGHT: normal">}</p> <p style="LINE-HEIGHT: normal">int<br style="LINE-HEIGHT: normal">main(int argc, char **argv)<br style="LINE-HEIGHT: normal">{<br style="LINE-HEIGHT: normal">    int                    sockfd;<br style="LINE-HEIGHT: normal">    struct sockaddr_in    servaddr;</p> <p style="LINE-HEIGHT: normal">    signal(SIGPIPE, SIG_IGN);<br style="LINE-HEIGHT: normal">    //signal(SIGPIPE, processSignal);</p> <p style="LINE-HEIGHT: normal">    if (argc != 2)<br style="LINE-HEIGHT: normal">        err_quit("usage: tcpcli [port]");</p> <p style="LINE-HEIGHT: normal">    sockfd = Socket(AF_INET, SOCK_STREAM, 0);</p> <p style="LINE-HEIGHT: normal">    bzero(&servaddr, sizeof(servaddr));<br style="LINE-HEIGHT: normal">    servaddr.sin_family = AF_INET;<br style="LINE-HEIGHT: normal">    servaddr.sin_port = htons(atoi(argv[1]));<br style="LINE-HEIGHT: normal">    Inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);</p> <p style="LINE-HEIGHT: normal">    Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));</p> <p style="LINE-HEIGHT: normal">    str_cli(stdin, sockfd);        /* do it all */</p> <p style="LINE-HEIGHT: normal">    exit(0);<br style="LINE-HEIGHT: normal">}</p> <p style="LINE-HEIGHT: normal"></p> <p style="LINE-HEIGHT: normal"></p> <p style="LINE-HEIGHT: normal">涓轟簡鏂逛究瑙傚療閿欒杈撳嚭錛宭ib/writen.c涔熷仛浜嗕慨鏀癸紝鍔犱簡浜涙棩蹇楋細(xì)</p> <p style="LINE-HEIGHT: normal"></p> <p style="LINE-HEIGHT: normal"></p> <p style="LINE-HEIGHT: normal">/* include writen */<br style="LINE-HEIGHT: normal">#include    "unp.h"</p> <p style="LINE-HEIGHT: normal">ssize_t        &nbs <table class=FCK__ShowTableBorders style="TABLE-LAYOUT: auto; LINE-HEIGHT: normal"> <tbody style="LINE-HEIGHT: normal"> <tr style="LINE-HEIGHT: normal"> <td style="FONT-SIZE: 12px; FILTER: none; VISIBILITY: visible! important; WORD-BREAK: break-all; LINE-HEIGHT: normal; ZOOM: 1! important; FONT-FAMILY: Arial; WORD-WRAP: break-word"> <p style="LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" size=+0><span style="LINE-HEIGHT: normal">p;               <span style="COLOR: rgb(255,153,0); LINE-HEIGHT: normal">/* Write "n" bytes to a descriptor. */</span><br style="LINE-HEIGHT: normal">writen<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span><span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">int</span><span id="hvzpftn" class=Apple-converted-space> </span>fd<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">const</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">void</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">*</span>vptr<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(255,0,0); LINE-HEIGHT: normal">size_t</span><span id="hvzpftn" class=Apple-converted-space> </span>n<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><br style="LINE-HEIGHT: normal"><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">{</span><br style="LINE-HEIGHT: normal">    <span style="COLOR: rgb(255,0,0); LINE-HEIGHT: normal">size_t</span>         nleft<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal">     ssize_t         nwritten<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal">    <span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">const</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">char</span>    <span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">*</span>ptr<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">     ptr<span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">=</span><span id="hvzpftn" class=Apple-converted-space> </span>vptr<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal">     nleft<span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">=</span><span id="hvzpftn" class=Apple-converted-space> </span>n<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal">    <span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">while</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span>nleft<span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">></span><span id="hvzpftn" class=Apple-converted-space> </span>0<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">{</span><br style="LINE-HEIGHT: normal">        <span style="COLOR: rgb(255,0,0); LINE-HEIGHT: normal">printf</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span><span style="COLOR: rgb(255,0,255); LINE-HEIGHT: normal">"Begin Writen %d\n"</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span>nleft<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal">        <span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">if</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span>nwritten<span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">=</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(255,0,0); LINE-HEIGHT: normal">write</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span>fd<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span>ptr<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span>nleft<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal"><</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">=</span><span id="hvzpftn" class=Apple-converted-space> </span>0<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">{</span><br style="LINE-HEIGHT: normal">            <span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">if</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span>nwritten<span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal"><</span><span id="hvzpftn" class=Apple-converted-space> </span>0<span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">&</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">&</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(255,0,0); LINE-HEIGHT: normal">errno</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">=</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">=</span><span id="hvzpftn" class=Apple-converted-space> </span>EINTR<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">{</span><br style="LINE-HEIGHT: normal">                <span style="COLOR: rgb(255,0,0); LINE-HEIGHT: normal">printf</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span><span style="COLOR: rgb(255,0,255); LINE-HEIGHT: normal">"intterupt\n"</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal">                 nwritten<span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">=</span><span id="hvzpftn" class=Apple-converted-space> </span>0<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span>        <span style="COLOR: rgb(255,153,0); LINE-HEIGHT: normal">/* and call write() again */</span><br style="LINE-HEIGHT: normal">            <span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">}</span><br style="LINE-HEIGHT: normal">            <span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">else</span><br style="LINE-HEIGHT: normal">                <span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">return</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">-</span>1<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span>            <span style="COLOR: rgb(255,153,0); LINE-HEIGHT: normal">/* error */</span><br style="LINE-HEIGHT: normal">        <span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">}</span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">         nleft<span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">-</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">=</span><span id="hvzpftn" class=Apple-converted-space> </span>nwritten<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal">         ptr<span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">+</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">=</span><span id="hvzpftn" class=Apple-converted-space> </span>nwritten<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal">        <span style="COLOR: rgb(255,0,0); LINE-HEIGHT: normal">printf</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span><span style="COLOR: rgb(255,0,255); LINE-HEIGHT: normal">"Already write %d, left %d, errno=%d\n"</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span>nwritten<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span>nleft<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(255,0,0); LINE-HEIGHT: normal">errno</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal">    <span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">}</span><br style="LINE-HEIGHT: normal">    <span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">return</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span>n<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal"><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">}</span><br style="LINE-HEIGHT: normal"><span style="COLOR: rgb(255,153,0); LINE-HEIGHT: normal">/* end writen */</span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">void</span><br style="LINE-HEIGHT: normal">Writen<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span><span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">int</span><span id="hvzpftn" class=Apple-converted-space> </span>fd<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">void</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">*</span>ptr<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(255,0,0); LINE-HEIGHT: normal">size_t</span><span id="hvzpftn" class=Apple-converted-space> </span>nbytes<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><br style="LINE-HEIGHT: normal"><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">{</span><br style="LINE-HEIGHT: normal">    <span style="COLOR: rgb(0,0,255); LINE-HEIGHT: normal">if</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span>writen<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span>fd<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span>ptr<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span>nbytes<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">!</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">=</span><span id="hvzpftn" class=Apple-converted-space> </span>nbytes<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><br style="LINE-HEIGHT: normal">         err_sys<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span><span style="COLOR: rgb(255,0,255); LINE-HEIGHT: normal">"writen error"</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span><br style="LINE-HEIGHT: normal"><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">}</span><br style="LINE-HEIGHT: normal"></span></font></p> </td> </tr> </tbody> </table> </p> <p style="LINE-HEIGHT: normal"></p> <p style="LINE-HEIGHT: normal">client.c鏀懼湪tcpclieserv鐩綍涓嬶紝淇敼浜哅akefile錛屽鍔犱簡client.c鐨勭紪璇戠洰鏍?/p> <p style="LINE-HEIGHT: normal"></p> <p style="LINE-HEIGHT: normal"> <table style="TABLE-LAYOUT: auto; LINE-HEIGHT: normal; BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1> <tbody style="LINE-HEIGHT: normal"> <tr style="LINE-HEIGHT: normal"> <td style="FONT-SIZE: 12px; FILTER: none; VISIBILITY: visible! important; WORD-BREAK: break-all; LINE-HEIGHT: normal; ZOOM: 1! important; FONT-FAMILY: Arial; WORD-WRAP: break-word"> <p style="MARGIN: 5px; LINE-HEIGHT: 18px"><code style="LINE-HEIGHT: normal"><span style="COLOR: rgb(0,0,0); LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" face=鏂板畫浣?client<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">:</span><span id="hvzpftn" class=Apple-converted-space> </span>client<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">.</span>c<br style="LINE-HEIGHT: normal">                 $<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">{</span>CC<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">}</span><span id="hvzpftn" class=Apple-converted-space> </span>$<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">{</span>CFLAGS<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">}</span><span id="hvzpftn" class=Apple-converted-space> </span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">-</span>o $@ $<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal"><</span><span id="hvzpftn" class=Apple-converted-space> </span>$<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">{</span>LIBS<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">}</span><br style="LINE-HEIGHT: normal"></font></span></code></p> </td> </tr> </tbody> </table> </p> <p style="LINE-HEIGHT: normal"></p> <p style="LINE-HEIGHT: normal">鎺ョ潃灝卞彲浠ュ紑濮嬫祴璇曚簡銆?/p> <h2 style="LINE-HEIGHT: normal">嫻嬭瘯1 蹇界暐SIGPIPE淇″彿錛寃riten涔嬪墠錛屽鏂瑰叧闂帴鍙楄繘紼?/h2> <p style="LINE-HEIGHT: normal">鏈満鏈嶅姟绔細(xì)</p> <p style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">nc -l -p 30000<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">鏈満瀹㈡埛绔?<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">./client 30000<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">Begin send 40960 data<br style="LINE-HEIGHT: normal">Begin Writen 40960<br style="LINE-HEIGHT: normal">Already write 40960, left 0, errno=0<br style="LINE-HEIGHT: normal">Begin send 40960 data<br style="LINE-HEIGHT: normal">Begin Writen 40960<br style="LINE-HEIGHT: normal">Already write 40960, left 0, errno=0<br style="LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" color=#ff0000>鎵ц鍒頒笂姝ュ仠姝㈡湇鍔$,client浼?xì)鐟艟l樉紺?</font><span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">Begin send 40960 data<br style="LINE-HEIGHT: normal">Begin Writen 40960<br style="LINE-HEIGHT: normal">writen error: Broken pipe(32)<br style="LINE-HEIGHT: normal"><strong style="LINE-HEIGHT: normal">緇撹:鍙write涔嬪墠錛屽鏂箂ocket涓柇錛屽彂閫佺write浼?xì)杩斿?1,errno鍙蜂負(fù)EPIPE(32)</strong></p> <h2 style="LINE-HEIGHT: normal">嫻嬭瘯2 catch SIGPIPE淇″彿錛寃riten涔嬪墠錛屽鏂瑰叧闂帴鍙楄繘紼?/h2> <p style="LINE-HEIGHT: normal">淇敼瀹㈡埛绔唬鐮侊紝catch sigpipe淇″彿</p> <p style="LINE-HEIGHT: normal"> <table style="TABLE-LAYOUT: auto; LINE-HEIGHT: normal; BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1> <tbody style="LINE-HEIGHT: normal"> <tr style="LINE-HEIGHT: normal"> <td style="FONT-SIZE: 12px; FILTER: none; VISIBILITY: visible! important; WORD-BREAK: break-all; LINE-HEIGHT: normal; ZOOM: 1! important; FONT-FAMILY: Arial; WORD-WRAP: break-word"> <p style="MARGIN: 5px; LINE-HEIGHT: 18px"><code style="LINE-HEIGHT: normal"><span style="COLOR: rgb(0,0,0); LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" face=鏂板畫浣?<span style="COLOR: rgb(255,153,0); LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" color=#000000>        </font>//signal(SIGPIPE, SIG_IGN);<br style="LINE-HEIGHT: normal"></span><br style="LINE-HEIGHT: normal">        <span style="COLOR: rgb(255,0,0); LINE-HEIGHT: normal">signal</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">(</span>SIGPIPE<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">,</span><span id="hvzpftn" class=Apple-converted-space> </span>processSignal<span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">)</span><span style="COLOR: rgb(0,0,204); LINE-HEIGHT: normal">;</span></font><br style="LINE-HEIGHT: normal"></span></code></p> </td> </tr> </tbody> </table> </p> <p style="LINE-HEIGHT: normal">鏈満鏈嶅姟绔細(xì)</p> <p style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">nc -l -p 30000<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">鏈満瀹㈡埛绔?<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">make client<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">./client 30000<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">Begin send 40960 data<br style="LINE-HEIGHT: normal">Begin Writen 40960<br style="LINE-HEIGHT: normal">Already write 40960, left 0, errno=0<br style="LINE-HEIGHT: normal">Begin send 40960 data<br style="LINE-HEIGHT: normal">Begin Writen 40960<br style="LINE-HEIGHT: normal">Already write 40960, left 0, errno=0<br style="LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" color=#ff0000>鎵ц鍒頒笂姝ュ仠姝㈡湇鍔$,client浼?xì)鐟艟l樉紺?</font><span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">Begin send 40960 data<br style="LINE-HEIGHT: normal">Begin Writen 40960<br style="LINE-HEIGHT: normal">Signal is 13<br style="LINE-HEIGHT: normal">writen error: Broken pipe(32)<br style="LINE-HEIGHT: normal"><strong style="LINE-HEIGHT: normal">緇撹:鍙write涔嬪墠錛屽鏂箂ocket涓柇錛屽彂閫佺write鏃訛紝浼?xì)鍏堣皟鐢⊿IGPIPE鍝嶅簲鍑芥暟錛岀劧鍚巜rite榪斿洖-1,errno鍙蜂負(fù)EPIPE(32)</strong><span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal"></p> <h2 style="LINE-HEIGHT: normal">嫻嬭瘯3 writen榪囩▼涓紝瀵規(guī)柟鍏抽棴鎺ュ彈榪涚▼</h2> <p style="LINE-HEIGHT: normal">涓轟簡鏂逛究鎿嶄綔錛屽姞澶?嬈rite鐨勬暟鎹噺錛屼慨鏀筂AXBUF涓?096000</p> <p style="LINE-HEIGHT: normal">鏈満鏈嶅姟绔細(xì)</p> <p style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">nc -l -p 30000<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">鏈満瀹㈡埛绔?<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">make client<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">./client 30000<span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">Begin send 4096000 data<br style="LINE-HEIGHT: normal">Begin Writen 4096000<br style="LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" color=#ff0000>鎵ц鍒頒笂姝ュ仠姝㈡湇鍔$,client浼?xì)鐟艟l樉紺?</font><span id="hvzpftn" class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal">Already write 589821, left 3506179, errno=0<br style="LINE-HEIGHT: normal">Begin Writen 3506179<br style="LINE-HEIGHT: normal">writen error: Connection reset by peer(104)<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><strong style="LINE-HEIGHT: normal">緇撹:鍙socket write涓紝瀵規(guī)柟socket涓柇錛屽彂閫佺write浼?xì)鍏垬q斿洖宸茬粡鍙戦佺殑瀛楄妭鏁?鍐嶆write鏃惰繑鍥?1,errno鍙蜂負(fù)ECONNRESET(104)</strong></p> <p style="LINE-HEIGHT: normal">涓轟粈涔堜互涓婃祴璇曪紝閮芥槸瀵規(guī)柟宸茬粡涓柇socket鍚庯紝鍙戦佺鍐嶆write錛岀粨鏋滀細(xì)鏈夋墍涓嶅悓鍛€備粠鍚庢潵鎵懼埌鐨刄NP5.12,5.13鑳芥壘鍒扮瓟妗?/p> <p style="LINE-HEIGHT: normal"> <table style="TABLE-LAYOUT: auto; LINE-HEIGHT: normal; BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1> <tbody style="LINE-HEIGHT: normal"> <tr style="LINE-HEIGHT: normal"> <td style="FONT-SIZE: 12px; FILTER: none; VISIBILITY: visible! important; WORD-BREAK: break-all; LINE-HEIGHT: normal; ZOOM: 1! important; FONT-FAMILY: Arial; WORD-WRAP: break-word"> <p style="MARGIN: 5px; LINE-HEIGHT: 18px">The client's call to readline may happen before the server's RST is received by the client, or it may happen after. If the readline happens before the RST is received, as we've shown in our example, the result is an unexpected EOF in the client. But if the RST arrives first, the result is an ECONNRESET ("Connection reset by peer") error return from readline.</p> </td> </tr> </tbody> </table> </p> <p style="LINE-HEIGHT: normal">浠ヤ笂瑙i噴浜嗘祴璇?鐨勭幇璞★紝write鏃訛紝鏀跺埌RST.</p> <p style="LINE-HEIGHT: normal"> <table style="TABLE-LAYOUT: auto; LINE-HEIGHT: normal; BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1> <tbody style="LINE-HEIGHT: normal"> <tr style="LINE-HEIGHT: normal"> <td style="FONT-SIZE: 12px; FILTER: none; VISIBILITY: visible! important; WORD-BREAK: break-all; LINE-HEIGHT: normal; ZOOM: 1! important; FONT-FAMILY: Arial; WORD-WRAP: break-word"> <p style="MARGIN: 5px; LINE-HEIGHT: 18px">What happens if the client ignores the error return from readline and writes more data to the server? This can happen, for example, if the client needs to perform two writes to the server before reading anything back, with the first write eliciting the RST.</p> <p style="MARGIN: 5px; LINE-HEIGHT: 18px">The rule that applies is: When a process writes to a socket that has received an RST, the SIGPIPE signal is sent to the process. The default action of this signal is to terminate the process, so the process must catch the signal to avoid being involuntarily terminated.</p> <p style="MARGIN: 5px; LINE-HEIGHT: 18px">If the process either catches the signal and returns from the signal handler, or ignores the signal, the write operation returns EPIPE.</p> </td> </tr> </tbody> </table> </p> <p style="LINE-HEIGHT: normal">浠ヤ笂瑙i噴浜嗘祴璇?錛?鐨勭幇璞?write涓涓凡緇忔帴鍙楀埌RST鐨剆ocket錛岀郴緇熷唴鏍鎬細(xì)鍙戦丼IGPIPE緇欏彂閫佽繘紼嬶紝濡傛灉榪涚▼catch/ignore榪欎釜淇″彿錛寃rite閮借繑鍥濫PIPE閿欒.</p> <p style="LINE-HEIGHT: normal">鍥犳,UNP寤鴻搴旂敤鏍規(guī)嵁闇瑕佸鐞哠IGPIPE淇″彿錛岃嚦灝戜笉瑕佺敤緋葷粺緙虹渷鐨勫鐞嗘柟寮忓鐞嗚繖涓俊鍙鳳紝緋葷粺緙虹渷鐨勫鐞嗘柟寮忔槸閫鍑鴻繘紼嬶紝榪欐牱浣犵殑搴旂敤灝卞緢闅炬煡澶勫鐞嗚繘紼嬩負(fù)浠涔堥鍑恒?/p> <p style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" color=#0000ff>http://blog.csdn.net/shcyd/archive/2006/10/28/1354577.aspx</font></p> <p style="LINE-HEIGHT: normal">鍦║nix緋葷粺涓嬶紝濡傛灉send鍦ㄧ瓑寰呭崗璁紶閫佹暟鎹椂緗戠粶鏂紑鐨勮瘽錛岃皟鐢╯end鐨勮繘紼嬩細(xì)鎺ユ敹鍒頒竴涓猄IGPIPE淇″彿錛岃繘紼嬪璇ヤ俊鍙風(fēng)殑榛樿澶勭悊鏄繘紼嬬粓姝€?br style="LINE-HEIGHT: normal">鍦║nix緋葷粺涓嬶紝濡傛灉recv鍑芥暟鍦ㄧ瓑寰呭崗璁帴鏀舵暟鎹椂緗戠粶鏂紑浜嗭紝閭d箞璋冪敤recv鐨勮繘紼嬩細(xì)鎺ユ敹鍒頒竴涓猄IGPIPE淇″彿錛岃繘紼嬪璇ヤ俊鍙風(fēng)殑榛樿澶勭悊鏄繘紼嬬粓姝€?/p> <p style="LINE-HEIGHT: normal">澶勭悊鏂規(guī)硶錛?br style="LINE-HEIGHT: normal">鍦ㄥ垵濮嬪寲鏃惰皟鐢?strong style="LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" color=#333399>signal(SIGPIPE,SIG_IGN)</font></strong>蹇界暐璇ヤ俊鍙鳳紙鍙渶涓嬈★級<br style="LINE-HEIGHT: normal">鍏舵椂send鎴杛ecv鍑芥暟灝嗚繑鍥?1錛宔rrno涓篍PIPE錛屽彲瑙嗘儏鍐靛叧闂璼ocket鎴栧叾浠栧鐞?/p> <p style="LINE-HEIGHT: normal">gdb錛?br style="LINE-HEIGHT: normal">gdb榛樿鏀跺埌sigpipe鏃朵腑鏂▼搴忥紝鍙皟鐢?strong style="LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" color=#333399>handle SIGPIPE nostop print</font></strong></p> <p style="LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" color=#993300>鐩稿叧</font></p> <p style="LINE-HEIGHT: normal"><strong style="LINE-HEIGHT: normal">(1)SIG_DFL淇″彿涓撶敤鐨勯粯璁ゅ姩浣?</strong><br style="LINE-HEIGHT: normal">銆銆(a)濡傛灉榛樿鍔ㄤ綔鏄殏鍋滅嚎紼嬶紝鍒欒綰跨▼鐨勬墽琛岃鏆傛椂鎸傝搗銆傚綋綰跨▼鏆傚仠鏈熼棿錛屽彂閫佺粰綰跨▼鐨勪換浣曢檮鍔犱俊鍙烽兘涓嶄氦浠橈紝鐩村埌璇ョ嚎紼嬪紑濮嬫墽琛岋紝浣嗘槸SIGKILL闄ゅ銆?br style="LINE-HEIGHT: normal">銆銆(b)鎶婃寕璧蜂俊鍙風(fēng)殑淇″彿鍔ㄤ綔璁劇疆鎴怱IG_DFL錛屼笖鍏墮粯璁ゅ姩浣滄槸蹇界暐淇″彿 (SIGCHLD)銆?/p> <p style="LINE-HEIGHT: normal"><strong style="LINE-HEIGHT: normal">(2)SIG_IGN蹇界暐淇″彿</strong><br style="LINE-HEIGHT: normal">銆銆(a)璇ヤ俊鍙風(fēng)殑浜や粯瀵圭嚎紼嬫病鏈夊獎鍝?br style="LINE-HEIGHT: normal">銆銆(b)緋葷粺涓嶅厑璁告妸SIGKILL鎴朣IGTOP淇″彿鐨勫姩浣滆緗負(fù)SIG_DFL</p> <p style="LINE-HEIGHT: normal"><strong style="LINE-HEIGHT: normal">(3)鎸囧悜鍑芥暟鐨勬寚閽?-鎹曡幏淇″彿</strong><br style="LINE-HEIGHT: normal">銆銆(a)淇″彿涓緇忎氦浠橈紝鎺ユ敹綰跨▼灝卞湪鎸囧畾鍦板潃涓婃墽琛屼俊鍙鋒崟鑾風(fēng)▼搴忋傚湪淇″彿鎹?鑾峰嚱鏁拌繑鍥炲悗錛屾帴鍙楃嚎紼嬪繀欏誨湪琚腑鏂偣鎭㈠鎵ц銆?br style="LINE-HEIGHT: normal">銆銆(b)鐢–璇█鍑芥暟璋冪敤鐨勬柟娉曡繘鍏ヤ俊鍙鋒崟鎹夌▼搴?<br style="LINE-HEIGHT: normal">銆銆銆銆void func (signo)<br style="LINE-HEIGHT: normal">銆銆銆銆int signo;<br style="LINE-HEIGHT: normal">銆銆銆銆func( )鏄寚瀹氱殑淇″彿鎹曟崏鍑芥暟錛宻igno鏄琚氦浠樹俊鍙風(fēng)殑緙栫爜<br style="LINE-HEIGHT: normal">銆銆(c)濡傛灉SIGFPE,SIGILL鎴朣IGSEGV淇″彿涓嶆槸鐢盋鏍囧噯瀹氫箟鐨刱ill( )鎴杛aise( )鍑芥暟鎵鐢熸垚錛屽垯浠庝俊鍙稴IGFPE,SIGILL,SIGSEGV鐨勪俊鍙鋒崟鑾峰嚱鏁版甯歌繑鍥炲悗綰跨▼鐨勮涓烘槸鏈畾涔夌殑銆?br style="LINE-HEIGHT: normal">銆銆(d)緋葷粺涓嶅厑璁哥嚎紼嬫崟鑾稴IGKILL鍜孲IGSTOP淇″彿銆?br style="LINE-HEIGHT: normal">銆銆(e)濡傛灉綰跨▼涓篠IGCHLD淇″彿寤虹珛淇″彿鎹曡幏鍑芥暟錛岃岃綰跨▼鏈夋湭琚瓑寰呯殑浠ョ粓姝㈢殑瀛愮嚎紼嬫椂錛屾病鏈夎瀹氭槸鍚﹁鐢熸垚SIGCHLD淇″彿鏉ユ寚鏄庨偅涓瓙綰跨▼銆?/p> <p style="LINE-HEIGHT: normal">姣忎竴縐嶄俊鍙烽兘琚玂SKit緇欎簣浜嗕竴涓鍙峰悕錛屽浜?2浣嶇殑i386騫沖彴鑰岃█錛屼竴涓瓧32浣嶏紝鍥犺屼俊鍙鋒湁32縐嶃備笅闈㈢殑琛ㄧ粰鍑轟簡甯哥敤鐨勭鍙峰悕銆佹弿榪板拰瀹冧滑鐨勪俊鍙峰箋?/p> <p style="LINE-HEIGHT: normal">絎﹀彿鍚嶃銆淇″彿鍊?鎻忚堪銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄惁絎﹀悎POSIX<br style="LINE-HEIGHT: normal">SIGHUP銆銆1銆銆銆鍦ㄦ帶鍒剁粓绔笂媯嫻嬪埌鎸傛柇鎴栨帶鍒剁嚎紼嬫浜°銆鏄?br style="LINE-HEIGHT: normal">SIGINT銆銆2銆銆銆浜や簰娉ㄦ剰淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGQUIT銆 3銆銆銆浜や簰涓淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGILL銆銆4銆銆銆媯嫻嬪埌闈炴硶紜歡鐨勬寚浠ゃ銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGTRAP銆 5銆銆銆浠庨櫡闃變腑鍥炴湐銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br style="LINE-HEIGHT: normal">SIGABRT銆 6銆銆銆寮傚父緇堟淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGEMT銆銆7銆銆銆EMT 鎸囦護(hù)銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br style="LINE-HEIGHT: normal">SIGFPE銆銆8銆銆銆涓嶆紜殑綆楁湳鎿嶄綔淇″彿銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGKILL銆 9銆銆銆緇堟淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGBUS銆銆10銆銆 鎬葷嚎閿欒銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br style="LINE-HEIGHT: normal">SIGSEGV銆 11銆銆 媯嫻嬪埌闈炴硶鐨勫唴瀛樿皟鐢ㄣ銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGSYS銆銆12銆銆 緋葷粺call鐨勯敊璇弬鏁般銆銆銆銆銆銆銆銆銆銆鍚?br style="LINE-HEIGHT: normal">SIGPIPE銆 13銆銆 鍦ㄦ棤璇昏呯殑綆¢亾涓婂啓銆銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGALRM銆 14銆銆 鎶ユ椂淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGTERM銆 15銆銆 緇堟淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGURG銆銆16銆銆 IO淇¢亾绱фヤ俊鍙楓銆銆銆銆銆銆銆銆銆銆銆銆鍚?br style="LINE-HEIGHT: normal">SIGSTOP銆 17銆銆 鏆傚仠淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGTSTP銆 18銆銆 浜や簰鏆傚仠淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGCONT銆 19銆銆 濡傛灉鏆傚仠鍒欑戶緇銆銆銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGCHLD銆 20銆銆 瀛愮嚎紼嬬粓姝㈡垨鏆傚仠銆銆銆銆銆銆銆銆銆銆銆銆鏄?br style="LINE-HEIGHT: normal">SIGTTIN銆 21銆銆 鍚庡彴綰跨▼緇勪竴鎴愬憳璇曞浘浠庢帶鍒剁粓绔笂璇誨嚭銆銆鏄?br style="LINE-HEIGHT: normal">SIGTTOU銆 22銆銆 鍚庡彴綰跨▼緇勭殑鎴愬憳璇曞浘鍐欏埌鎺у埗緇堢涓娿銆銆鏄?br style="LINE-HEIGHT: normal">SIGIO銆銆 23銆銆 鍏佽I/O淇″彿 銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br style="LINE-HEIGHT: normal">SIGXCPU銆 24銆銆 瓚呭嚭CPU鏃墮檺銆銆銆銆銆銆銆銆銆銆銆銆銆銆 鍚?br style="LINE-HEIGHT: normal">SIGXFSZ銆 25銆銆 瓚呭嚭鏂囦歡澶у皬闄愬埗銆銆銆銆銆銆銆銆銆銆銆銆鍚?br style="LINE-HEIGHT: normal">SIGVTALRM 26銆銆 铏氭椂闂磋鎶ュ櫒銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br style="LINE-HEIGHT: normal">SIGPROF銆 27銆銆 渚ч潰鏃墮棿璀︽姤鍣ㄣ銆銆銆銆銆銆銆銆銆銆銆銆鍚?br style="LINE-HEIGHT: normal">SIGWINCH銆28銆銆 紿楀彛澶у皬鐨勬洿鏀廣銆銆銆銆銆銆銆銆銆銆銆銆鍚?br style="LINE-HEIGHT: normal">SIGINFO銆 29銆銆 娑堟伅璇鋒眰銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br style="LINE-HEIGHT: normal"><clk style="LINE-HEIGHT: normal"></clk>SIGUSR1 銆30銆銆 淇濈暀浣滀負(fù)<nobr style="COLOR: rgb(102,0,255); LINE-HEIGHT: normal; BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline">鐢ㄦ埛</nobr>鑷畾涔夌殑淇″彿1銆銆銆銆銆銆銆 鏄?br style="LINE-HEIGHT: normal">SIGUSR2 銆31銆銆 淇濈暀浣滀負(fù)鐢ㄦ埛鑷畾涔夌殑淇″彿銆銆銆銆銆銆銆銆鏄?span class=Apple-converted-space> </span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><font style="LINE-HEIGHT: normal" color=#ff6600>娉ㄦ剰</font>錛歀inux淇″彿鏈哄埗鍩烘湰涓婃槸浠嶶nix緋葷粺涓戶鎵胯繃鏉ョ殑銆傛棭鏈烾nix緋葷粺涓殑淇″彿鏈哄埗姣旇緝綆鍗曞拰鍘熷錛屽悗鏉ュ湪瀹炶返涓毚闇插嚭涓浜涢棶棰橈紝鍥犳錛屾妸閭d簺寤虹珛鍦ㄦ棭鏈熸満鍒朵笂鐨勪俊鍙峰彨鍋?涓嶅彲闈犱俊鍙?錛屼俊鍙峰煎皬浜嶴IGRTMIN(Red hat 7.2涓紝SIGRTMIN=32錛孲IGRTMAX=63)鐨勪俊鍙烽兘鏄笉鍙潬淇″彿銆傝繖灝辨槸"涓嶅彲闈犱俊鍙?鐨勬潵婧愩傚畠鐨勪富瑕侀棶棰樻槸錛氳繘紼嬫瘡嬈″鐞嗕俊鍙峰悗錛屽氨灝嗗淇″彿鐨勫搷搴旇緗負(fù)榛樿鍔ㄤ綔銆傚湪鏌愪簺鎯呭喌涓嬶紝灝嗗鑷村淇″彿鐨勯敊璇鐞嗭紱鍥犳錛岀敤鎴峰鏋滀笉甯屾湜榪欐牱鐨勬搷浣滐紝閭d箞灝辮鍦ㄤ俊鍙峰鐞嗗嚱鏁扮粨灝懼啀涓嬈¤皟鐢╯ignal()錛岄噸鏂板畨瑁呰淇″彿銆?/p> <p style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"></p> <p style="LINE-HEIGHT: normal"></p> <p style="LINE-HEIGHT: normal">鍙﹀錛屾垜鍐嶅仛涓浜涜ˉ鍏咃紝浜х敓RST鍝嶅簲浠ヨ嚦浜庣郴緇熷彂鍑篠IGPIPE淇″彿錛屽簲璇ュ垎涓轟袱縐嶆儏鍐?</p> <p style="LINE-HEIGHT: normal">1. 瀹㈡埛绔埌鏈嶅姟绔箣闂寸綉緇滄柇鎺夛紝鎴栬呮湇鍔$鏂數(shù)絳夛紝鐗╃悊榪炴帴鏂帀浜嗭紝榪欑鎯呭喌涓嬪鎴風(fēng)涓嶄細(xì)閫鍑猴紝send鍑芥暟姝e父鎵ц錛屼笉浼?xì)鎰熻鍒拌嚜宸卞嚭閿欍傚洜涓虹敱浜庣墿鐞嗙綉緇滄柇寮錛屾湇鍔$涓嶄細(xì)緇欏鎴風(fēng)鍥炲簲閿欒娑堟伅錛屾病鏈塕ST鍝嶅簲錛岃嚜鐒朵篃涓嶄細(xì)浜х敓SIGPIPE淇″彿銆備絾鏄綋鏈嶅姟绔啀鎭㈠姝e父鐨勬椂鍊欙紝瀵瑰鎴風(fēng)send鏉ョ殑娑堟伅浼?xì)漶旂敓RST鍝嶅簲錛屽鎴風(fēng)灝辨敹鍒癝IGPIPE淇″彿浜嗭紝紼嬪簭閫鍑猴紝浣嗘槸榪欐椂send鍑芥暟鏄兘澶熻繑鍥?-1鐨勩傚彲浠ヨ繘琛屽紓甯稿鐞嗐?/p> <p style="LINE-HEIGHT: normal">2.瀹㈡埛绔埌鏈嶅姟绔殑緗戠粶鑳介氾紝鏈嶅姟紼嬪簭鎸傛帀錛屽鎴風(fēng)紼嬪簭浼?xì)椹笂閫鍑猴紝鍥犱負(fù)鏈嶅姟绔兘姝e父榪斿洖閿欒娑堟伅錛屽鎴風(fēng)鏀跺埌錛孲IGPIPE淇″彿灝變駭鐢熶簡銆備笉榪囨垜涓嶇‘瀹氭鏃舵湇鍔$榪斿洖鏄殑RST鍝嶅簲錛屾姄鍖呮潵鐪嬫病鏈塕ST鏍囧織銆傛按騫蟲湁闄愶紝鍙啓鍒拌繖浜嗐?/p> <p style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"></p> <p style="LINE-HEIGHT: normal">鏂囩珷鍑哄錛?a style="LINE-HEIGHT: normal" ><u><font color=#0000ff>http://www.diybl.com/course/6_system/linux/Linuxjs/20081020/150832.html</font></u></a></p> </div> </td> </tr> </tbody> </table> </span></span><br class=Apple-interchange-newline> <img src ="http://www.shnenglu.com/elva/aggbug/90761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/elva/" target="_blank">鍙跺瓙</a> 2009-07-21 18:56 <a href="http://www.shnenglu.com/elva/archive/2009/07/21/90761.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍏充簬SIGPIPE瀵艱嚧鐨勭▼搴忛鍑?/title><link>http://www.shnenglu.com/elva/archive/2008/09/10/61544.html</link><dc:creator>鍙跺瓙</dc:creator><author>鍙跺瓙</author><pubDate>Wed, 10 Sep 2008 14:49:00 GMT</pubDate><guid>http://www.shnenglu.com/elva/archive/2008/09/10/61544.html</guid><wfw:comment>http://www.shnenglu.com/elva/comments/61544.html</wfw:comment><comments>http://www.shnenglu.com/elva/archive/2008/09/10/61544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/elva/comments/commentRss/61544.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/elva/services/trackbacks/61544.html</trackback:ping><description><![CDATA[<p>鏀墮泦涓浜涚綉涓婄殑璧勬枡錛屼互渚垮弬鑰冿細(xì)<br><br><a >http://blog.chinaunix.net/u2/69143/showart_1087349.html</a><br><br>     褰撴湇鍔″櫒close涓涓繛鎺ユ椂錛岃嫢client绔帴鐫鍙戞暟鎹傛牴鎹甌CP鍗忚鐨勮瀹氾紝浼?xì)鏀跺堫C竴涓猂ST鍝嶅簲錛宑lient鍐嶅線榪欎釜鏈嶅姟鍣ㄥ彂閫佹暟鎹椂錛岀郴緇熶細(xì)鍙戝嚭涓涓猄IGPIPE淇″彿緇欒繘紼嬶紝鍛婅瘔榪涚▼榪欎釜榪炴帴宸茬粡鏂紑浜嗭紝涓嶈鍐嶅啓浜嗐?br>    鏍規(guī)嵁淇″彿鐨勯粯璁ゅ鐞嗚鍒橲IGPIPE淇″彿鐨勯粯璁ゆ墽琛屽姩浣滄槸terminate(緇堟銆侀鍑?,鎵浠lient浼?xì)閫鍑恒傝嫢涓嶆兂瀹㈡埛绔鍑哄彲浠ユ妸SIGPIPE璁句負(fù)SIG_IGN<br><br>    濡?    signal(SIGPIPE,SIG_IGN);<br>    榪欐椂SIGPIPE浜ょ粰浜嗙郴緇熷鐞嗐?br><br>  鏈嶅姟鍣ㄩ噰鐢ㄤ簡fork鐨勮瘽錛岃鏀墮泦鍨冨溇榪涚▼錛岄槻姝㈠兊灝歌繘紼嬬殑浜х敓錛屽彲浠ヨ繖鏍峰鐞嗭細(xì)<br>  signal(SIGCHLD,SIG_IGN);銆浜ょ粰緋葷粺init鍘誨洖鏀躲?br>   榪欓噷瀛愯繘紼嬪氨涓嶄細(xì)浜х敓鍍靛案榪涚▼浜嗐?br><br><br>http://www.cublog.cn/u/31357/showart_242605.html</p> <br>濂戒箙娌″仛榪嘋寮鍙戜簡錛屾渶榪戦噸鎿嶆棫涓氥? <div>鍚鍙﹀涓涓」鐩粍socket寮鍙戦亣鍒伴棶棰橈紝鍙戦佺鍜屾帴鍙楃鏁版嵁澶у皬涓嶄竴鑷淬傚緩璁粬浠噰鐢╳riten鐨勯噸鍙戞満鍒訛紝浠ラ伩鍏嶄俊鍙蜂腑鏂敊璇傞噰鐢ㄥ悗榪樻槸鏈夐棶棰樸侾M璁╂垜甯繖鐮旂┒涓嬨?/div> <div>UNP n騫翠互鍓嶇湅榪囷紝寰堜箙娌″仛榪囧簳灞傚紑鍙戯紝鎵嬭竟涔熸病鏈塙NP vol1榪欐湰涔︼紝鎵浠ュ仛浜嗕釜嫻嬭瘯紼嬪簭錛岀爺絀朵笅瀹為檯鍙兘鍙戠敓鐨勬儏鍐典簡銆?/div> <div> </div> <div>嫻嬭瘯鐜錛欰S3鍜宺edhat 9(緙虹渷娌℃湁nc)</div> <div> </div> <div>鍏堜笅杞絬np婧愮爜:</div> <div>wget http://www.unpbook.com/unpv13e.tar.gz</div> <div>tar xzvf *.tar.gz;</div> <div>configure;make lib.</div> <div>鐒跺悗鍙傝僺tr_cli.c鍜宼cpcli01.c錛屽啓浜嗘祴璇曚唬鐮乧lient.c</div> <div> </div> <div> </div> <table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #0000cc;">#</span><span style="color: #ff0000;">include</span>    <span style="color: #ff00ff;">"unp.h"</span><br><br><span style="color: #0000cc;">#</span><span style="color: #ff0000;">define</span> MAXBUF 40960<br><span style="color: #0000ff;">void</span> processSignal<span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> signo<span style="color: #0000cc;">)</span><br><span style="color: #0000cc;">{</span><br>    <span style="color: #ff0000;">printf</span><span style="color: #0000cc;">(</span><span style="color: #ff00ff;">"Signal is %d\n"</span><span style="color: #0000cc;">,</span> signo<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br>    <span style="color: #ff0000;">signal</span><span style="color: #0000cc;">(</span>signo<span style="color: #0000cc;">,</span> processSignal<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br><span style="color: #0000cc;">}</span><br><span style="color: #0000ff;">void</span><br>str_cli<span style="color: #0000cc;">(</span><span style="color: #ff0000;">FILE</span> <span style="color: #0000cc;">*</span>fp<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">int</span> sockfd<span style="color: #0000cc;">)</span><br><span style="color: #0000cc;">{</span><br>    <span style="color: #0000ff;">char</span>    sendline<span style="color: #0000cc;">[</span>MAXBUF<span style="color: #0000cc;">]</span><span style="color: #0000cc;">,</span> recvline<span style="color: #0000cc;">[</span>MAXBUF<span style="color: #0000cc;">]</span><span style="color: #0000cc;">;</span><br><br>    <span style="color: #0000ff;">while</span> <span style="color: #0000cc;">(</span>1<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">{</span><br><br>        <span style="color: #ff0000;">memset</span><span style="color: #0000cc;">(</span>sendline<span style="color: #0000cc;">,</span> <span style="color: #ff00ff;">'a'</span><span style="color: #0000cc;">,</span> <span style="color: #0000ff;">sizeof</span><span style="color: #0000cc;">(</span>sendline<span style="color: #0000cc;">)</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br>        <span style="color: #ff0000;">printf</span><span style="color: #0000cc;">(</span><span style="color: #ff00ff;">"Begin send %d data\n"</span><span style="color: #0000cc;">,</span> MAXBUF<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br>        Writen<span style="color: #0000cc;">(</span>sockfd<span style="color: #0000cc;">,</span> sendline<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">sizeof</span><span style="color: #0000cc;">(</span>sendline<span style="color: #0000cc;">)</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br>        <span style="color: #ff0000;">sleep</span><span style="color: #0000cc;">(5</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br><br>    <span style="color: #0000cc;">}</span><br><span style="color: #0000cc;">}</span><br><br><span style="color: #0000ff;">int</span><br>main<span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> argc<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">char</span> <span style="color: #0000cc;">*</span><span style="color: #0000cc;">*</span>argv<span style="color: #0000cc;">)</span><br><span style="color: #0000cc;">{</span><br>    <span style="color: #0000ff;">int</span>                    sockfd<span style="color: #0000cc;">;</span><br>    <span style="color: #0000ff;">struct</span> <span style="color: #ff0000;">sockaddr_in</span>    servaddr<span style="color: #0000cc;">;</span><br><br>    <span style="color: #ff0000;">signal</span><span style="color: #0000cc;">(</span>SIGPIPE<span style="color: #0000cc;">,</span> <span style="color: #ff0000;">SIG_IGN</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br>    <span style="color: #ff9900;">//signal(SIGPIPE, processSignal);<br></span><br>    <span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span>argc <span style="color: #0000cc;">!</span><span style="color: #0000cc;">=</span> 2<span style="color: #0000cc;">)</span><br>        err_quit<span style="color: #0000cc;">(</span><span style="color: #ff00ff;">"usage: tcpcli [port]"</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br><br>    sockfd <span style="color: #0000cc;">=</span> <span style="color: #ff0000;">Socket</span><span style="color: #0000cc;">(</span><span style="color: #ff0000;">AF_INET</span><span style="color: #0000cc;">,</span> <span style="color: #ff0000;">SOCK_STREAM</span><span style="color: #0000cc;">,</span> 0<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br><br>    bzero<span style="color: #0000cc;">(</span><span style="color: #0000cc;">&</span>servaddr<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">sizeof</span><span style="color: #0000cc;">(</span>servaddr<span style="color: #0000cc;">)</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br>    servaddr<span style="color: #0000cc;">.</span>sin_family <span style="color: #0000cc;">=</span> <span style="color: #ff0000;">AF_INET</span><span style="color: #0000cc;">;</span><br>    servaddr<span style="color: #0000cc;">.</span>sin_port <span style="color: #0000cc;">=</span> <span style="color: #ff0000;">htons</span><span style="color: #0000cc;">(</span><span style="color: #ff0000;">atoi</span><span style="color: #0000cc;">(</span>argv<span style="color: #0000cc;">[</span>1<span style="color: #0000cc;">]</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br>    Inet_pton<span style="color: #0000cc;">(</span><span style="color: #ff0000;">AF_INET</span><span style="color: #0000cc;">,</span> <span style="color: #ff00ff;">"127.0.0.1"</span><span style="color: #0000cc;">,</span> <span style="color: #0000cc;">&</span>servaddr<span style="color: #0000cc;">.</span>sin_addr<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br><br>    <span style="color: #ff0000;">Connect</span><span style="color: #0000cc;">(</span>sockfd<span style="color: #0000cc;">,</span> <span style="color: #0000cc;">(</span>SA <span style="color: #0000cc;">*</span><span style="color: #0000cc;">)</span> <span style="color: #0000cc;">&</span>servaddr<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">sizeof</span><span style="color: #0000cc;">(</span>servaddr<span style="color: #0000cc;">)</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br><br>    str_cli<span style="color: #0000cc;">(</span><span style="color: #ff0000;">stdin</span><span style="color: #0000cc;">,</span> sockfd<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span>        <span style="color: #ff9900;">/* do it all */</span><br><br>    <span style="color: #ff0000;">exit</span><span style="color: #0000cc;">(</span>0<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br><span style="color: #0000cc;">}</span><br></span></code></p> </td> </tr> </tbody> </table> <p> </p> <p>涓轟簡鏂逛究瑙傚療閿欒杈撳嚭錛宭ib/writen.c涔熷仛浜嗕慨鏀癸紝鍔犱簡浜涙棩蹇楋細(xì)</p> <p> </p> <p> </p> <table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #ff9900;">/* include writen */</span><br><span style="color: #0000cc;">#</span><span style="color: #ff0000;">include</span>    <span style="color: #ff00ff;">"unp.h"</span><br><br>ssize_t                        <span style="color: #ff9900;">/* Write "n" bytes to a descriptor. */</span><br>writen<span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> fd<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #0000cc;">*</span>vptr<span style="color: #0000cc;">,</span> <span style="color: #ff0000;">size_t</span> n<span style="color: #0000cc;">)</span><br><span style="color: #0000cc;">{</span><br>    <span style="color: #ff0000;">size_t</span>        nleft<span style="color: #0000cc;">;</span><br>    ssize_t        nwritten<span style="color: #0000cc;">;</span><br>    <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span>    <span style="color: #0000cc;">*</span>ptr<span style="color: #0000cc;">;</span><br><br>    ptr <span style="color: #0000cc;">=</span> vptr<span style="color: #0000cc;">;</span><br>    nleft <span style="color: #0000cc;">=</span> n<span style="color: #0000cc;">;</span><br>    <span style="color: #0000ff;">while</span> <span style="color: #0000cc;">(</span>nleft <span style="color: #0000cc;">></span> 0<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">{</span><br>        <span style="color: #ff0000;">printf</span><span style="color: #0000cc;">(</span><span style="color: #ff00ff;">"Begin Writen %d\n"</span><span style="color: #0000cc;">,</span> nleft<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br>        <span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span> <span style="color: #0000cc;">(</span>nwritten <span style="color: #0000cc;">=</span> <span style="color: #ff0000;">write</span><span style="color: #0000cc;">(</span>fd<span style="color: #0000cc;">,</span> ptr<span style="color: #0000cc;">,</span> nleft<span style="color: #0000cc;">)</span><span style="color: #0000cc;">)</span> <span style="color: #0000cc;"><</span><span style="color: #0000cc;">=</span> 0<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">{</span><br>            <span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span>nwritten <span style="color: #0000cc;"><</span> 0 <span style="color: #0000cc;">&</span><span style="color: #0000cc;">&</span> <span style="color: #ff0000;">errno</span> <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span> EINTR<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">{</span><br>                <span style="color: #ff0000;">printf</span><span style="color: #0000cc;">(</span><span style="color: #ff00ff;">"intterupt\n"</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br>                nwritten <span style="color: #0000cc;">=</span> 0<span style="color: #0000cc;">;</span>        <span style="color: #ff9900;">/* and call write() again */</span><br>            <span style="color: #0000cc;">}</span><br>            <span style="color: #0000ff;">else</span><br>                <span style="color: #0000ff;">return</span><span style="color: #0000cc;">(</span><span style="color: #0000cc;">-</span>1<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span>            <span style="color: #ff9900;">/* error */</span><br>        <span style="color: #0000cc;">}</span><br><br>        nleft <span style="color: #0000cc;">-</span><span style="color: #0000cc;">=</span> nwritten<span style="color: #0000cc;">;</span><br>        ptr <span style="color: #0000cc;">+</span><span style="color: #0000cc;">=</span> nwritten<span style="color: #0000cc;">;</span><br>        <span style="color: #ff0000;">printf</span><span style="color: #0000cc;">(</span><span style="color: #ff00ff;">"Already write %d, left %d, errno=%d\n"</span><span style="color: #0000cc;">,</span> nwritten<span style="color: #0000cc;">,</span> nleft<span style="color: #0000cc;">,</span> <span style="color: #ff0000;">errno</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br>    <span style="color: #0000cc;">}</span><br>    <span style="color: #0000ff;">return</span><span style="color: #0000cc;">(</span>n<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br><span style="color: #0000cc;">}</span><br><span style="color: #ff9900;">/* end writen */</span><br><br><span style="color: #0000ff;">void</span><br>Writen<span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> fd<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">void</span> <span style="color: #0000cc;">*</span>ptr<span style="color: #0000cc;">,</span> <span style="color: #ff0000;">size_t</span> nbytes<span style="color: #0000cc;">)</span><br><span style="color: #0000cc;">{</span><br>    <span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span>writen<span style="color: #0000cc;">(</span>fd<span style="color: #0000cc;">,</span> ptr<span style="color: #0000cc;">,</span> nbytes<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">!</span><span style="color: #0000cc;">=</span> nbytes<span style="color: #0000cc;">)</span><br>        err_sys<span style="color: #0000cc;">(</span><span style="color: #ff00ff;">"writen error"</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br><span style="color: #0000cc;">}</span><br></span></code></p> </td> </tr> </tbody> </table> <p> </p> <p>client.c鏀懼湪tcpclieserv鐩綍涓嬶紝淇敼浜哅akefile錛屽鍔犱簡client.c鐨勭紪璇戠洰鏍?/p> <p> </p> <table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><br>client<span style="color: #0000cc;">:</span> client<span style="color: #0000cc;">.</span>c<br>                $<span style="color: #0000cc;">{</span>CC<span style="color: #0000cc;">}</span> $<span style="color: #0000cc;">{</span>CFLAGS<span style="color: #0000cc;">}</span> <span style="color: #0000cc;">-</span>o $@ $<span style="color: #0000cc;"><</span> $<span style="color: #0000cc;">{</span>LIBS<span style="color: #0000cc;">}</span><br></span></code></p> </td> </tr> </tbody> </table> <p> </p> <p>鎺ョ潃灝卞彲浠ュ紑濮嬫祴璇曚簡銆?/p> <h2>嫻嬭瘯1 蹇界暐SIGPIPE淇″彿錛寃riten涔嬪墠錛屽鏂瑰叧闂帴鍙楄繘紼?/h2> <p>鏈満鏈嶅姟绔細(xì)</p> <div>nc -l -p 30000</div> <div> </div> <div>鏈満瀹㈡埛绔?</div> <div>./client 30000</div> <div>Begin send 40960 data<br>Begin Writen 40960<br>Already write 40960, left 0, errno=0<br>Begin send 40960 data<br>Begin Writen 40960<br>Already write 40960, left 0, errno=0<br><font color="#ff0000">鎵ц鍒頒笂姝ュ仠姝㈡湇鍔$,client浼?xì)鐟艟l樉紺?</font></div> <div>Begin send 40960 data<br>Begin Writen 40960<br>writen error: Broken pipe(32)<br><strong>緇撹:鍙write涔嬪墠錛屽鏂箂ocket涓柇錛屽彂閫佺write浼?xì)杩斿?1,errno鍙蜂負(fù)EPIPE(32)</strong></div> <div> <h2>嫻嬭瘯2 catch SIGPIPE淇″彿錛寃riten涔嬪墠錛屽鏂瑰叧闂帴鍙楄繘紼?/h2> <p>淇敼瀹㈡埛绔唬鐮侊紝catch sigpipe淇″彿</p> <p> <table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><font face="鏂板畫浣?><span style="color: #ff9900;"><font color="#000000">        </font>//signal(SIGPIPE, SIG_IGN);<br></span><br>        <span style="color: #ff0000;">signal</span><span style="color: #0000cc;">(</span>SIGPIPE<span style="color: #0000cc;">,</span> processSignal<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span></font><br></span></code></p> </td> </tr> </tbody> </table> </p> <p>鏈満鏈嶅姟绔細(xì)</p> <div>nc -l -p 30000</div> <div> </div> <div>鏈満瀹㈡埛绔?</div> <div>make client</div> <div>./client 30000</div> </div> <div> <div>Begin send 40960 data<br>Begin Writen 40960<br>Already write 40960, left 0, errno=0<br>Begin send 40960 data<br>Begin Writen 40960<br>Already write 40960, left 0, errno=0<br><font color="#ff0000">鎵ц鍒頒笂姝ュ仠姝㈡湇鍔$,client浼?xì)鐟艟l樉紺?</font></div> <div>Begin send 40960 data<br>Begin Writen 40960<br>Signal is 13<br>writen error: Broken pipe(32)<br><strong>緇撹:鍙write涔嬪墠錛屽鏂箂ocket涓柇錛屽彂閫佺write鏃訛紝浼?xì)鍏堣皟鐢⊿IGPIPE鍝嶅簲鍑芥暟錛岀劧鍚巜rite榪斿洖-1,errno鍙蜂負(fù)EPIPE(32)</strong></div> <div><strong></strong> </div> <div> <h2>嫻嬭瘯3 writen榪囩▼涓紝瀵規(guī)柟鍏抽棴鎺ュ彈榪涚▼</h2> <p>涓轟簡鏂逛究鎿嶄綔錛屽姞澶?嬈rite鐨勬暟鎹噺錛屼慨鏀筂AXBUF涓?096000</p> <p>鏈満鏈嶅姟绔細(xì)</p> <div>nc -l -p 30000</div> <div> </div> <div>鏈満瀹㈡埛绔?</div> <div>make client</div> <div>./client 30000</div> <div> <div>Begin send 4096000 data<br>Begin Writen 4096000<br><font color="#ff0000">鎵ц鍒頒笂姝ュ仠姝㈡湇鍔$,client浼?xì)鐟艟l樉紺?</font></div> <div>Already write 589821, left 3506179, errno=0<br>Begin Writen 3506179<br>writen error: Connection reset by peer(104)<br><br><strong>緇撹:鍙socket write涓紝瀵規(guī)柟socket涓柇錛屽彂閫佺write浼?xì)鍏垬q斿洖宸茬粡鍙戦佺殑瀛楄妭鏁?鍐嶆write鏃惰繑鍥?1,errno鍙蜂負(fù)ECONNRESET(104)</strong></div> </div> <p>涓轟粈涔堜互涓婃祴璇曪紝閮芥槸瀵規(guī)柟宸茬粡涓柇socket鍚庯紝鍙戦佺鍐嶆write錛岀粨鏋滀細(xì)鏈夋墍涓嶅悓鍛€備粠鍚庢潵鎵懼埌鐨刄NP5.12,5.13鑳芥壘鍒扮瓟妗?/p> </div> </div> <table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%;">The client's call to readline may happen before the server's RST is received by the client, or it may happen after. If the readline happens before the RST is received, as we've shown in our example, the result is an unexpected EOF in the client. But if the RST arrives first, the result is an ECONNRESET ("Connection reset by peer") error return from readline. </p> </td> </tr> </tbody> </table> <p>浠ヤ笂瑙i噴浜嗘祴璇?鐨勭幇璞★紝write鏃訛紝鏀跺埌RST.</p> <table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%;">What happens if the client ignores the error return from readline and writes more data to the server? This can happen, for example, if the client needs to perform two writes to the server before reading anything back, with the first write eliciting the RST.</p> <p style="margin: 5px; line-height: 150%;">The rule that applies is: When a process writes to a socket that has received an RST, the SIGPIPE signal is sent to the process. The default action of this signal is to terminate the process, so the process must catch the signal to avoid being involuntarily terminated.</p> <p style="margin: 5px; line-height: 150%;">If the process either catches the signal and returns from the signal handler, or ignores the signal, the write operation returns EPIPE. </p> </td> </tr> </tbody> </table> <p>浠ヤ笂瑙i噴浜嗘祴璇?錛?鐨勭幇璞?write涓涓凡緇忔帴鍙楀埌RST鐨剆ocket錛岀郴緇熷唴鏍鎬細(xì)鍙戦丼IGPIPE緇欏彂閫佽繘紼嬶紝濡傛灉榪涚▼catch/ignore榪欎釜淇″彿錛寃rite閮借繑鍥濫PIPE閿欒.</p> <p>鍥犳,UNP寤鴻搴旂敤鏍規(guī)嵁闇瑕佸鐞哠IGPIPE淇″彿錛岃嚦灝戜笉瑕佺敤緋葷粺緙虹渷鐨勫鐞嗘柟寮忓鐞嗚繖涓俊鍙鳳紝緋葷粺緙虹渷鐨勫鐞嗘柟寮忔槸閫鍑鴻繘紼嬶紝榪欐牱浣犵殑搴旂敤灝卞緢闅炬煡澶勫鐞嗚繘紼嬩負(fù)浠涔堥鍑恒?/p> <br><a >http://blog.csdn.net/shcyd/archive/2006/10/28/1354577.aspx</a><br><br> <p>鍦║nix緋葷粺涓嬶紝濡傛灉send鍦ㄧ瓑寰呭崗璁紶閫佹暟鎹椂緗戠粶鏂紑鐨勮瘽錛岃皟鐢╯end鐨勮繘紼嬩細(xì)鎺ユ敹鍒頒竴涓猄IGPIPE淇″彿錛岃繘紼嬪璇ヤ俊鍙風(fēng)殑榛樿澶勭悊鏄繘紼嬬粓姝€?br>鍦║nix緋葷粺涓嬶紝濡傛灉recv鍑芥暟鍦ㄧ瓑寰呭崗璁帴鏀舵暟鎹椂緗戠粶鏂紑浜嗭紝閭d箞璋冪敤recv鐨勮繘紼嬩細(xì)鎺ユ敹鍒頒竴涓猄IGPIPE淇″彿錛岃繘紼嬪璇ヤ俊鍙風(fēng)殑榛樿澶勭悊鏄繘紼嬬粓姝€?/p> <p>澶勭悊鏂規(guī)硶錛?br>鍦ㄥ垵濮嬪寲鏃惰皟鐢?strong><font color="#333399">signal(SIGPIPE,SIG_IGN)</font></strong>蹇界暐璇ヤ俊鍙鳳紙鍙渶涓嬈★級<br>鍏舵椂send鎴杛ecv鍑芥暟灝嗚繑鍥?1錛宔rrno涓篍PIPE錛屽彲瑙嗘儏鍐靛叧闂璼ocket鎴栧叾浠栧鐞?/p> <p>gdb錛?br>gdb榛樿鏀跺埌sigpipe鏃朵腑鏂▼搴忥紝鍙皟鐢?strong><font color="#333399">handle SIGPIPE nostop print</font></strong></p> <p><font color="#993300">鐩稿叧</font><br></p> <p><strong>(1)SIG_DFL淇″彿涓撶敤鐨勯粯璁ゅ姩浣?</strong><br>銆銆(a)濡傛灉榛樿鍔ㄤ綔鏄殏鍋滅嚎紼嬶紝鍒欒綰跨▼鐨勬墽琛岃鏆傛椂鎸傝搗銆傚綋綰跨▼鏆傚仠鏈熼棿錛屽彂閫佺粰綰跨▼鐨勪換浣曢檮鍔犱俊鍙烽兘涓嶄氦浠橈紝鐩村埌璇ョ嚎紼嬪紑濮嬫墽琛岋紝浣嗘槸SIGKILL闄ゅ銆?br>銆銆(b)鎶婃寕璧蜂俊鍙風(fēng)殑淇″彿鍔ㄤ綔璁劇疆鎴怱IG_DFL錛屼笖鍏墮粯璁ゅ姩浣滄槸蹇界暐淇″彿 (SIGCHLD)銆?</p> <p><strong>(2)SIG_IGN蹇界暐淇″彿</strong><br>銆銆(a)璇ヤ俊鍙風(fēng)殑浜や粯瀵圭嚎紼嬫病鏈夊獎鍝?br>銆銆(b)緋葷粺涓嶅厑璁告妸SIGKILL鎴朣IGTOP淇″彿鐨勫姩浣滆緗負(fù)SIG_DFL </p> <p><strong>(3)鎸囧悜鍑芥暟鐨勬寚閽?-鎹曡幏淇″彿</strong><br>銆銆(a)淇″彿涓緇忎氦浠橈紝鎺ユ敹綰跨▼灝卞湪鎸囧畾鍦板潃涓婃墽琛屼俊鍙鋒崟鑾風(fēng)▼搴忋傚湪淇″彿鎹?鑾峰嚱鏁拌繑鍥炲悗錛屾帴鍙楃嚎紼嬪繀欏誨湪琚腑鏂偣鎭㈠鎵ц銆?br>銆銆(b)鐢–璇█鍑芥暟璋冪敤鐨勬柟娉曡繘鍏ヤ俊鍙鋒崟鎹夌▼搴?<br>銆銆銆銆void func (signo)<br>銆銆銆銆int signo;<br>銆銆銆銆func( )鏄寚瀹氱殑淇″彿鎹曟崏鍑芥暟錛宻igno鏄琚氦浠樹俊鍙風(fēng)殑緙栫爜<br>銆銆(c)濡傛灉SIGFPE,SIGILL鎴朣IGSEGV淇″彿涓嶆槸鐢盋鏍囧噯瀹氫箟鐨刱ill( )鎴杛aise( )鍑芥暟鎵鐢熸垚錛屽垯浠庝俊鍙稴IGFPE,SIGILL,SIGSEGV鐨勪俊鍙鋒崟鑾峰嚱鏁版甯歌繑鍥炲悗綰跨▼鐨勮涓烘槸鏈畾涔夌殑銆?br>銆銆(d)緋葷粺涓嶅厑璁哥嚎紼嬫崟鑾稴IGKILL鍜孲IGSTOP淇″彿銆?br>銆銆(e)濡傛灉綰跨▼涓篠IGCHLD淇″彿寤虹珛淇″彿鎹曡幏鍑芥暟錛岃岃綰跨▼鏈夋湭琚瓑寰呯殑浠ョ粓姝㈢殑瀛愮嚎紼嬫椂錛屾病鏈夎瀹氭槸鍚﹁鐢熸垚SIGCHLD淇″彿鏉ユ寚鏄庨偅涓瓙綰跨▼銆?br><br></p> <p>姣忎竴縐嶄俊鍙烽兘琚玂SKit緇欎簣浜嗕竴涓鍙峰悕錛屽浜?2浣嶇殑i386騫沖彴鑰岃█錛屼竴涓瓧32浣嶏紝鍥犺屼俊鍙鋒湁32縐嶃備笅闈㈢殑琛ㄧ粰鍑轟簡甯哥敤鐨勭鍙峰悕銆佹弿榪板拰瀹冧滑鐨勪俊鍙峰箋?</p> <p>絎﹀彿鍚嶃銆淇″彿鍊?鎻忚堪銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄惁絎﹀悎POSIX<br>SIGHUP銆銆1銆銆銆鍦ㄦ帶鍒剁粓绔笂媯嫻嬪埌鎸傛柇鎴栨帶鍒剁嚎紼嬫浜°銆鏄?br>SIGINT銆銆2銆銆銆浜や簰娉ㄦ剰淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGQUIT銆 3銆銆銆浜や簰涓淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGILL銆銆4銆銆銆媯嫻嬪埌闈炴硶紜歡鐨勬寚浠ゃ銆銆銆銆銆銆銆銆銆鏄?br>SIGTRAP銆 5銆銆銆浠庨櫡闃變腑鍥炴湐銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGABRT銆 6銆銆銆寮傚父緇堟淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGEMT銆銆7銆銆銆EMT 鎸囦護(hù)銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGFPE銆銆8銆銆銆涓嶆紜殑綆楁湳鎿嶄綔淇″彿銆銆銆銆銆銆銆銆銆銆鏄?br>SIGKILL銆 9銆銆銆緇堟淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGBUS銆銆10銆銆 鎬葷嚎閿欒銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGSEGV銆 11銆銆 媯嫻嬪埌闈炴硶鐨勫唴瀛樿皟鐢ㄣ銆銆銆銆銆銆銆銆銆鏄?br>SIGSYS銆銆12銆銆 緋葷粺call鐨勯敊璇弬鏁般銆銆銆銆銆銆銆銆銆銆鍚?br>SIGPIPE銆 13銆銆 鍦ㄦ棤璇昏呯殑綆¢亾涓婂啓銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGALRM銆 14銆銆 鎶ユ椂淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGTERM銆 15銆銆 緇堟淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGURG銆銆16銆銆 IO淇¢亾绱фヤ俊鍙楓銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGSTOP銆 17銆銆 鏆傚仠淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGTSTP銆 18銆銆 浜や簰鏆傚仠淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGCONT銆 19銆銆 濡傛灉鏆傚仠鍒欑戶緇銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGCHLD銆 20銆銆 瀛愮嚎紼嬬粓姝㈡垨鏆傚仠銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGTTIN銆 21銆銆 鍚庡彴綰跨▼緇勪竴鎴愬憳璇曞浘浠庢帶鍒剁粓绔笂璇誨嚭銆銆鏄?br>SIGTTOU銆 22銆銆 鍚庡彴綰跨▼緇勭殑鎴愬憳璇曞浘鍐欏埌鎺у埗緇堢涓娿銆銆鏄?br>SIGIO銆銆 23銆銆 鍏佽I/O淇″彿 銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGXCPU銆 24銆銆 瓚呭嚭CPU鏃墮檺銆銆銆銆銆銆銆銆銆銆銆銆銆銆 鍚?br>SIGXFSZ銆 25銆銆 瓚呭嚭鏂囦歡澶у皬闄愬埗銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGVTALRM 26銆銆 铏氭椂闂磋鎶ュ櫒銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGPROF銆 27銆銆 渚ч潰鏃墮棿璀︽姤鍣ㄣ銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGWINCH銆28銆銆 紿楀彛澶у皬鐨勬洿鏀廣銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGINFO銆 29銆銆 娑堟伅璇鋒眰銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGUSR1 銆30銆銆 淇濈暀浣滀負(fù)鐢ㄦ埛鑷畾涔夌殑淇″彿1銆銆銆銆銆銆銆 鏄?br>SIGUSR2 銆31銆銆 淇濈暀浣滀負(fù)鐢ㄦ埛鑷畾涔夌殑淇″彿銆銆銆銆銆銆銆銆鏄?nbsp;<br><br><font color="#ff6600">娉ㄦ剰</font>錛歀inux淇″彿鏈哄埗鍩烘湰涓婃槸浠嶶nix緋葷粺涓戶鎵胯繃鏉ョ殑銆傛棭鏈烾nix緋葷粺涓殑淇″彿鏈哄埗姣旇緝綆鍗曞拰鍘熷錛屽悗鏉ュ湪瀹炶返涓毚闇插嚭涓浜涢棶棰橈紝鍥犳錛屾妸閭d簺寤虹珛鍦ㄦ棭鏈熸満鍒朵笂鐨勪俊鍙峰彨鍋?涓嶅彲闈犱俊鍙?錛屼俊鍙峰煎皬浜嶴IGRTMIN(Red hat 7.2涓紝SIGRTMIN=32錛孲IGRTMAX=63)鐨勪俊鍙烽兘鏄笉鍙潬淇″彿銆傝繖灝辨槸"涓嶅彲闈犱俊鍙?鐨勬潵婧愩傚畠鐨勪富瑕侀棶棰樻槸錛氳繘紼嬫瘡嬈″鐞嗕俊鍙峰悗錛屽氨灝嗗淇″彿鐨勫搷搴旇緗負(fù)榛樿鍔ㄤ綔銆傚湪鏌愪簺鎯呭喌涓嬶紝灝嗗鑷村淇″彿鐨勯敊璇鐞嗭紱鍥犳錛岀敤鎴峰鏋滀笉甯屾湜榪欐牱鐨勬搷浣滐紝閭d箞灝辮鍦ㄤ俊鍙峰鐞嗗嚱鏁扮粨灝懼啀涓嬈¤皟鐢╯ignal()錛岄噸鏂板畨瑁呰淇″彿銆?/p> <br> <p><br></p> <p>鍙﹀錛屾垜鍐嶅仛涓浜涜ˉ鍏咃紝浜х敓RST鍝嶅簲浠ヨ嚦浜庣郴緇熷彂鍑篠IGPIPE淇″彿錛屽簲璇ュ垎涓轟袱縐嶆儏鍐?</p> <p>1. 瀹㈡埛绔埌鏈嶅姟绔箣闂寸綉緇滄柇鎺夛紝鎴栬呮湇鍔$鏂數(shù)絳夛紝鐗╃悊榪炴帴鏂帀浜嗭紝榪欑鎯呭喌涓嬪鎴風(fēng)涓嶄細(xì)閫鍑猴紝send鍑芥暟姝e父鎵ц錛屼笉浼?xì)鎰熻鍒拌嚜宸卞嚭閿欍傚洜涓虹敱浜庣墿鐞嗙綉緇滄柇寮錛屾湇鍔$涓嶄細(xì)緇欏鎴風(fēng)鍥炲簲閿欒娑堟伅錛屾病鏈塕ST鍝嶅簲錛岃嚜鐒朵篃涓嶄細(xì)浜х敓SIGPIPE淇″彿銆備絾鏄綋鏈嶅姟绔啀鎭㈠姝e父鐨勬椂鍊欙紝瀵瑰鎴風(fēng)send鏉ョ殑娑堟伅浼?xì)漶旂敓RST鍝嶅簲錛屽鎴風(fēng)灝辨敹鍒癝IGPIPE淇″彿浜嗭紝紼嬪簭閫鍑猴紝浣嗘槸榪欐椂send鍑芥暟鏄兘澶熻繑鍥?-1鐨勩傚彲浠ヨ繘琛屽紓甯稿鐞嗐?/p> <p>2.瀹㈡埛绔埌鏈嶅姟绔殑緗戠粶鑳介氾紝鏈嶅姟紼嬪簭鎸傛帀錛屽鎴風(fēng)紼嬪簭浼?xì)椹笂閫鍑猴紝鍥犱負(fù)鏈嶅姟绔兘姝e父榪斿洖閿欒娑堟伅錛屽鎴風(fēng)鏀跺埌錛孲IGPIPE淇″彿灝變駭鐢熶簡銆備笉榪囨垜涓嶇‘瀹氭鏃舵湇鍔$榪斿洖鏄殑RST鍝嶅簲錛屾姄鍖呮潵鐪嬫病鏈塕ST鏍囧織銆傛按騫蟲湁闄愶紝鍙啓鍒拌繖浜嗐?br></p><img src ="http://www.shnenglu.com/elva/aggbug/61544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/elva/" target="_blank">鍙跺瓙</a> 2008-09-10 22:49 <a href="http://www.shnenglu.com/elva/archive/2008/09/10/61544.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>perl 鎶妜ml鏂囦歡杞崲鎴恈sv鏂囦歡 http://www.shnenglu.com/elva/archive/2008/08/11/58549.html鍙跺瓙鍙跺瓙Mon, 11 Aug 2008 11:34:00 GMThttp://www.shnenglu.com/elva/archive/2008/08/11/58549.htmlhttp://www.shnenglu.com/elva/comments/58549.htmlhttp://www.shnenglu.com/elva/archive/2008/08/11/58549.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/58549.htmlhttp://www.shnenglu.com/elva/services/trackbacks/58549.html#!/usr/local/bin/perl

# use module
use XML::Simple;
use Data::Dumper;

# create object
$xml = new XML::Simple;

# read XML file
$data = $xml->XMLin("DebugInfo.xml", ForceArray => 1);

# print output
#print Dumper($data);
#print Dumper($data->{'employee'}[0]);
#print Dumper($data->{'employee'}[1]);

$data1=$data->{'DebugInfo'};

#print @{$data1};
open FILE,">>debug.log";
foreach $item (@{$data1}){
print FILE "${$item}{UID}[0],";
print FILE "${$item}{ChannelID}[0],";
print FILE "${$item}{IPAddress}[0],";
if (${$item}{BufferMapString}[0] =~/^HASH/)
{print FILE ",n";}
else{print FILE "${$item}{BufferMapString}[0]n"};
}
close FILE;



鍙跺瓙 2008-08-11 19:34 鍙戣〃璇勮
]]>
Linux瀵圭█鐤忥紙Sparse錛夋枃浠剁殑鏀寔http://www.shnenglu.com/elva/archive/2008/06/26/54662.html鍙跺瓙鍙跺瓙Thu, 26 Jun 2008 05:47:00 GMThttp://www.shnenglu.com/elva/archive/2008/06/26/54662.htmlhttp://www.shnenglu.com/elva/comments/54662.htmlhttp://www.shnenglu.com/elva/archive/2008/06/26/54662.html#Feedback1http://www.shnenglu.com/elva/comments/commentRss/54662.htmlhttp://www.shnenglu.com/elva/services/trackbacks/54662.html

紼鐤忥紙Sparse錛夋枃浠剁殑鍒涘緩

  1. 鍦‥XT2/EXT3鏂囦歡緋葷粺涓婂彲浠ヤ嬌鐢╠d鍒涘緩紼鐤忔枃浠訛細(xì)

    $ dd if=/dev/zero of=fs.img bs=1M seek=1024 count=0
    0+0 records in
    0+0 records out
    $ ls -lh fs.img
    -rw-rw-r--  1 zhigang zhigang 1.0G Feb  5 19:50 fs.img
    $ du -sh fs.img
    0       fs.img

  2. 浣跨敤C璇█鏉ュ垱寤轟竴涓█鐤忔枃浠剁殑鏂規(guī)硶濡備笅錛?br>
    $ cat sparse.c
    #include 
    <sys/types.h>
    #include 
    <sys/stat.h>
    #include 
    <fcntl.h>
    #include 
    <unistd.h>

    int main(int argc, char *argv[])
    {
        
    int fd = open("sparse.file", O_RDWR|O_CREAT);
        lseek(fd, 
    1024, SEEK_CUR);
        write(fd, 
    "\0"1);

        
    return 0;
    }


    $ gcc 
    -o sparse sparse.c
    $ .
    /sparse
    $ ls 
    -l sparse.file
    -r-x--x---  1 zhigang zhigang 1025 Feb  5 23:12 sparse.file
    ]$ du sparse.file
    4       sparse.file

  3.  浣跨敤python鏉ュ垱寤轟竴涓█鐤忔枃浠剁殑鏂規(guī)硶濡備笅錛?

    $ cat sparse.py
    #!/usr/bin/env python

    = open('fs.img''w')
    f.seek(
    1023)
    f.write(
    '\n')

    $ python sparse.py
    $ ls 
    -l fs.img
    -rw-rw-r--  1 zhigang zhigang 1024 Feb  5 20:15 fs.img
    $ du fs.img
    4       fs.img


    鏂囦歡紼鐤忓寲錛坰parsify錛?/strong>

    涓嬮潰鐨勬柟娉曢兘鍙互灝嗕竴涓枃浠剁█鐤忓寲銆?br>
    1. cp:

    $ cp --sparse=always file file.sparse


    cp緙虹渷浣跨敤--sparse=auto錛屼細(xì)鑷姩鎺㈡祴婧愭枃浠朵腑鏄惁鏈夌┖媧烇紝浠ュ喅瀹氱洰鏍囨枃浠舵槸鍚︿負(fù)紼鐤忔枃浠訛紱浣跨敤--sparse=never浼?xì)绂佹鍒涘缓绋鐤忔枃浠躲?br>
    2. cpio:

    $ find file |cpio -pdmuv --sparse /tmp


    濡傛灉涓嶅姞--sparse鍙傛暟錛岀█鐤忔枃浠朵腑鐨勭┖媧炲皢琚~婊°?

    3. tar:

    $ tar cSf - file | (cd /tmp/tt; tar xpSf -)


    濡傛灉涓嶅姞 -S --sparse鍙傛暟錛岀█鐤忔枃浠朵腑鐨勭┖媧炲皢琚~婊°?

    鏂囦歡紼鐤忓寲錛坰parsify錛夋晥鐜囨瘮杈?/strong>

    涓嬮潰鎴戜滑鍒涘緩涓涓?00M鐨勭█鐤忔枃浠訛紝姣旇緝涓涓嬪嚑縐嶆枃浠剁█鐤忓寲鏂規(guī)硶鐨勬晥鐜囥?

    $ dd if=/dev/zero of=file count=100 bs=1M seek=400
    100+0 records in
    100+0 records out
    $ time cp --sparse=always file file.sparse
    real    0m0.626s
    user    0m0.205s
    sys     0m0.390s

    $ time tar cSf - file | (cd /tmp; tar xpSf -)
    real    0m2.732s
    user    0m1.706s
    sys     0m0.915s

    $ time find file |cpio -pdmuv --sparse /tmp
    /tmp/file
    1024000 blocks
    real    0m2.763s
    user    0m1.793s
    sys     0m0.946s


    鐢辨鍙錛屼笂闈㈠嚑縐嶆枃浠剁█鐤忓寲鐨勬柟娉曚腑錛宑p鐨勬晥鐜囨渶楂橈紱tar鍜宑pio鐢變簬浣跨敤綆¢亾錛屾晥鐜囦笅闄嶃?

    浣縀XT2/EXT3鏂囦歡緋葷粺紼鐤忓寲錛坰parsify錛?/strong>

    濡備綍鏄竴涓枃浠剁郴緇熺殑鏄犲儚鏂囦歡紼鐤忓寲錛烺on Yorston涓哄ぇ瀹舵彁渚涗簡鍑犵鏂規(guī)硶錛屾垜瑙夊緱涓嬮潰鐨勬柟娉曟渶綆鍗曪細(xì)

    1. 浣跨敤Ron Yorston鐨?a >zerofree灝嗘枃浠剁郴緇熶腑鏈嬌鐢ㄧ殑鍧楁竻闆躲?br>

    $ gcc -o zerofree zerofree.c -lext2fs
    $ ./zerofree fs.img


    2.浣跨敤cp鍛戒護(hù)浣挎槧鍍忔枃浠剁█鐤忓寲錛?

    $ cp --sparse=always fs.img fs_sparse.img


     

    EXT2/EXT3鏂囦歡緋葷粺鐨剆parse_super鍙傛暟

    榪欎釜鍙傛暟涓嶦XT2/EXT3鏄惁鏀寔Sparse鏂囦歡鏃犲叧錛涘綋鎵撳紑璇ュ弬鏁版椂錛屾枃浠剁郴緇熷皢浣跨敤鏇村皯鐨勮秴綰у潡錛圫uper block錛夊浠斤紝浠ヨ妭鐪佺┖闂淬?/p>

    濡備笅鐨勫懡浠ゅ彲浠ユ煡鐪嬭鍙傛暟錛?br>

    # echo stats | debugfs /dev/hda2 | grep -i features
    Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file


    鎴栬咃細(xì)

    # tune2fs -l /dev/hda2 |grep "Filesystem features"
    Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file


    鍙互閫氳繃浣跨敤錛?

    # tune2fs -O sparse_super


    鎴栬咃細(xì)

    # tune2fs -s [0|1]


    鏉ヨ緗鍙傛暟銆?

    鍙傝冭祫鏂?br>

    1. Keeping filesystem images sparse:

              http://intgat.tigress.co.uk/rmy/uml/sparsify.html.



鍙跺瓙 2008-06-26 13:47 鍙戣〃璇勮
]]>
GDB璋冭瘯綺劇補(bǔ)鍙?qiáng)鋴社敤瀹炰?/title><link>http://www.shnenglu.com/elva/archive/2008/06/18/53848.html</link><dc:creator>鍙跺瓙</dc:creator><author>鍙跺瓙</author><pubDate>Wed, 18 Jun 2008 05:30:00 GMT</pubDate><guid>http://www.shnenglu.com/elva/archive/2008/06/18/53848.html</guid><wfw:comment>http://www.shnenglu.com/elva/comments/53848.html</wfw:comment><comments>http://www.shnenglu.com/elva/archive/2008/06/18/53848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/elva/comments/commentRss/53848.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/elva/services/trackbacks/53848.html</trackback:ping><description><![CDATA[ 涓錛氬垪鏂囦歡娓呭崟 <br>1錛?List <br>(gdb) list line1,line2 <br>浜岋細(xì)鎵ц紼嬪簭 <br>瑕佹兂榪愯鍑嗗璋冭瘯鐨勭▼搴忥紝鍙嬌鐢╮un鍛戒護(hù)錛屽湪瀹冨悗闈㈠彲浠ヨ窡闅忓彂緇欒紼嬪簭鐨勪換浣曞弬鏁幫紝鍖呮嫭鏍囧噯杈撳叆鍜屾爣鍑嗚緭鍑鴻鏄庣()鍜屽澹抽氶厤絎︼紙*銆侊紵銆乕銆乚錛夊湪鍐呫?<br>濡傛灉浣犱嬌鐢ㄤ笉甯﹀弬鏁扮殑run鍛戒護(hù)錛実db灝卞啀嬈′嬌鐢ㄤ綘緇欎簣鍓嶄竴鏉un鍛戒護(hù)鐨勫弬鏁幫紝榪欐槸寰堟湁鐢ㄧ殑銆?<br>鍒╃敤set args 鍛戒護(hù)灝卞彲浠ヤ慨鏀瑰彂閫佺粰紼嬪簭鐨勫弬鏁幫紝鑰屼嬌鐢╯how args 鍛戒護(hù)灝卞彲浠ユ煡鐪嬪叾緙虹渷鍙傛暟鐨勫垪琛ㄣ?<br>錛坓db錛塻et args –b –x <br>(gdb) show args <br>backtrace鍛戒護(hù)涓哄爢鏍堟彁渚涘悜鍚庤窡韙姛鑳姐?<br>Backtrace 鍛戒護(hù)浜х敓涓寮犲垪琛紝鍖呭惈鐫浠庢渶榪戠殑榪囩▼寮濮嬬殑鎵浠ユ湁鏁堣繃紼嬪拰璋冪敤榪欎簺榪囩▼鐨勫弬鏁般?<br>涓夛細(xì)鏄劇ず鏁版嵁 <br>鍒╃敤print 鍛戒護(hù)鍙互媯鏌ュ悇涓彉閲忕殑鍊箋?<br>(gdb) print p (p涓哄彉閲忓悕) <br>whatis 鍛戒護(hù)鍙互鏄劇ず鏌愪釜鍙橀噺鐨勭被鍨?<br>(gdb) whatis p <br>type = int * <br>print 鏄痝db鐨勪竴涓姛鑳藉緢寮虹殑鍛戒護(hù)錛屽埄鐢ㄥ畠鍙互鏄劇ず琚皟璇曠殑璇█涓換浣曟湁鏁堢殑琛ㄨ揪寮忋傝〃杈懼紡闄や簡鍖呭惈浣犵▼搴忎腑鐨勫彉閲忓錛岃繕鍙互鍖呭惈浠ヤ笅鍐呭錛?<br>l 瀵圭▼搴忎腑鍑芥暟鐨勮皟鐢?<br>(gdb) print find_entry(1,0) <br>l 鏁版嵁緇撴瀯鍜屽叾浠栧鏉傚璞?<br>(gdb) print *table_start <br>$8={e=reference=’\000’,location=0x0,next=0x0} <br>l 鍊肩殑鍘嗗彶鎴愬垎 <br>(gdb)print $1 ($1涓哄巻鍙茶褰曞彉閲?鍦ㄤ互鍚庡彲浠ョ洿鎺ュ紩鐢?$1 鐨勫? <br>l 浜轟負(fù)鏁扮粍 <br>浜轟負(fù)鏁扮粍鎻愪緵浜嗕竴縐嶅幓鏄劇ず瀛樺偍鍣ㄥ潡錛堟暟緇勮妭鎴栧姩鎬佸垎閰嶇殑瀛樺偍鍖猴級鍐呭鐨勬柟娉曘傛棭鏈熺殑璋冭瘯紼嬪簭娌℃湁寰堝ソ鐨勬柟娉曞皢浠繪剰鐨勬寚閽堟崲鎴愪竴涓暟緇勩傚氨鍍忓寰呭弬鏁頒竴鏍鳳紝璁╂垜浠煡鐪嬪唴瀛樹腑鍦ㄥ彉閲廻鍚庨潰鐨?0涓暣鏁幫紝涓涓姩鎬佹暟緇勭殑璇硶濡備笅鎵紺猴細(xì) <br>base@length <br>鍥犳錛岃鎯蟲樉紺哄湪h鍚庨潰鐨?0涓厓绱狅紝鍙互浣跨敤h@10錛?<br>(gdb)print h@10 <br>$13=(-1,345,23,-234,0,0,0,98,345,10) <br>鍥涳細(xì)<br><a target=_blank><font color=#00229c><u>鏂偣</u></font></a><br>(breakpoint) <br>break鍛戒護(hù)錛堝彲浠ョ畝鍐欎負(fù)b錛夊彲浠ョ敤鏉ュ湪璋冭瘯鐨勭▼搴忎腑璁劇疆鏂偣錛岃鍛戒護(hù)鏈夊涓嬪洓縐嶅艦寮忥細(xì) <br>l break line-number 浣跨▼搴忔伆濂藉湪鎵ц緇欏畾琛屼箣鍓嶅仠姝€?<br>l break function-name 浣跨▼搴忔伆濂藉湪榪涘叆鎸囧畾鐨勫嚱鏁頒箣鍓嶅仠姝€?<br>l break line-or-function if condition 濡傛灉condition錛堟潯浠訛級鏄湡錛岀▼搴忓埌杈炬寚瀹氳鎴栧嚱鏁版椂鍋滄銆?<br>l break routine-name 鍦ㄦ寚瀹氫緥紼嬬殑鍏ュ彛澶勮緗柇鐐?<br>濡傛灉璇ョ▼搴忔槸鐢卞緢澶氬師鏂囦歡鏋勬垚鐨勶紝浣犲彲浠ュ湪鍚勪釜鍘熸枃浠朵腑璁劇疆鏂偣錛岃屼笉鏄湪褰撳墠鐨勫師鏂囦歡涓緗柇鐐癸紝鍏舵柟娉曞涓嬶細(xì) <br>(gdb) break filename:line-number <br>(gdb) break filename:function-name <br>瑕佹兂璁劇疆涓涓潯浠舵柇鐐癸紝鍙互鍒╃敤break if鍛戒護(hù)錛屽涓嬫墍紺猴細(xì) <br>(gdb) break line-or-function if expr <br>渚嬶細(xì) <br>(gdb) break 46 if testsize==100 <br>浠庢柇鐐圭戶緇繍琛岋細(xì)countinue 鍛戒護(hù) <br>浜旓紟鏂偣鐨勭鐞?<br>1錛?鏄劇ず褰撳墠gdb鐨勬柇鐐逛俊鎭細(xì) <br>(gdb) info break <br>浠栦細(xì)浠ュ涓嬬殑褰㈠紡鏄劇ず鎵鏈夌殑鏂偣淇℃伅錛?<br>Num Type Disp Enb Address What <br>1 breakpoint keep y 0x000028bc in init_random at qsort2.c:155 <br>2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168 <br>(gdb) <br>2.鍒犻櫎鎸囧畾鐨勬煇涓柇鐐癸細(xì) <br>(gdb) delete breakpoint 1 <br>璇ュ懡浠ゅ皢浼?xì)鍒犻櫎缂栧彿湄?fù)1鐨勬柇鐐癸紝濡傛灉涓嶅甫緙栧彿鍙傛暟錛屽皢鍒犻櫎鎵鏈夌殑鏂偣 <br>(gdb) delete breakpoint <br>3.紱佹浣跨敤鏌愪釜鏂偣 <br>(gdb) disable breakpoint 1 <br>璇ュ懡浠ゅ皢紱佹鏂偣 1,鍚屾椂鏂偣淇℃伅鐨?(Enb)鍩熷皢鍙樹負(fù) n <br>4錛庡厑璁鎬嬌鐢ㄦ煇涓柇鐐?<br>(gdb) enable breakpoint 1 <br>璇ュ懡浠ゅ皢鍏佽鏂偣 1,鍚屾椂鏂偣淇℃伅鐨?(Enb)鍩熷皢鍙樹負(fù) y <br>5錛庢竻闄ゅ師鏂囦歡涓煇涓浠g爜琛屼笂鐨勬墍鏈夋柇鐐?<br>(gdb)clean number <br>娉細(xì)number 涓哄師鏂囦歡鐨勬煇涓唬鐮佽鐨勮鍙?<br>鍏紟鍙橀噺鐨勬鏌ュ拰璧嬪?<br>l whatis:璇嗗埆鏁扮粍鎴栧彉閲忕殑綾誨瀷 <br>l ptype:姣攚hatis鐨勫姛鑳芥洿寮猴紝浠栧彲浠ユ彁渚涗竴涓粨鏋勭殑瀹氫箟 <br>l set variable:灝嗗艱祴浜堝彉閲?<br>l print 闄や簡鏄劇ず涓涓彉閲忕殑鍊煎錛岃繕鍙互鐢ㄦ潵璧嬪?<br>涓冿紟鍗曟鎵ц <br>l next <br>涓嶈繘鍏ョ殑鍗曟鎵ц <br>l step <br>榪涘叆鐨勫崟姝ユ墽琛?<br>濡傛灉宸茬粡榪涘叆浜嗘煇鍑芥暟錛岃屾兂閫鍑鴻鍑芥暟榪斿洖鍒板畠鐨勮皟鐢ㄥ嚱鏁頒腑錛屽彲浣跨敤鍛戒護(hù)finish <br>鍏紟鍑芥暟鐨勮皟鐢?<br>l call name 璋冪敤鍜屾墽琛屼竴涓嚱鏁?<br>(gdb) call gen_and_sork( 1234,1,0 ) <br>(gdb) call printf(“abcd”) <br>$1=4 <br>l finish 緇撴潫鎵ц褰撳墠鍑芥暟錛屾樉紺哄叾榪斿洖鍊鹼紙濡傛灉鏈夌殑璇濓級 <br>涔?jié)锛庢満鍣ㄨ瑷宸ュ叿 <br>鏈変竴緇勪笓鐢ㄧ殑gdb鍙橀噺鍙互鐢ㄦ潵媯鏌ュ拰淇敼璁$畻鏈虹殑閫氱敤瀵勫瓨鍣紝gdb鎻愪緵浜嗙洰鍓嶆瘡涓鍙拌綆楁満涓疄闄呬嬌鐢ㄧ殑4涓瘎瀛樺櫒鐨勬爣鍑嗗悕瀛楋細(xì) <br>l $pc 錛?紼嬪簭璁℃暟鍣?<br>l $fp 錛?甯ф寚閽堬紙褰撳墠鍫嗘爤甯э級 <br>l $sp 錛?鏍堟寚閽?<br>l $ps 錛?澶勭悊鍣ㄧ姸鎬?<br>鍗侊紟淇″彿 <br>gdb<br>閫氬父鍙互鎹曟崏鍒板彂閫佺粰瀹冪殑澶у鏁頒俊鍙鳳紝閫氳繃鎹曟崏淇″彿錛屽畠?yōu)鍙啗_畾瀵逛簬姝e湪榪愯鐨勮繘紼嬭鍋氫簺浠涔堝伐浣溿備緥濡傦紝鎸塁TRL-C灝嗕腑鏂俊鍙峰彂閫佺粰gdb錛岄氬父灝?br>浼?xì)缁堟gdb銆備絾鏄綘鎴栬涓嶆兂涓柇gdb錛岀湡姝g殑鐩殑鏄涓柇gdb姝e湪榪愯鐨勭▼搴忥紝鍥犳錛実db瑕佹姄浣忚淇″彿騫跺仠姝㈠畠姝e湪榪愯鐨勭▼搴忥紝榪欐牱灝卞彲浠ユ墽琛屾煇<br>浜涜皟璇曟搷浣溿?<br>Handle鍛戒護(hù)鍙帶鍒朵俊鍙風(fēng)殑澶勭悊錛屼粬鏈変袱涓弬鏁幫紝涓涓槸淇″彿鍚嶏紝鍙︿竴涓槸鎺ュ彈鍒頒俊鍙鋒椂璇ヤ綔浠涔堛傚嚑縐嶅彲鑳界殑鍙傛暟鏄細(xì) <br>l nostop 鎺ユ敹鍒頒俊鍙鋒椂錛屼笉瑕佸皢瀹冨彂閫佺粰紼嬪簭錛屼篃涓嶈鍋滄紼嬪簭銆?<br>l stop 鎺ュ彈鍒頒俊鍙鋒椂鍋滄紼嬪簭鐨勬墽琛岋紝浠庤屽厑璁哥▼搴忚皟璇曪紱鏄劇ず涓鏉¤〃紺哄凡鎺ュ彈鍒頒俊鍙風(fēng)殑娑堟伅錛堢姝嬌鐢ㄦ秷鎭櫎澶栵級 <br>l print 鎺ュ彈鍒頒俊鍙鋒椂鏄劇ず涓鏉℃秷鎭?<br>l noprint 鎺ュ彈鍒頒俊鍙鋒椂涓嶈鏄劇ず娑堟伅錛堣屼笖闅愬惈鐫涓嶅仠姝㈢▼搴忚繍琛岋級 <br>l pass 灝嗕俊鍙峰彂閫佺粰紼嬪簭錛屼粠鑰屽厑璁鎬綘鐨勭▼搴忓幓澶勭悊瀹冦佸仠姝㈣繍琛屾垨閲囧彇鍒殑鍔ㄤ綔銆?<br>l nopass 鍋滄紼嬪簭榪愯錛屼絾涓嶈灝嗕俊鍙峰彂閫佺粰紼嬪簭銆?<br>渚嬪錛屽亣瀹氫綘鎴幏SIGPIPE淇″彿錛屼互闃叉姝e湪璋冭瘯鐨勭▼搴忔帴鍙楀埌璇ヤ俊鍙鳳紝鑰屼笖鍙璇ヤ俊鍙蜂竴鍒拌揪錛屽氨瑕佹眰璇ョ▼搴忓仠姝紝騫墮氱煡浣犮傝瀹屾垚榪欎竴浠誨姟錛屽彲鍒╃敤濡備笅鍛戒護(hù)錛?<br>(gdb) handle SIGPIPE stop print <br>璇鋒敞鎰忥紝UNIX鐨勪俊鍙峰悕鎬繪槸閲囩敤澶у啓瀛楁瘝錛佷綘鍙互鐢ㄤ俊鍙風(fēng)紪鍙鋒浛浠d俊鍙峰悕 <br>濡?br>鏋滀綘鐨勭▼搴忚鎵ц浠諱綍淇″彿澶勭悊鎿嶄綔錛屽氨闇瑕佽兘澶熸祴璇曞叾淇″彿澶勭悊紼嬪簭錛屼負(fù)姝わ紝灝遍渶瑕佷竴縐嶈兘灝嗕俊鍙峰彂閫佺粰紼嬪簭鐨勭畝渚挎柟娉曪紝榪欏氨鏄痵ignal鍛戒護(hù)鐨勪換鍔°傝<br>鍛戒護(hù)鐨勫弬鏁版槸涓涓暟瀛楁垨鑰呬竴涓悕瀛楋紝濡係IGINT銆傚亣瀹氫綘鐨勭▼搴忓凡灝嗕竴涓笓鐢ㄧ殑SIGINT錛堥敭鐩樿緭鍏ワ紝鎴朇TRL-C錛涗俊鍙?錛変俊鍙峰鐞嗙▼搴忚緗垚閲?br>鍙栨煇涓竻鐞嗗姩浣滐紝瑕佹兂嫻嬭瘯璇ヤ俊鍙峰鐞嗙▼搴忥紝浣犲彲浠ヨ緗竴涓柇鐐瑰茍浣跨敤濡備笅鍛戒護(hù)錛?<br>錛坓db錛?signal 2 <br>continuing with signal SIGINT(2) <br>璇ョ▼搴忕戶緇墽琛岋紝浣嗘槸绔嬪嵆浼犺緭璇ヤ俊鍙鳳紝鑰屼笖澶勭悊紼嬪簭寮濮嬭繍琛? <br>鍗佷竴. 鍘熸枃浠剁殑鎼滅儲 <br>search text:璇ュ懡浠ゅ彲鏄劇ず鍦ㄥ綋鍓嶆枃浠朵腑鍖呭惈text涓茬殑涓嬩竴琛屻?<br>Reverse-search text:璇ュ懡浠ゅ彲浠ユ樉紺哄寘鍚玹ext 鐨勫墠涓琛屻?<br>鍗佷簩.UNIX鎺ュ彛 <br>shell 鍛戒護(hù)鍙惎鍔║NIX澶栧3錛孋TRL-D閫鍑哄澹籌紝榪斿洖鍒?gdb. <br>鍗佷笁.鍛戒護(hù)鐨勫巻鍙?<br>涓轟簡鍏佽浣跨敤鍘嗗彶鍛戒護(hù)錛屽彲浣跨敤 set history expansion on 鍛戒護(hù) <br>(gdb) set history expansion on <br>灝忕粨錛氬父鐢ㄧ殑gdb鍛戒護(hù) <br>backtrace 鏄劇ず紼嬪簭涓殑褰撳墠浣嶇疆鍜岃〃紺哄浣曞埌杈懼綋鍓嶄綅緗殑鏍堣窡韙紙鍚屼箟璇嶏細(xì)where錛?<br>breakpoint 鍦ㄧ▼搴忎腑璁劇疆涓涓柇鐐?<br>cd 鏀瑰彉褰撳墠宸ヤ綔鐩綍 <br>clear 鍒犻櫎鍒氭墠鍋滄澶勭殑鏂偣 <br>commands 鍛戒腑鏂偣鏃訛紝鍒楀嚭灝嗚鎵ц鐨勫懡浠?<br>continue 浠庢柇鐐瑰紑濮嬬戶緇墽琛?<br>delete 鍒犻櫎涓涓柇鐐規(guī)垨鐩戞祴鐐癸紱涔熷彲涓庡叾浠栧懡浠や竴璧蜂嬌鐢?<br>display 紼嬪簭鍋滄鏃舵樉紺哄彉閲忓拰琛ㄨ揪鏃?<br>down 涓嬬Щ鏍堝撫錛屼嬌寰楀彟涓涓嚱鏁版垚涓哄綋鍓嶅嚱鏁?<br>frame 閫夋嫨涓嬩竴鏉ontinue鍛戒護(hù)鐨勫撫 <br>info 鏄劇ず涓庤紼嬪簭鏈夊叧鐨勫悇縐嶄俊鎭?<br>jump 鍦ㄦ簮紼嬪簭涓殑鍙︿竴鐐瑰紑濮嬭繍琛?<br>kill 寮傚父緇堟鍦╣db 鎺у埗涓嬭繍琛岀殑紼嬪簭 <br>list 鍒楀嚭鐩稿簲浜庢鍦ㄦ墽琛岀殑紼嬪簭鐨勫師鏂囦歡鍐呭 <br>next 鎵ц涓嬩竴涓簮紼嬪簭琛岋紝浠庤屾墽琛屽叾鏁翠綋涓殑涓涓嚱鏁?<br>print 鏄劇ず鍙橀噺鎴栬〃杈懼紡鐨勫?<br>pwd 鏄劇ず褰撳墠宸ヤ綔鐩綍 <br>pype 鏄劇ず涓涓暟鎹粨鏋勶紙濡備竴涓粨鏋勬垨C++綾伙級鐨勫唴瀹?<br>quit 閫鍑篻db <br>reverse-search 鍦ㄦ簮鏂囦歡涓弽鍚戞悳绱㈡瑙勮〃杈懼紡 <br>run 鎵ц璇ョ▼搴?<br>search 鍦ㄦ簮鏂囦歡涓悳绱㈡瑙勮〃杈懼紡 <br>set variable 緇欏彉閲忚祴鍊?<br>signal 灝嗕竴涓俊鍙峰彂閫佸埌姝e湪榪愯鐨勮繘紼?<br>step 鎵ц涓嬩竴涓簮紼嬪簭琛岋紝蹇呰鏃惰繘鍏ヤ笅涓涓嚱鏁?<br>undisplay display鍛戒護(hù)鐨勫弽鍛戒護(hù)錛屼笉瑕佹樉紺鴻〃杈懼紡 <br>until 緇撴潫褰撳墠寰幆 <br>up 涓婄Щ鏍堝撫錛屼嬌鍙︿竴鍑芥暟鎴愪負(fù)褰撳墠鍑芥暟 <br>watch 鍦ㄧ▼搴忎腑璁劇疆涓涓洃嫻嬬偣錛堝嵆鏁版嵁鏂偣錛?<br>whatis 鏄劇ず鍙橀噺鎴栧嚱鏁扮被鍨?<br>**************************************************** <br>銆GNU鐨勮皟璇曞櫒縐頒負(fù)gdb錛岃紼嬪簭鏄竴涓氦浜掑紡宸ュ叿錛屽伐浣滃湪瀛楃妯″紡銆傚湪 X Window 緋葷粺涓紝鏈変竴涓猤db鐨勫墠绔浘褰㈠伐鍏鳳紝縐頒負(fù)xxgdb銆俫db 鏄姛鑳藉己澶х殑璋冭瘯紼嬪簭錛屽彲瀹屾垚濡備笅鐨勮皟璇曚換鍔★細(xì) <br>銆銆* 璁劇疆鏂偣錛?<br>銆銆* 鐩戣紼嬪簭鍙橀噺鐨勫鹼紱 <br>銆銆* 紼嬪簭鐨勫崟姝ユ墽琛岋紱 <br>銆銆* 淇敼鍙橀噺鐨勫箋?<br>銆銆鍦ㄥ彲浠ヤ嬌鐢?gdb 璋冭瘯紼嬪簭涔嬪墠錛屽繀欏諱嬌鐢?-g 閫夐」緙栬瘧婧愭枃浠躲傚彲鍦?makefile 涓涓嬪畾涔?CFLAGS 鍙橀噺錛?<br>銆銆 CFLAGS = -g <br>銆銆 榪愯 gdb 璋冭瘯紼嬪簭鏃墮氬父浣跨敤濡備笅鐨勫懡浠わ細(xì) <br>銆銆 gdb progname <br>銆銆鍦?gdb 鎻愮ず絎﹀閿叆help錛屽皢鍒楀嚭鍛戒護(hù)鐨勫垎綾伙紝涓昏鐨勫垎綾繪湁錛?<br>銆銆* aliases錛氬懡浠ゅ埆鍚?<br>銆銆* breakpoints錛氭柇鐐瑰畾涔夛紱 <br>銆銆* data錛氭暟鎹煡鐪嬶紱 <br>銆銆* files錛氭寚瀹氬茍鏌ョ湅鏂囦歡錛?<br>銆銆* internals錛氱淮鎶ゅ懡浠わ紱 <br>銆銆* running錛氱▼搴忔墽琛岋紱 <br>銆銆* stack錛氳皟鐢ㄦ爤鏌ョ湅錛?<br>銆銆* statu錛氱姸鎬佹煡鐪嬶紱 <br>銆銆* tracepoints錛氳窡韙▼搴忔墽琛屻?<br>銆銆閿叆 help 鍚庤窡鍛戒護(hù)鐨勫垎綾誨悕錛屽彲鑾峰緱璇ョ被鍛戒護(hù)鐨勮緇嗘竻鍗曘?<br>gdb 鐨勫父鐢ㄥ懡浠?<br>鍛戒護(hù) 瑙i噴 <br>銆銆break NUM 鍦ㄦ寚瀹氱殑琛屼笂璁劇疆鏂偣銆?<br>銆銆bt 鏄劇ず鎵鏈夌殑璋冪敤鏍堝撫銆傝鍛戒護(hù)鍙敤鏉ユ樉紺哄嚱鏁扮殑璋冪敤欏哄簭銆?<br>銆銆clear 鍒犻櫎璁劇疆鍦ㄧ壒瀹氭簮鏂囦歡銆佺壒瀹氳涓婄殑鏂偣銆傚叾鐢ㄦ硶涓篶lear FILENAME:NUM <br>銆銆continue 緇х畫鎵ц姝e湪璋冭瘯鐨勭▼搴忋傝鍛戒護(hù)鐢ㄥ湪紼嬪簭鐢變簬澶勭悊淇″彿鎴栨柇鐐硅?瀵艱嚧鍋滄榪愯鏃躲?<br>銆銆display EXPR 姣忔紼嬪簭鍋滄鍚庢樉紺鴻〃杈懼紡鐨勫箋傝〃杈懼紡鐢辯▼搴忓畾涔夌殑鍙橀噺緇勬垚銆?<br>銆銆file FILE 瑁呰澆鎸囧畾鐨勫彲鎵ц鏂囦歡榪涜璋冭瘯銆?<br>銆銆help NAME 鏄劇ず鎸囧畾鍛戒護(hù)鐨勫府鍔╀俊鎭?<br>銆銆info break 鏄劇ず褰撳墠鏂偣娓呭崟錛屽寘鎷埌杈炬柇鐐瑰鐨勬鏁扮瓑銆?<br>銆銆info files 鏄劇ず琚皟璇曟枃浠剁殑璇︾粏淇℃伅銆?<br>銆銆info func 鏄劇ず鎵鏈夌殑鍑芥暟鍚嶇О銆?<br>銆銆info local 鏄劇ず褰撳嚱鏁頒腑鐨勫眬閮ㄥ彉閲忎俊鎭?<br>銆銆info prog 鏄劇ず琚皟璇曠▼搴忕殑鎵ц鐘舵併?<br>銆銆info var 鏄劇ず鎵鏈夌殑鍏ㄥ眬鍜岄潤鎬佸彉閲忓悕縐般?<br>銆銆kill 緇堟姝h璋冭瘯鐨勭▼搴忋?<br>銆銆list 鏄劇ず婧愪唬鐮佹銆?<br>銆銆make 鍦ㄤ笉閫鍑?gdb 鐨勬儏鍐典笅榪愯 make 宸ュ叿銆?<br>銆銆next 鍦ㄤ笉鍗曟鎵ц榪涘叆鍏朵粬鍑芥暟鐨勬儏鍐典笅錛屽悜鍓嶆墽琛屼竴琛屾簮浠g爜銆?<br>銆銆print EXPR 鏄劇ず琛ㄨ揪寮?EXPR 鐨勫箋?<br>******gdb 浣跨敤鑼冧緥************************ <br>----------------- <br>娓呭崟 涓涓湁閿欒鐨?C 婧愮▼搴?bugging.c <br>浠g爜: <br>----------------- <br>1銆錛僫 nclude <br>2 <br>3銆static char buff [256]; <br>4銆static char* string; <br>5銆int main () <br>6銆{ <br>7銆銆銆printf ("Please input a string: "); <br>8銆銆銆gets (string);銆銆 <br>9銆銆 printf ("\nYour string is: %s\n", string); <br>10 } <br>----------------- <br>銆 涓婇潰榪欎釜紼嬪簭闈炲父綆鍗曪紝鍏剁洰鐨勬槸鎺ュ彈鐢ㄦ埛鐨勮緭鍏ワ紝鐒跺悗灝嗙敤鎴風(fēng)殑杈撳叆鎵撳嵃鍑烘潵銆傝紼嬪簭浣跨敤浜嗕竴涓湭緇忚繃鍒濆鍖栫殑瀛楃涓插湴鍧 string錛屽洜姝わ紝緙栬瘧騫惰繍琛屼箣鍚庯紝灝嗗嚭鐜?Segment Fault 閿欒錛?<br>$ gcc -o bugging -g bugging.c <br>$ ./bugging <br>Please input a string: asfd <br>Segmentation fault (core dumped) <br>涓轟簡鏌ユ壘璇ョ▼搴忎腑鍑虹幇鐨勯棶棰橈紝鎴戜滑鍒╃敤 gdb錛屽茍鎸夊涓嬬殑姝ラ榪涜錛?<br>1錛庤繍琛?gdb bugging 鍛戒護(hù)錛岃鍏?bugging 鍙墽琛屾枃浠訛紱 <br>2錛庢墽琛岃鍏ョ殑 bugging 鍛戒護(hù) run錛?<br>3錛庝嬌鐢?where 鍛戒護(hù)鏌ョ湅紼嬪簭鍑洪敊鐨勫湴鏂癸紱 <br>4錛庡埄鐢?list 鍛戒護(hù)鏌ョ湅璋冪敤 gets 鍑芥暟闄勮繎鐨勪唬鐮侊紱 <br>5錛庡敮涓鑳藉瀵艱嚧 gets 鍑芥暟鍑洪敊鐨勫洜绱犲氨鏄彉閲?string銆傜敤print鍛戒護(hù)鏌ョ湅 string 鐨勫鹼紱 <br>6錛庡湪 gdb 涓紝鎴戜滑鍙互鐩存帴淇敼鍙橀噺鐨勫鹼紝鍙灝?string 鍙栦竴涓悎娉曠殑鎸囬拡鍊煎氨鍙互浜嗭紝涓烘錛屾垜浠湪絎?琛屽璁劇疆鏂偣 break 8錛?<br>7錛庣▼搴忛噸鏂拌繍琛屽埌絎?8琛屽鍋滄錛岃繖鏃訛紝鎴戜滑鍙互鐢?set variable 鍛戒護(hù)淇敼 string 鐨勫彇鍊鹼紱 <br>8錛庣劧鍚庣戶緇繍琛岋紝灝嗙湅鍒版紜殑紼嬪簭榪愯緇撴灉銆?br><br><br><strong>鏈枃鏉ヨ嚜ChinaUnix鍗氬錛屽鏋滄煡鐪嬪師鏂囪鐐癸細(xì)</strong><a target=_blank><u><font color=#0000ff>http://blog.chinaunix.net/u1/40912/showart_318499.html</font></u></a> <img src ="http://www.shnenglu.com/elva/aggbug/53848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/elva/" target="_blank">鍙跺瓙</a> 2008-06-18 13:30 <a href="http://www.shnenglu.com/elva/archive/2008/06/18/53848.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍖呮湯瀹夎瀹屽叏鏃訛紝鍑洪敊淇℃伅瑙e喅鍔炴硶http://www.shnenglu.com/elva/archive/2008/04/02/46069.html鍙跺瓙鍙跺瓙Wed, 02 Apr 2008 09:35:00 GMThttp://www.shnenglu.com/elva/archive/2008/04/02/46069.htmlhttp://www.shnenglu.com/elva/comments/46069.htmlhttp://www.shnenglu.com/elva/archive/2008/04/02/46069.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/46069.htmlhttp://www.shnenglu.com/elva/services/trackbacks/46069.html

You might want to run `apt-get -f install' to correct these:
The following packages have unmet dependencies:
sun-java6-jre: Depends: sun-java6-bin (= 6-00-2ubuntu2) but it is not going to be installed or
                          ia32-sun-java6-bin (= 6-00-2ubuntu2) but it is not installable
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

瑙e喅鏂規(guī)硶錛?br> sudo apt-get install -f


apt-get浣跨敤鍙傝冿細(xì)

apt-cache search # 鈥斺?package 鎼滅儲鍖?
apt-cache show #鈥斺?package 鑾峰彇鍖呯殑鐩稿叧淇℃伅錛屽璇存槑銆佸ぇ灝忋佺増鏈瓑)
sudo apt-get install # 鈥斺?package 瀹夎鍖?
sudo apt-get install # 鈥?#8211;(package - - reinstall 閲嶆柊瀹夎鍖?
sudo apt-get -f install # 鈥?#8211;(寮哄埗瀹夎?#”-f = –fix-missing”褰撴槸淇瀹夎鍚?#8230;)
sudo apt-get remove #鈥?#8211;(package 鍒犻櫎鍖?
sudo apt-get remove - - purge # 鈥斺?package 鍒犻櫎鍖咃紝鍖呮嫭鍒犻櫎閰嶇疆鏂囦歡絳?
sudo apt-get autoremove –purge # 鈥?(package 鍒犻櫎鍖呭強(qiáng)鍏朵緷璧栫殑杞歡鍖?閰嶇疆鏂囦歡絳夛紙鍙6.10鏈夋晥錛屽己鐑堟帹鑽愶級)
sudo apt-get update #鈥斺旀洿鏂版簮
sudo apt-get upgrade #鈥斺旀洿鏂板凡瀹夎鐨勫寘
sudo apt-get dist-upgrade # 鈥斺斺斿崌綰х郴緇?br> sudo apt-get dselect-upgrade #鈥斺斾嬌鐢?dselect 鍗囩駭
apt-cache depends #鈥斺?(package 浜嗚В浣跨敤渚濊禆)
apt-cache rdepends # 鈥斺?package 浜嗚В鏌愪釜鍏蜂綋鐨勪緷璧?#褰撴槸鏌ョ湅璇ュ寘琚摢浜涘寘渚濊禆鍚?#8230;)
sudo apt-get build-dep # 鈥斺?package 瀹夎鐩稿叧鐨勭紪璇戠幆澧?
apt-get source #鈥斺?package 涓嬭澆璇ュ寘鐨勬簮浠g爜)
sudo apt-get clean && sudo apt-get autoclean # 鈥斺?#8211;娓呯悊涓嬭澆鏂囦歡鐨勫瓨妗?&& 鍙竻鐞嗚繃鏃剁殑鍖?br> sudo apt-get check #鈥斺?媯鏌ユ槸鍚︽湁鎹熷潖鐨勪緷璧?/p>


鍙跺瓙 2008-04-02 17:35 鍙戣〃璇勮
]]>
Linux-C-Socket緙栫▼ http://www.shnenglu.com/elva/archive/2007/05/24/24733.html鍙跺瓙鍙跺瓙Wed, 23 May 2007 17:53:00 GMThttp://www.shnenglu.com/elva/archive/2007/05/24/24733.htmlhttp://www.shnenglu.com/elva/comments/24733.htmlhttp://www.shnenglu.com/elva/archive/2007/05/24/24733.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/24733.htmlhttp://www.shnenglu.com/elva/services/trackbacks/24733.html
瀹炵敤濂楁帴瀛楃殑鍥涗釜姝ラ:
1 鍒嗛厤絀洪棿鍜屽垵濮嬪寲
2 榪炴帴
3 浼犻佹暟鎹?br>4 鍏抽棴

鍏蜂綋綆楁硶:

鏈嶅姟鍣ㄧ:
#include <sys/socket.h>
#include <netinet/in.h>

int socket_descriptor;
socket_descriptor = socket(AF_INET, SOCK_STREAM, 0);

int port = 8000;
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
pin.sin_port = htons(port);

bind(socket_descriptor,(struct socketaddr *)&sin, sizeof(sin) );

listen(socket_descriptor, 1024);

struct sockaddr_in pin;
int address_size;
int temp_socket_descriptor;

while(1) {
  temp_socket_descriptor = accept(socket_descriptor,(struct socketaddr *)&pin,  sizeof(address_size));
  ......
  close(temp_socket_descriptor);
}


瀹㈡埛绔?
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>     //鐩存帴褰卞搷sockaddr_in.sin_addr鐨勫~鍐?br>
char * host_name = "127.0.0.1";
struct hostent * server_host_name;
server_host_name = gethostbyname(host_name);

int port = 8000;
struct sockaddr_in pin;
pin.sin_family = AF_INET;
pin.sin_addr.s_addr = htol(INADDR_ANY);
pin.sin_addr.s_addr = ((struct in_addr *)(server_host_name->h_addr))->s_addr; 鎴栬?pin.sin_addr = *(struct in_addr *) server_host_name->h_addr;
pin.sin_port = htons(port);

int socket_descriptor;
socket_descriptor = socket(AF_INET, SOCK_STREAM, 0);
connect(socket_descriptor, (void *)&pin, sizeof(pin));
.......
close(socket_descriptor);


鍙跺瓙 2007-05-24 01:53 鍙戣〃璇勮
]]>
openssh閰嶇疆璇存槑 http://www.shnenglu.com/elva/archive/2007/05/24/24734.html鍙跺瓙鍙跺瓙Wed, 23 May 2007 17:53:00 GMThttp://www.shnenglu.com/elva/archive/2007/05/24/24734.htmlhttp://www.shnenglu.com/elva/comments/24734.htmlhttp://www.shnenglu.com/elva/archive/2007/05/24/24734.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/24734.htmlhttp://www.shnenglu.com/elva/services/trackbacks/24734.html涓婚錛歰penssh閰嶇疆璇存槑

鐩稿叧鏂囦歡錛?br>  openssh-clients-2.9p2-7.rpm
  openssh-2.9p-7.rpm
  openssh-server-2.9p2-7

鍐呭錛?br>顥ヮ棩SSH鐨勮嫳鏂囧叏縐版槸Secure SHell銆傞氳繃浣跨敤SSH錛屼綘鍙互鎶婃墍鏈変紶杈撶殑鏁版嵁榪涜鍔犲瘑錛岃繖鏍?涓棿浜?榪欑鏀誨嚮鏂瑰紡灝變笉鍙兘瀹炵幇浜嗭紝鑰屼笖涔熻兘澶熼槻姝NS鍜孖P嬈洪獥銆傝繕鏈変竴涓澶栫殑濂藉灝辨槸浼犺緭鐨勬暟鎹槸緇忚繃鍘嬬緝鐨勶紝鎵浠ュ彲浠ュ姞蹇紶杈撶殑閫熷害銆係SH鏈夊緢澶氬姛鑳斤紝瀹冩棦鍙互浠f浛telnet錛屽張鍙互涓篺tp銆乸op銆佺敋鑷硃pp鎻愪緵涓涓畨鍏ㄧ殑"閫氶亾"銆?/p>

1.浠涔堟槸SSH錛?br>顥ヮ棩浼犵粺鐨勭綉緇滄湇鍔$▼搴忥紝濡傦細(xì)ftp銆乸op鍜宼elnet鍦ㄦ湰璐ㄤ笂閮芥槸涓嶅畨鍏ㄧ殑錛屽洜涓哄畠浠湪緗戠粶涓婄敤鏄庢枃浼犻佸彛浠ゅ拰鏁版嵁錛屽埆鏈夌敤蹇冪殑浜洪潪甯稿鏄撳氨鍙互鎴幏榪欎簺鍙d護(hù)鍜屾暟鎹傝屼笖錛岃繖浜涙湇鍔$▼搴忕殑瀹夊叏楠岃瘉鏂瑰紡涔熸槸鏈夊叾寮辯偣鐨勶紝灝辨槸寰堝鏄撳彈鍒?涓棿浜?錛坢an-in-the-middle錛夎繖縐嶆柟寮忕殑鏀誨嚮銆傛墍璋?涓棿浜?鐨勬敾鍑?yán)L柟寮忥紝灝辨槸"涓棿浜?鍐掑厖鐪熸鐨勬湇鍔″櫒鎺ユ敹浣犵殑浼犵粰鏈嶅姟鍣ㄧ殑鏁版嵁錛岀劧鍚庡啀鍐掑厖浣犳妸鏁版嵁浼犵粰鐪熸鐨勬湇鍔″櫒銆傛湇鍔″櫒鍜屼綘涔嬮棿鐨勬暟鎹紶閫佽"涓棿浜?涓杞墜鍋氫簡鎵嬭剼涔嬪悗錛屽氨浼?xì)鍑虹幇寰堜弗閲嶇殑闂銆?br>顥ヮ棩SSH鐨勮嫳鏂囧叏縐版槸Secure SHell銆傞氳繃浣跨敤SSH錛屼綘鍙互鎶婃墍鏈変紶杈撶殑鏁版嵁榪涜鍔犲瘑錛岃繖鏍?涓棿浜?榪欑鏀誨嚮鏂瑰紡灝變笉鍙兘瀹炵幇浜嗭紝鑰屼笖涔熻兘澶熼槻姝NS鍜孖P嬈洪獥銆傝繕鏈変竴涓澶栫殑濂藉灝辨槸浼犺緭鐨勬暟鎹槸緇忚繃鍘嬬緝鐨勶紝鎵浠ュ彲浠ュ姞蹇紶杈撶殑閫熷害銆係SH鏈夊緢澶氬姛鑳斤紝瀹冩棦鍙互浠f浛telnet錛屽張鍙互涓篺tp銆乸op銆佺敋鑷硃pp鎻愪緵涓涓畨鍏ㄧ殑"閫氶亾"銆?br>顥ヮ棩鏈鍒漇SH鏄敱鑺叞鐨勪竴瀹跺叕鍙稿紑鍙戠殑銆備絾鏄洜涓哄彈鐗堟潈鍜屽姞瀵嗙畻娉曠殑闄愬埗錛岀幇鍦ㄥ緢澶氫漢閮借漿鑰屼嬌鐢∣penSSH銆侽penSSH鏄疭SH鐨勬浛浠h蔣浠訛紝鑰屼笖鏄厤璐圭殑錛屽彲浠ラ璁″皢鏉ヤ細(xì)鏈夎秺鏉ヨ秺澶氱殑浜轟嬌鐢ㄥ畠鑰屼笉鏄疭SH銆?br>顥ヮ棩SSH鏄敱瀹㈡埛绔拰鏈嶅姟绔殑杞歡緇勬垚鐨勶紝鏈変袱涓笉鍏煎鐨勭増鏈垎鍒槸錛?.x鍜?.x銆傜敤SSH 2.x鐨勫鎴風(fēng)▼搴忔槸涓嶈兘榪炴帴鍒癝SH 1.x鐨勬湇鍔$▼搴忎笂鍘葷殑銆侽penSSH 2.x鍚屾椂鏀寔SSH 1.x鍜?.x銆?/p>

2.SSH鐨勫畨鍏ㄩ獙璇佹槸濡備綍宸ヤ綔鐨?br>顥ヮ棩浠庡鎴風(fēng)鏉ョ湅錛孲SH鎻愪緵涓ょ綰у埆鐨勫畨鍏ㄩ獙璇併?br>顥ヮ棩絎竴縐嶇駭鍒紙鍩轟簬鍙d護(hù)鐨勫畨鍏ㄩ獙璇侊級鍙浣犵煡閬撹嚜宸卞笎鍙峰拰鍙d護(hù)錛屽氨鍙互鐧誨綍鍒拌繙紼嬩富鏈恒傛墍鏈変紶杈撶殑鏁版嵁閮戒細(xì)琚姞瀵嗭紝浣嗘槸涓嶈兘淇濊瘉浣犳鍦ㄨ繛鎺ョ殑鏈嶅姟鍣ㄥ氨鏄綘鎯寵繛鎺ョ殑鏈嶅姟鍣ㄣ傚彲鑳戒細(xì)鏈夊埆鐨勬湇鍔″櫒鍦ㄥ啋鍏呯湡姝g殑鏈嶅姟鍣紝涔熷氨鏄彈鍒?涓棿浜?榪欑鏂瑰紡鐨勬敾鍑匯?br>顥ヮ棩絎簩縐嶇駭鍒紙鍩轟簬瀵嗗寵鐨勫畨鍏ㄩ獙璇侊級闇瑕佷緷闈犲瘑鍖欙紝涔熷氨鏄綘蹇呴』涓鴻嚜宸卞垱寤轟竴瀵瑰瘑鍖欙紝騫舵妸鍏敤瀵嗗寵鏀懼湪闇瑕佽闂殑鏈嶅姟鍣ㄤ笂銆傚鏋滀綘瑕佽繛鎺ュ埌SSH鏈嶅姟鍣ㄤ笂錛屽鎴風(fēng)杞歡灝變細(xì)鍚戞湇鍔″櫒鍙戝嚭璇鋒眰錛岃姹傜敤浣犵殑瀵嗗寵榪涜瀹夊叏楠岃瘉銆傛湇鍔″櫒鏀跺埌璇鋒眰涔嬪悗錛屽厛鍦ㄤ綘鍦ㄨ鏈嶅姟鍣ㄧ殑瀹剁洰褰曚笅瀵繪壘浣犵殑鍏敤瀵嗗寵錛岀劧鍚庢妸瀹冨拰浣犲彂閫佽繃鏉ョ殑鍏敤瀵嗗寵榪涜姣旇緝銆傚鏋滀袱涓瘑鍖欎竴鑷達(dá)紝鏈嶅姟鍣ㄥ氨鐢ㄥ叕鐢ㄥ瘑鍖欏姞瀵?璐ㄨ"錛坈hallenge錛夊茍鎶婂畠鍙戦佺粰瀹㈡埛绔蔣浠躲傚鎴風(fēng)杞歡鏀跺埌"璐ㄨ"涔嬪悗灝卞彲浠ョ敤浣犵殑縐佷漢瀵嗗寵瑙e瘑鍐嶆妸瀹冨彂閫佺粰鏈嶅姟鍣ㄣ?br>顥ヮ棩鐢ㄨ繖縐嶆柟寮忥紝浣犲繀欏葷煡閬撹嚜宸卞瘑鍖欑殑鍙d護(hù)銆備絾鏄紝涓庣涓縐嶇駭鍒浉姣旓紝絎簩縐嶇駭鍒笉闇瑕佸湪緗戠粶涓婁紶閫佸彛浠ゃ?br>顥ヮ棩絎簩縐嶇駭鍒笉浠呭姞瀵嗘墍鏈変紶閫佺殑鏁版嵁錛岃屼笖"涓棿浜?榪欑鏀誨嚮鏂瑰紡涔熸槸涓嶅彲鑳界殑錛堝洜涓轟粬娌℃湁浣犵殑縐佷漢瀵嗗寵錛夈備絾鏄暣涓櫥褰曠殑榪囩▼鍙兘闇瑕?0縐掋?/p>

3.瀹夎騫舵祴璇昈penSSH
顥ヮ棩鍥犱負(fù)鍙楀埌緹庡浗娉曞緥鐨勯檺鍒訛紝鍦ㄥ緢澶歀inux鐨勫彂琛岀増涓兘娌℃湁鍖呮嫭OpenSSH銆備絾鏄紝鍙互浠庣綉緇滀笂涓嬭澆騫跺畨瑁匫penSSH
顥ヮ棩瀹夎瀹孫penSSH涔嬪悗錛岀敤涓嬮潰鍛戒護(hù)嫻嬭瘯涓涓嬶細(xì)
ssh -l [your accountname on the remote host] [address of the remote host]

顥ヮ棩濡傛灉OpenSSH宸ヤ綔姝e父錛屼綘浼?xì)鐪嬪堫C笅闈㈢殑鎻愮ず淇℃伅錛?br>The authenticity of host [hostname] can't be established.
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.
Are you sure you want to continue connecting (yes/no)?
顥ヮ棩OpenSSH鍛婅瘔浣犲畠涓嶇煡閬撹繖鍙頒富鏈猴紝浣嗘槸浣犱笉鐢ㄦ媴蹇冭繖涓棶棰橈紝鍥犱負(fù)浣犳槸絎竴嬈$櫥褰曡繖鍙頒富鏈恒傞敭鍏?yes"銆傝繖灝嗘妸榪欏彴涓繪満鐨?璇嗗埆鏍囪"鍔犲埌"~/.ssh/know_hosts"鏂囦歡涓傜浜屾璁塊棶榪欏彴涓繪満鐨勬椂鍊欏氨涓嶄細(xì)鍐嶆樉紺鴻繖鏉℃彁紺轟俊鎭簡銆?br>顥ヮ棩鐒跺悗錛孲SH鎻愮ず浣犺緭鍏ヨ繙紼嬩富鏈轟笂浣犵殑甯愬彿鐨勫彛浠ゃ傝緭鍏ュ畬鍙d護(hù)涔嬪悗錛屽氨寤虹珛浜哠SH榪炴帴錛岃繖涔嬪悗灝卞彲浠ヨ薄浣跨敤telnet閭f牱浣跨敤SSH浜嗐?/p>

4.SSH鐨勫瘑鍖?br>4.1 鐢熸垚浣犺嚜宸辯殑瀵嗗寵瀵?br>顥ヮ棩鐢熸垚騫跺垎鍙戜綘鑷繁鐨勫瘑鍖欐湁涓や釜濂藉錛?br>鍙互闃叉"涓棿浜?榪欑鏀誨嚮鏂瑰紡
鍙互鍙敤涓涓彛浠ゅ氨鐧誨綍鍒版墍鏈変綘鎯崇櫥褰曠殑鏈嶅姟鍣ㄤ笂
鐢ㄤ笅闈㈢殑鍛戒護(hù)鍙互鐢熸垚瀵嗗寵錛?br>ssh-keygen顥ヮ棩濡傛灉榪滅▼涓繪満浣跨敤鐨勬槸SSH 2.x灝辮鐢ㄨ繖涓懡浠わ細(xì)

ssh-keygen -d顥ヮ棩鍦ㄥ悓涓鍙頒富鏈轟笂鍚屾椂鏈塖SH1鍜孲SH2鐨勫瘑鍖欐槸娌℃湁闂鐨勶紝鍥犱負(fù)瀵嗗寵鏄瓨鎴愪笉鍚岀殑鏂囦歡鐨勩?/p>

ssh-keygen鍛戒護(hù)榪愯涔嬪悗浼?xì)鏄窘C轟笅闈㈢殑淇℃伅錛?br>Generating RSA keys: ............................ooooooO......ooooooO
Key generation complete.
Enter file in which to save the key (/home/[user]/.ssh/identity):
[鎸変笅ENTER灝辮浜哴
Created directory '/home/[user]/.ssh'.
Enter passphrase (empty for no passphrase):
[杈撳叆鐨勫彛浠や笉浼?xì)鏄窘C哄湪灞忓箷涓奭
Enter same passphrase again:
[閲嶆柊杈撳叆涓閬嶅彛浠わ紝濡傛灉蹇樿浜嗗彛浠ゅ氨鍙兘閲嶆柊鐢熸垚涓嬈″瘑鍖欎簡]
Your identification has been saved in /home/[user]/.ssh/identity.
[榪欐槸浣犵殑縐佷漢瀵嗗寵]
Your public key has been saved in /home/[user]/.ssh/identity.pub.
The key fingerprint is: 2a:dc:71:2f:27:84:a2:e4:a1:1e:a9:63:e2:fa:a5:89 [user]@[local machine]
顥ヮ棩"ssh-keygen -d"鍋氱殑鏄嚑涔庡悓鏍風(fēng)殑浜嬶紝浣嗘槸鎶婁竴瀵瑰瘑鍖欏瓨涓猴紙榛樿鎯呭喌涓嬶級"/home/[user]/.ssh/id_dsa"錛堢浜哄瘑鍖欙級鍜?/home/[user]/.ssh/id_dsa.pub"錛堝叕鐢ㄥ瘑鍖欙級銆?/p>

顥ヮ棩鐜板湪浣犳湁涓瀵瑰瘑鍖欎簡錛氬叕鐢ㄥ瘑鍖欒鍒嗗彂鍒版墍鏈変綘鎯崇敤ssh鐧誨綍鐨勮繙紼嬩富鏈轟笂鍘伙紱縐佷漢瀵嗗寵瑕佸ソ濂藉湴淇濈闃叉鍒漢鐭ラ亾浣犵殑縐佷漢瀵嗗寵銆傜敤"ls -l ~/.ssh/identity"鎴?ls -l ~/.ssh/id_dsa"鎵鏄劇ず鐨勬枃浠剁殑璁塊棶鏉冮檺蹇呴』鏄?-rw-------"銆?br>顥ヮ棩濡傛灉浣犳鐤戣嚜宸辯殑瀵嗗寵宸茬粡琚埆浜虹煡閬撲簡錛屼笉瑕佽繜鐤戦┈涓婄敓鎴愪竴瀵規(guī)柊鐨勫瘑鍖欍傚綋鐒訛紝浣犺繕瑕侀噸鏂板垎鍙戜竴嬈″叕鐢ㄥ瘑鍖欍?/p>

4.2 鍒嗗彂鍏敤瀵嗗寵
顥ヮ棩鍦ㄦ瘡涓涓綘闇瑕佺敤SSH榪炴帴鐨勮繙紼嬫湇鍔″櫒涓婏紝浣犺鍦ㄨ嚜宸辯殑瀹剁洰褰曚笅鍒涘緩涓涓?.ssh"鐨勫瓙鐩綍錛屾妸浣犵殑鍏敤瀵嗗寵"identity.pub" 鎷瘋礉鍒拌繖涓洰褰曚笅騫舵妸瀹冮噸鍛藉悕涓?authorized_keys"銆傜劧鍚庢墽琛岋細(xì)
chmod 644 .ssh/authorized_keys
顥ヮ棩榪欎竴姝ユ槸蹇呬笉鍙皯鐨勩傚鏋滈櫎浜嗕綘涔嬪鍒漢瀵?authorized_keys"鏂囦歡涔熸湁鍐欑殑鏉冮檺錛孲SH灝變笉浼?xì)宸ヤ綔銆?br>顥ヮ棩濡傛灉浣犳兂浠庝笉鍚岀殑璁$畻鏈虹櫥褰曞埌榪滅▼涓繪満錛?authorized_keys"鏂囦歡涔熷彲浠ユ湁澶氫釜鍏敤瀵嗗寵銆傚湪榪欑鎯呭喌涓嬶紝蹇呴』鍦ㄦ柊鐨勮綆楁満涓婇噸鏂扮敓鎴愪竴瀵瑰瘑鍖欙紝鐒跺悗鎶婄敓鎴愮殑"identify.pub"鏂囦歡鎷瘋礉騫剁矘璐村埌榪滅▼涓繪満鐨?authorized_keys"鏂囦歡閲屻傚綋鐒跺湪鏂扮殑璁$畻鏈轟笂浣犲繀欏繪湁涓涓笎鍙鳳紝鑰屼笖瀵嗗寵鏄敤鍙d護(hù)淇濇姢鐨勩傛湁涓鐐瑰緢閲嶈錛屽氨鏄綋浣犲彇娑堜簡榪欎釜甯愬彿涔嬪悗錛屽埆蹇樹簡鎶婅繖涓瀵瑰瘑鍖欏垹鎺夈?/p>

5.閰嶇疆SSH
5.1 閰嶇疆瀹㈡埛绔殑杞歡
顥ヮ棩OpenSSH鏈変笁縐嶉厤緗柟寮忥細(xì)鍛戒護(hù)琛屽弬鏁般佺敤鎴烽厤緗枃浠跺拰緋葷粺綰х殑閰嶇疆鏂囦歡錛?/etc/ssh/ssh_config"錛夈傚懡浠よ鍙傛暟浼樺厛浜庨厤緗枃浠訛紝鐢ㄦ埛閰嶇疆鏂囦歡浼樺厛浜庣郴緇熼厤緗枃浠躲傛墍鏈夌殑鍛戒護(hù)琛岀殑鍙傛暟閮借兘鍦ㄩ厤緗枃浠朵腑璁劇疆銆傚洜涓哄湪瀹夎鐨勬椂鍊欐病鏈夐粯璁ょ殑鐢ㄦ埛閰嶇疆鏂囦歡錛屾墍浠ヨ鎶?/etc/ssh/ssh_config"鎷瘋礉騫墮噸鏂板懡鍚嶄負(fù)"~/.ssh/config"銆?br>顥ヮ棩鏍囧噯鐨勯厤緗枃浠跺ぇ姒傛槸榪欐牱鐨勶細(xì)
[lots of explanations and possible options listed]
# Be paranoid by default
Host *
ForwardAgent no
ForwardX11 no
FallBackToRsh no
顥ヮ棩榪樻湁寰堝閫夐」鐨勮緗彲浠ョ敤"man ssh"鏌ョ湅"CONFIGURATION FILES"榪欎竴绔犮?br>顥ヮ棩閰嶇疆鏂囦歡鏄寜欏哄簭璇誨彇鐨勩傚厛璁劇疆鐨勯夐」鍏堢敓鏁堛?br>顥ヮ棩鍋囧畾浣犲湪Host *fbc
HostName
www.foobar.com
User bilbo
ForwardAgent yes
Compression yes
# Be paranoid by default
Host *
ForwardAgent no
ForwardX11 no
FallBackToRsh no
顥ヮ棩浣犺緭鍏?ssh fbc"涔嬪悗錛孲SH浼?xì)鑷姩鍦颁粠閰嵕|枃浠朵腑鎵懼埌涓繪満鐨勫叏鍚嶏紝鐢ㄤ綘鐨勭敤鎴峰悕鐧誨綍騫朵笖鐢?ssh-agent"綆$悊鐨勫瘑鍖欒繘琛屽畨鍏ㄩ獙璇併傝繖鏍峰緢鏂逛究鍚э紒
顥ヮ棩鐢⊿SH榪炴帴鍒板叾瀹冭繙紼嬭綆楁満鐢ㄧ殑榪樻槸"paranoid錛堝亸鎵э級"榛樿璁劇疆銆傚鏋滄湁浜涢夐」娌℃湁鍦ㄩ厤緗枃浠舵垨鍛戒護(hù)琛屼腑璁劇疆錛岄偅涔堣繕鏄嬌鐢ㄩ粯璁ょ殑"paranoid"璁劇疆銆?br>顥ヮ棩鍦ㄦ垜浠笂闈婦鐨勯偅涓緥瀛愪腑錛屽浜庡埌顥ヮ棩鍏跺畠榪樻湁涓浜涢渶瑕佷粩緇嗙湅涓鐪嬬殑璁劇疆閫夐」鏄細(xì)
CheckHostIP yes   榪欎釜閫夐」鐢ㄦ潵榪涜IP鍦板潃鐨勬鏌ヤ互闃叉DNS嬈洪獥銆?/p>

CompressionLevel  鍘嬬緝鐨勭駭鍒粠"1"錛堟渶蹇級鍒?9"錛堝帇緙╃巼鏈楂橈級銆傞粯璁ゅ間負(fù)"6"銆?/p>

ForwardX11 yes  涓轟簡鍦ㄦ湰鍦拌繍琛岃繙紼嬬殑X紼嬪簭蹇呴』璁劇疆榪欎釜閫夐」銆?/p>

LogLevel DEBUG  褰揝SH鍑虹幇闂鐨勬椂鍊欙紝榪欓夐」灝卞緢鏈夌敤浜嗐傞粯璁ゅ間負(fù)"INFO"銆?/p>

5.2 閰嶇疆鏈嶅姟绔殑杞歡
顥ヮ棩SSH鏈嶅姟鍣ㄧ殑閰嶇疆浣跨敤鐨勬槸"/etc/ssh/sshd_config"閰嶇疆鏂囦歡錛岃繖浜涢夐」鐨勮緗湪閰嶇疆鏂囦歡涓凡緇忔湁浜嗕竴浜涜鏄庤屼笖鐢?man sshd"涔熷彲浠ユ煡鐪嬪府鍔┿傝娉ㄦ剰OpenSSH瀵逛簬SSH 1.x鍜?.x娌℃湁涓嶅悓鐨勯厤緗枃浠躲?br>顥ヮ棩鍦ㄩ粯璁ょ殑璁劇疆閫夐」涓渶瑕佹敞鎰忕殑鏈夛細(xì)
PermitRootLogin yes   鏈濂芥妸榪欎釜閫夐」璁劇疆鎴?PermitRootLogin without-password"錛岃繖鏍?root"鐢ㄦ埛灝變笉鑳戒粠娌℃湁瀵嗗寵鐨勮綆楁満涓婄櫥褰曘傛妸榪欎釜閫夐」璁劇疆鎴?no"灝嗙姝?root"鐢ㄦ埛鐧誨綍錛屽彧鑳界敤"su"鍛戒護(hù)浠庢櫘閫氱敤鎴瘋漿鎴?root"銆?br>X11Forwarding no   鎶婅繖涓夐」璁劇疆鎴?yes"鍏佽鐢ㄦ埛榪愯榪滅▼涓繪満涓婄殑X紼嬪簭銆傚氨綆楃姝㈣繖涓夐」涔熶笉鑳芥彁楂樻湇鍔″櫒鐨勫畨鍏ㄥ洜涓虹敤鎴峰彲浠ュ畨瑁呬粬浠嚜宸辯殑杞彂鍣紙forwarder錛夛紝璇峰弬鐪?man sshd"銆?br>PasswordAuthentication yes  鎶婅繖涓夐」璁劇疆涓?no"鍙厑璁哥敤鎴風(fēng)敤鍩轟簬瀵嗗寵鐨勬柟寮忕櫥褰曘傝繖褰撶劧浼?xì)缁欓偅浜浘l忓父闇瑕佷粠涓嶅悓涓繪満鐧誨綍鐨勭敤鎴峰甫鏉ラ夯鐑︼紝浣嗘槸榪欒兘澶熷湪寰堝ぇ紼嬪害涓婃彁楂樼郴緇熺殑瀹夊叏鎬с傚熀浜庡彛浠ょ殑鐧誨綍鏂瑰紡鏈夊緢澶х殑寮辯偣銆?br># Subsystem /usr/local/sbin/sftpd   鎶婃渶鍓嶉潰鐨勶純鍙峰幓鎺夊茍涓旀妸璺緞鍚嶈緗垚"/usr/bin/sftpserv"錛岀敤鎴峰氨鑳戒嬌鐢?sftp"錛堝畨鍏ㄧ殑FTP錛変簡錛坰ftpserv鍦╯ftp杞歡鍖呬腑錛夈傚洜涓哄緢澶氱敤鎴峰FTP姣旇緝鐔熸?zhèn)夎屼笖"scp"鐢ㄨ搗鏉ヤ篃鏈変竴浜涢夯鐑︼紝鎵浠?sftp"榪樻槸寰堟湁鐢ㄧ殑銆傝屼笖2.0.7鐗堟湰浠ュ悗鐨勫浘褰㈠寲鐨刦tp宸ュ叿"gftp"涔熸敮鎸?sftp"銆?/p>

6.鎷瘋礉鏂囦歡
6.1 鐢?scp"鎷瘋礉鏂囦歡
顥ヮ棩SSH鎻愪緵浜嗕竴浜涘懡浠ゅ拰shell鐢ㄦ潵鐧誨綍榪滅▼鏈嶅姟鍣ㄣ傚湪榛樿鎯呭喌涓嬪畠涓嶅厑璁鎬綘鎷瘋礉鏂囦歡錛屼絾鏄繕鏄彁渚涗簡涓涓?scp"鍛戒護(hù)銆?br>顥ヮ棩鍋囧畾浣犳兂鎶婃湰鍦拌綆楁満褰撳墠鐩綍涓嬬殑涓涓悕涓?dumb"鐨勬枃浠舵嫹璐濆埌榪滅▼鏈嶅姟鍣?a 銆?br>鍙互鐢ㄨ繖涓懡浠わ細(xì)scp dumb
bilbo@www.foobar.com:.
鎶婃枃浠舵嫹璐濆洖鏉ョ敤榪欎釜鍛戒護(hù)錛歴cp bilbo@www.foobar.com:dumb .
顥ヮ棩"scp"璋冪敤SSH榪涜鐧誨綍錛岀劧鍚庢嫹璐濇枃浠訛紝鏈鍚庤皟鐢⊿SH鍏抽棴榪欎釜榪炴帴銆?br>顥ヮ棩濡傛灉鍦ㄤ綘鐨?~/.ssh/config"鏂囦歡涓凡緇忎負(fù)www.foobar.com鍋氫簡榪欐牱鐨勯厤緗細(xì)
Host *fbc
HostName www.foobar.com
User bilbo
ForwardAgent yes
顥ヮ棩閭d箞浣犲氨鍙互鐢?fbc"鏉ヤ唬鏇?bilbo@www.foobar.com"錛屽懡浠ゅ氨綆鍖栦負(fù)"scp dumb fbc:."銆?br>顥ヮ棩"scp"鍋囧畾浣犲湪榪滅▼涓繪満涓婄殑瀹剁洰褰曚負(fù)浣犵殑宸ヤ綔鐩綍銆傚鏋滀綘浣跨敤鐩稿鐩綍灝辮鐩稿浜庡鐩綍銆?br>顥ヮ棩鐢?scp"鍛戒護(hù)鐨?-r"鍙傛暟鍏佽閫掑綊鍦版嫹璐濈洰褰曘?scp"涔熷彲浠ュ湪涓や釜涓嶅悓鐨勮繙紼嬩富鏈轟箣闂存嫹璐濇枃浠躲?br>顥ヮ棩鏈夋椂鍊欎綘鍙兘浼?xì)璇曞浘浣湗q欐牱鐨勪簨錛氱敤SSH鐧誨綍鍒?a scp [local machine]:dumb ."鎯崇敤瀹冩妸鏈湴鐨?dumb"鏂囦歡鎷瘋礉鍒頒綘褰撳墠鐧誨綍鐨勮繙紼嬫湇鍔″櫒涓娿傝繖鏃跺欎綘浼?xì)鐪嬪堫C笅闈㈢殑鍑洪敊淇℃伅錛?br>顥ヮ棩ssh: secure connection to [local machine] refused
顥ヮ棩涔嬫墍浠ヤ細(xì)鍑虹幇榪欐牱鐨勫嚭閿欎俊鎭槸鍥犱負(fù)浣犺繍琛岀殑鏄繙紼嬬殑"scp"鍛戒護(hù)錛屽畠璇曞浘鐧誨綍鍒板湪浣犳湰鍦拌綆楁満涓婅繍琛岀殑SSH鏈嶅姟紼嬪簭……鎵浠ユ渶濂藉湪鏈湴榪愯"scp"闄ら潪浣犵殑鏈湴璁$畻鏈轟篃榪愯SSH鏈嶅姟紼嬪簭銆?/p>

顥ヮ棩6.2 鐢?sftp"鎷瘋礉鏂囦歡
顥ヮ棩濡傛灉浣犱範(fàn)鎯嬌鐢╢tp鐨勬柟寮忔嫹璐濇枃浠訛紝鍙互璇曠潃鐢?sftp"銆?sftp"寤虹珛鐢⊿SH鍔犲瘑鐨勫畨鍏ㄧ殑FTP榪炴帴閫氶亾錛屽厑璁鎬嬌鐢ㄦ爣鍑嗙殑ftp鍛戒護(hù)銆傝繕鏈変竴涓ソ澶勫氨鏄?sftp"鍏佽浣犻氳繃"exec"鍛戒護(hù)榪愯榪滅▼鐨勭▼搴忋備粠2.0.7鐗堜互鍚庯紝鍥懼艦鍖栫殑ftp瀹㈡埛杞歡"gftp"灝辨敮鎸?sftp"銆?br>顥ヮ棩濡傛灉榪滅▼鐨勬湇鍔″櫒娌℃湁瀹夎sftp鏈嶅姟鍣ㄨ蔣浠?sftpserv"錛屽彲浠ユ妸"sftpserv"鐨勫彲鎵ц鏂囦歡鎷瘋礉鍒頒綘鐨勮繙紼嬬殑瀹剁洰褰曚腑錛堟垨鑰呭湪榪滅▼璁$畻鏈虹殑$PATH鐜鍙橀噺涓緗殑璺緞錛夈?sftp"浼?xì)鑷姩婵媧昏繖涓湇鍔¤蔣浠訛紝浣犳病鏈夊繀瑕佸湪榪滅▼鏈嶅姟鍣ㄤ笂鏈変粈涔堢壒孌婄殑鏉冮檺銆?/p>

6.3 鐢?rsync"鎷瘋礉鏂囦歡
顥ヮ棩"rsync"鏄敤鏉ユ嫹璐濄佹洿鏂板拰縐誨姩榪滅▼鍜屾湰鍦版枃浠剁殑涓涓湁鐢ㄧ殑宸ュ叿錛屽緢瀹規(guī)槗灝卞彲浠ョ敤"-e ssh"鍙傛暟鍜孲SH緇撳悎璧鋒潵浣跨敤銆?rsync"鐨勪竴涓紭鐐瑰氨鏄紝涓嶄細(xì)鎷瘋礉鍏ㄩ儴鐨勬枃浠訛紝鍙細(xì)鎷瘋礉鏈湴鐩綍鍜岃繙紼嬬洰褰曚腑鏈夊尯鍒殑鏂囦歡銆傝屼笖瀹冭繕浣跨敤寰堥珮鏁堢殑鍘嬬緝綆楁硶錛岃繖鏍鋒嫹璐濈殑閫熷害灝卞緢蹇?/p>

6.4 鐢?鍔犲瘑閫氶亾"鐨刦tp鎷瘋礉鏂囦歡
顥ヮ棩濡傛灉浣犲潥鎸佽鐢ㄤ紶緇熺殑FTP瀹㈡埛杞歡銆係SH鍙互涓哄嚑涔庢墍鏈夌殑鍗忚鎻愪緵"瀹夊叏閫氶亾"銆侳TP鏄竴涓湁涓鐐瑰鎬殑鍗忚錛堜緥濡傞渶瑕佷袱涓鍙o級鑰屼笖涓嶅悓鐨勬湇鍔$▼搴忓拰鏈嶅姟紼嬪簭涔嬮棿銆佸鎴風(fēng)▼搴忓拰瀹㈡埛紼嬪簭涔嬮棿榪樻湁涓浜涘樊鍒?br>顥ヮ棩瀹炵幇"鍔犲瘑閫氶亾"鐨勬柟娉曟槸浣跨敤"绔彛杞彂"銆備綘鍙互鎶婁竴涓病鏈夌敤鍒扮殑鏈湴绔彛錛堥氬父澶т簬1000錛夎緗垚杞彂鍒頒竴涓繙紼嬫湇鍔″櫒涓婏紝鐒跺悗鍙榪炴帴鏈湴璁$畻鏈轟笂鐨勮繖涓鍙e氨琛屼簡銆傛湁涓鐐瑰鏉傛槸鍚楋紵
顥ヮ棩鍏跺疄涓涓熀鏈殑鎯蟲硶灝辨槸錛岃漿鍙戜竴涓鍙o紝璁㏒SH鍦ㄥ悗鍙拌繍琛岋紝鐢ㄤ笅闈㈢殑鍛戒護(hù)錛?br>ssh [user@remote host] -f -L 1234:[remote host]:21 tail -f /etc/motd
顥ヮ棩鎺ョ潃榪愯FTP瀹㈡埛錛屾妸瀹冭緗埌鎸囧畾鐨勭鍙o細(xì)
lftp -u [username] -p 1234 localhost
顥ヮ棩褰撶劧錛岀敤榪欑鏂規(guī)硶寰堥夯鐑﹁屼笖寰堝鏄撳嚭閿欍傛墍浠ユ渶濂戒嬌鐢ㄥ墠涓夌鏂規(guī)硶銆?/p>

7.鐢⊿SH璁劇疆"鍔犲瘑閫氶亾"
7.1 "鍔犲瘑閫氶亾"鐨勫熀紜鐭ヨ瘑
顥ヮ棩SSH鐨?鍔犲瘑閫氶亾"鏄氳繃"绔彛杞彂"鏉ュ疄鐜扮殑銆備綘鍙互鍦ㄦ湰鍦扮鍙o紙娌℃湁鐢ㄥ埌鐨勶級鍜屽湪榪滅▼鏈嶅姟鍣ㄤ笂榪愯鐨勬煇涓湇鍔$殑绔彛涔嬮棿寤虹珛"鍔犲瘑閫氶亾"銆傜劧鍚庡彧瑕佽繛鎺ュ埌鏈湴绔彛銆傛墍鏈夊鏈湴绔彛鐨勮姹傞兘琚玈SH鍔犲瘑騫朵笖杞彂鍒拌繙紼嬫湇鍔″櫒鐨勭鍙c傚綋鐒跺彧鏈夎繙紼嬫湇鍔″櫒涓婅繍琛孲SH鏈嶅姟鍣ㄨ蔣浠剁殑鏃跺?鍔犲瘑閫氶亾"鎵嶈兘宸ヤ綔銆傚彲浠ョ敤涓嬮潰鍛戒護(hù)媯鏌ヤ竴浜涜繙紼嬫湇鍔″櫒鏄惁榪愯SSH鏈嶅姟錛?br>telnet [full name of remote host] 22

顥ヮ棩濡傛灉鏀跺埌榪欐牱鐨勫嚭閿欎俊鎭細(xì)telnet: Unable to connect to remote host: Connection refused

灝辮鏄庤繙紼嬫湇鍔″櫒涓婃病鏈夎繍琛孲SH鏈嶅姟杞歡銆?/p>

顥ヮ棩绔彛杞彂浣跨敤榪欐牱鐨勫懡浠よ娉曪細(xì)
ssh -f [username@remote host] -L [local port]:[full name of remote host]:[remote port] [some command]
顥ヮ棩浣犱笉浠呭彲浠ヨ漿鍙戝涓鍙h屼笖鍙互鍦?~/.ssh/config"鏂囦歡涓敤"LocalForward"璁劇疆緇忓父浣跨敤鐨勪竴浜涜漿鍙戠鍙c?/p>

7.2 涓篜OP鍔犱笂"鍔犲瘑閫氶亾"
顥ヮ棩浣犲彲浠ョ敤POP鍗忚浠庢湇鍔″櫒涓婂彇email銆備負(fù)POP鍔犱笂"鍔犲瘑閫氶亾"鍙互闃叉POP鐨勫瘑鐮佽緗戠粶鐩戝惉鍣紙sniffer錛夌洃鍚埌銆傝繕鏈変竴涓ソ澶勫氨鏄疭SH鐨勫帇緙╂柟寮忓彲浠ヨ閭歡浼犺緭寰楁洿蹇?br>顥ヮ棩鍋囧畾浣犲湪pop.foobar.com涓婃湁涓涓狿OP甯愬彿錛屼綘鐨勭敤鎴峰悕鏄?bilbo"浣犵殑POP鍙d護(hù)鏄?topsecret"銆傜敤鏉ュ緩绔婼SH"鍔犲瘑閫氶亾"鐨勫懡浠ゆ槸錛?br>ssh -f -C bilbo@pop.foobar.com -L 1234:pop.foobar.com:110 sleep 5
錛堝鏋滆嫻嬭瘯錛屽彲浠ユ妸"sleep"鐨勫煎姞鍒?00錛夈傝繍琛岃繖涓懡浠や箣鍚庝細(xì)鎻愮ず浣犺緭鍏OP鍙d護(hù)錛?br>bilbo@pop.foobar.com's password:
杈撳叆鍙d護(hù)涔嬪悗灝卞彲浠ョ敤"telnet"榪炴帴鍒版湰鍦扮殑杞彂绔彛浜嗐?br>telnet localhost 1234
浣犱細(xì)鏀跺埌榪滅▼mail鏈嶅姟鍣ㄧ殑"READY"娑堟伅銆?br>顥ヮ棩褰撶劧錛岃繖涓柟娉曡姹備綘鎵嬪伐杈撳叆鎵鏈夌殑POP鍛戒護(hù)錛岃繖鏄緢涓嶆柟渚跨殑銆傚彲浠ョ敤Fetchmail錛堝弬鑰僪ow to configure Fetchmail錛夈係ecure POP via SSH mini-HOWTO銆乵an fetchmail鍜屽湪"/usr/doc/fetchmail-[…]"鐩綍涓嬬殑Fetchmail鐨凢AQ閮芥彁渚涗簡涓浜涘叿浣撶殑渚嬪瓙銆?br>顥ヮ棩璇鋒敞鎰廔MAP鍗忚浣跨敤鐨勬槸涓嶅悓鐨勭鍙o細(xì)IMAP v2鐨勭鍙e彿涓?43鑰孖MAP v3鐨勭鍙e彿涓?20銆?/p>

7.3 涓篨鍔犱笂"鍔犲瘑閫氶亾"
顥ヮ棩濡傛灉浣犳墦綆楀湪鏈湴璁$畻鏈轟笂榪愯榪滅▼SSH鏈嶅姟鍣ㄤ笂鐨刋紼嬪簭錛岄偅涔堢櫥褰曞埌榪滅▼鐨勮綆楁満涓婏紝鍒涘緩涓涓悕涓?~/.ssh/environment"鐨勬枃浠跺茍鍔犱笂榪欎竴琛岋細(xì)
XAUTHORITY=/home/[remote user name]/.Xauthority

錛堝鏋滃湪榪滅▼涓繪満涓婁綘鐨勫鐩綍涓嬩笉瀛樺湪".Xauthority"榪欎釜鏂囦歡錛岄偅涔堝綋鐢⊿SH鐧誨綍鐨勬椂鍊欏氨浼?xì)鑷姩鍒涘缓锛夈?br>顥ヮ棩姣斿鍚姩涓涓猉紼嬪簭錛坸term錛夊彲浠ヨ繖涓懡浠わ細(xì)
ssh -f -X -l [remote user name] [remote machine] xterm
顥ヮ棩榪欏皢鍦ㄨ繙紼嬭繍琛寈term榪欎釜紼嬪簭銆傚叾瀹冪殑X紼嬪簭涔熸槸鐢ㄧ浉鍚岀殑鏂規(guī)硶銆?/p>

7.4 涓簂inuxconf鍔犱笂"鍔犲瘑閫氶亾"
顥ヮ棩Linuxconf(http://www.solucorp.qc.ca/linuxconf/)鏄疞inux鐨勯厤緗伐鍏鳳紝瀹冩敮鎸佽繙紼嬬鐞嗐侺inuxconf鐨凢AQ閲嶈鏄庝簡濡備綍閫氳繃SSH浣跨敤linuxconf錛?br>鍏跺懡浠や負(fù)錛歳emadmin --exec [link_command] linuxconf --guiproto
顥ヮ棩濡傛灉浣犳兂鍦ㄤ袱鍙拌綆楁満涔嬮棿鐢ㄥ姞瀵嗙殑鏂瑰紡浼犻佷俊鎭紝閭d箞鏈濂界敤ssh銆傚懡浠ゆ槸錛?br>remadmin --exec ssh -l [account] linuxconf --guiproto
顥ヮ棩榪欐槸闈炲父鏈夋晥鐨勮屼笖榪愯鐢ㄥ浘褰㈢晫闈㈢鐞嗚綆楁満銆?br>顥ヮ棩榪欑鏂規(guī)硶闇瑕佸湪瀹㈡埛绔畨瑁卨inuxconf銆傚叾瀹冪殑鏂規(guī)硶榪樻湁鐩存帴鐧誨綍鍒版湇鍔″櫒涓婄敤"X11Forwarding"鎴栧瓧絎︾晫闈㈣繍琛宭inuxconf銆?/p>

7.5 涓篧ebmin鍔犱笂"鍔犲瘑閫氶亾"
顥ヮ棩Webmin(ssh -f -l [remote user name] [remote host] -L 1234:[remote host]:10000 tail -f /etc/motd
顥ヮ棩鎶婃祻瑙堝櫒鎸囧悜
http://localhost:1234




鍙跺瓙 2007-05-24 01:53 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              国产亚洲制服色| 免费观看成人www动漫视频| 亚洲国产欧美一区| 欧美国产91| 一区二区三区视频在线看| 亚洲人体1000| 久久综合九色| 日韩视频免费在线观看| 欧美日韩在线观看一区二区| 尤物九九久久国产精品的特点 | 一本久道久久久| 国内久久精品视频| 欧美成人精品1314www| 欧美高清视频免费观看| 中文欧美在线视频| 亚洲在线电影| 亚洲精品日本| 香蕉久久国产| 国产精品二区在线| 久久国产精品久久久| 久久久久久穴| 亚洲五月六月| 久久久久久久999| 亚洲婷婷综合色高清在线| 欧美一级黄色录像| 一区二区日韩欧美| 久久精品视频免费| 亚洲一区二区三区四区五区午夜| 亚洲欧美日韩另类| 99热免费精品在线观看| 欧美一级夜夜爽| 在线综合+亚洲+欧美中文字幕| 欧美亚洲自偷自偷| 亚洲在线观看视频网站| 麻豆精品视频| 欧美在线免费观看| 欧美日本高清| 欧美国产在线电影| 国产精品视频最多的网站| 亚洲国产精品久久久久秋霞不卡| 国产精品久久福利| 亚洲国产一区二区三区在线播 | 久久蜜桃精品| 欧美在线亚洲综合一区| 欧美日韩精品免费在线观看视频| 美脚丝袜一区二区三区在线观看| 国产精品乱码人人做人人爱| 亚洲国产第一| 一区二区三区欧美日韩| 亚洲激情视频在线播放| 欧美综合第一页| 午夜精品一区二区在线观看 | 欧美精品福利| 欧美激情在线有限公司| 一区二区视频在线观看| 欧美一区=区| 欧美一区二区三区婷婷月色| 欧美午夜精品久久久久久浪潮| 91久久精品视频| 亚洲精品免费一二三区| 麻豆成人综合网| 欧美a级片网| 亚洲国产91| 免费成人av| 亚洲国产日韩欧美在线99| 亚洲国产老妈| 中文一区二区| 久久久久久九九九九| 亚洲欧美在线磁力| 欧美性生交xxxxx久久久| 99re6这里只有精品| 一本一本久久| 欧美日韩影院| 亚洲夜间福利| 久久精品国产77777蜜臀| 国产视频亚洲精品| 久久久噜噜噜久久狠狠50岁| 久久精品国产一区二区三区| 国产一本一道久久香蕉| 久久久久9999亚洲精品| 欧美aa在线视频| 日韩一级精品视频在线观看| 欧美日韩另类综合| 午夜精品在线视频| 欧美激情综合色综合啪啪| 亚洲国产另类久久久精品极度| 亚洲三级观看| 欧美日韩在线一区二区| 亚洲欧美日韩国产中文| 久久综合福利| 一区二区三区|亚洲午夜| 国产麻豆视频精品| 久久综合狠狠综合久久激情| 亚洲人成在线观看一区二区| 性欧美暴力猛交69hd| 伊人成人开心激情综合网| 欧美激情1区2区3区| 亚洲少妇一区| 蜜臀91精品一区二区三区| 日韩一级在线观看| 国产精品综合视频| 欧美α欧美αv大片| 亚洲综合欧美| 亚洲高清自拍| 久久精品国产一区二区电影| 亚洲国产日韩一区| 国产欧美日韩视频一区二区三区| 久久综合福利| 午夜精品久久久久久久| 亚洲欧洲精品天堂一级| 久久久久免费视频| a91a精品视频在线观看| 国语自产精品视频在线看8查询8| 欧美激情精品久久久久久| 午夜精品在线| 一区二区三区 在线观看视频| 久久久天天操| 性欧美1819sex性高清| 亚洲国产精品久久91精品| 国产精品一区二区久久精品| 欧美大片免费久久精品三p | 久久亚洲春色中文字幕| 午夜精品在线视频| 99在线精品视频在线观看| 一区二区在线不卡| 国产主播一区二区三区四区| 国产精品视频网站| 国产精品乱码| 国产精品区免费视频| 久久女同精品一区二区| 久久亚洲图片| 久久久久久色| 欧美日韩精品免费看 | 欧美精品性视频| 久久久蜜桃精品| 久久久久久91香蕉国产| 欧美一区二区三区另类| 性欧美超级视频| 性欧美18~19sex高清播放| 亚洲曰本av电影| 亚洲欧美日韩电影| 一区二区三区导航| 91久久久久久国产精品| 亚洲一级网站| 亚洲一区二区高清视频| 国内精品久久久久影院优| 国产欧美日韩视频一区二区三区| 欧美极品在线播放| 一区二区三区欧美成人| 欧美影院成人| 亚洲自拍高清| 久久久久亚洲综合| 麻豆精品在线视频| 欧美风情在线观看| 久久电影一区| 性伦欧美刺激片在线观看| 亚洲一卡二卡三卡四卡五卡| 午夜精品久久| 欧美一级一区| 欧美一区二区在线免费播放| 性色一区二区| 欧美aa在线视频| 欧美激情一区三区| 欧美成人情趣视频| 欧美人与禽性xxxxx杂性| 国产精品久久综合| 国产精品手机视频| 国产日韩欧美精品一区| 国产亚洲精品资源在线26u| 在线观看欧美黄色| 亚洲精品国产精品乱码不99| 在线中文字幕一区| 久久免费视频在线| 亚洲一区二区精品| 一区二区三区色| 亚洲国产91精品在线观看| 亚洲高清不卡在线观看| 亚洲人成网站777色婷婷| 亚洲在线观看视频网站| 性色av一区二区三区| 久久久精品2019中文字幕神马| 亚洲一区二区三区视频| 免费观看一区| 国产精品美女在线观看| 在线精品亚洲| 欧美在线啊v一区| 亚洲国产第一页| 亚洲视频999| 久久欧美中文字幕| 国产欧美日韩在线视频| 亚洲电影免费观看高清完整版在线 | 黄色成人av网| 日韩一区二区免费看| 亚洲欧美日韩精品久久奇米色影视 | 一本色道久久综合亚洲精品不卡| 欧美伊人久久| 一本色道久久综合亚洲二区三区| 欧美一级夜夜爽| 欧美三级中文字幕在线观看| 国产中文一区二区三区|