FreeBSD ¿ª·¢ÊÖ²á

The FreeBSD Documentation Project

FreeBSD ÖÐÎļƻ®

¡¡¡¡»¶Ó­ÄúÔĶÁ¡¶FreeBSD¿ª·¢Êֲᡷ¡£ Õâ±¾ÊֲỹÔÚ²»¶ÏÓÉÐí¶àÈ˼ÌÐøÊéд¡£ Ðí¶àÕ½ڻ¹Êǿհף¬ÓеÄÕÂ½ÚØ½´ý¸üС£ Èç¹ûÄú¶ÔÕâ¸öÏîÄ¿¸ÐÐËȤ²¢Ô¸ÒâÓÐËù¹±Ï×£¬Ç뷢Пø FreeBSD Îĵµ¼Æ»®ÓʼþÁÐ±í¡£

¡¡¡¡ ±¾ÎĵµµÄ×îÐÂÓ¢ÎÄԭʼ°æ±¾¿É´Ó FreeBSD Web Õ¾µã »ñµÃ£¬ ÓÉ FreeBSD ÖÐÎļƻ® ά»¤µÄ×îÐÂÒë±¾¿ÉÒÔÔÚ FreeBSD ÖÐÎļƻ® ¿ìÕÕ Web Õ¾µã ºÍ FreeBSD ÖÐÎļƻ® Îĵµ¿ìÕÕ ´¦»ñµÃ£¬ ÕâÒ»Òë±¾»á²»¶ÏÏòÖ÷վͬ²½¡£ ´ËÍ⣬ ÄúÒ²¿ÉÒÔ´Ó FreeBSD FTP ·þÎñÆ÷ »òÖÚ¶àµÄ ¾µÏñÕ¾µã µÃµ½Õâ·ÝÎĵµµÄ¸÷ÖÖÆäËû¸ñʽÒÔ¼°Ñ¹ËõÐÎʽµÄ°æ±¾¡£

ÖØÒª: ±¾ÎÄÖÐÐí¿ÉÖ¤µÄ·Ç¹Ù·½ÖÐÎÄ·­Òë½ö¹©²Î¿¼£¬ ²»×÷ΪÅж¨ÈκÎÔðÈεÄÒÀ¾Ý¡£ÈçÓëÓ¢ÎÄÔ­ÎÄÓгöÈ룬ÔòÒÔÓ¢ÎÄÔ­ÎÄΪ׼¡£

ÔÚÂú×ãÏÂÁÐÐí¿ÉÌõ¼þµÄǰÌáÏ£¬ ÔÊÐíÔÙ·Ö·¢»òÒÔÔ´´úÂë (SGML DocBook) »ò ¡°±àÒ롱 (SGML, HTML, PDF, PostScript, RTF µÈ) µÄ¾­¹ýÐ޸ĻòδÐ޸ĵÄÐÎʽ£º

  1. ÔÙ·Ö·¢Ô´´úÂë (SGML DocBook) ±ØÐë²»¼ÓÐ޸ĵı£ÁôÉÏÊö°æÈ¨¸æÊ¾¡¢ ±¾Ìõ¼þÇåµ¥ºÍÏÂÊöÆúȨÊé×÷Ϊ¸ÃÎļþµÄ×îÏÈÈô¸ÉÐС£

  2. ÔÙ·Ö·¢±àÒëµÄÐÎʽ (ת»»ÎªÆäËüDTD¡¢ PDF¡¢ PostScript¡¢ RTF »òÆäËüÐÎʽ)£¬ ±ØÐ뽫ÉÏÊö°æÈ¨¸æÊ¾¡¢±¾Ìõ¼þÇåµ¥ºÍÏÂÊöÆúȨÊ鏴֯µ½Óë·Ö·¢Æ·Ò»Í¬ÌṩµÄÎļþ£¬ ÒÔ¼°ÆäËü²ÄÁÏÖС£

ÖØÒª: ±¾ÎĵµÓÉ FREEBSD DOCUMENTATION PROJECT ¡°°´ÏÖ×´Ìõ¼þ¡± Ìṩ£¬ ²¢ÔÚ´ËÃ÷ʾ²»ÌṩÈκÎÃ÷ʾ»ò°µÊ¾µÄ±£ÕÏ£¬ °üÀ¨µ«²»ÏÞÓÚ¶ÔÉÌÒµÊÊÏúÐÔ¡¢ ¶ÔÌØ¶¨Ä¿µÄµÄÊÊÓÃÐԵݵʾ±£ÕÏ¡£ ÈκÎÇé¿öÏ£¬ FREEBSD DOCUMENTATION PROJECT ¾ù²»¶ÔÈκÎÖ±½Ó¡¢ ¼ä½Ó¡¢ żȻ¡¢ ÌØÊâ¡¢ ³Í·£ÐԵģ¬ »ò±ØÈ»µÄËðʧ (°üÀ¨µ«²»ÏÞÓÚÌæ´úÉÌÆ·»ò·þÎñµÄ²É¹º¡¢ ʹÓᢠÊý¾Ý»òÀûÒæµÄËðʧ»òÓªÒµÖжÏ) ¸ºÔ𣬠ÎÞÂÛÊÇÈçºÎµ¼ÖµIJ¢ÒÔÈκÎÓÐÔðÈÎÂß¼­µÄ£¬ ÎÞÂÛÊÇ·ñÊÇÔÚ±¾ÎĵµÊ¹ÓÃÒÔÍâÒÔÈκη½Ê½²úÉúµÄÆõÔ¼¡¢ ÑϸñÔðÈλòÊÇÃñÊÂÇÖȨÐÐΪ(°üÀ¨Êèºö»òÆäËü)Öеģ¬ ¼´Ê¹Òѱ»¸æÖª·¢Éú¸ÃËðʧµÄ¿ÉÄÜÐÔ¡£

Redistribution and use in source (SGML DocBook) and 'compiled' forms (SGML, HTML, PDF, PostScript, RTF and so forth) with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code (SGML DocBook) must retain the above copyright notice, this list of conditions and the following disclaimer as the first lines of this file unmodified.

  2. Redistributions in compiled form (transformed to other DTDs, converted to PDF, PostScript, RTF and other formats) must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

ÖØÒª: THIS DOCUMENTATION IS PROVIDED BY THE FREEBSD DOCUMENTATION PROJECT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD DOCUMENTATION PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

FreeBSD ÊÇ FreeBSD»ù½ð»áµÄ×¢²áÉ̱ê

Apple, AirPort, FireWire, Mac, Macintosh, Mac OS, Quicktime, ÒÔ¼° TrueType ÊÇ Apple Computer, Inc. ÔÚÃÀ¹úÒÔ¼°ÆäËû¹ú¼ÒµÄ×¢²áÉ̱ꡣ

IBM¡¢ AIX¡¢ EtherJet¡¢ Netfinity¡¢ OS/2¡¢ PowerPC¡¢ PS/2¡¢ S/390 ÒÔ¼° ThinkPad Êǹú¼ÊÉÌÓûúÆ÷¹«Ë¾ÔÚÃÀ¹úºÍÆäËû¹ú¼ÒµÄ×¢²áÉ̱ê»òÉ̱ꡣ

IEEE, POSIX, ºÍ 802 ÊÇ Institute of Electrical and Electronics Engineers, Inc. ÔÚÃÀ¹úµÄ×¢²áÉ̱ꡣ

Intel, Celeron, EtherExpress, i386, i486, Itanium, Pentium, ºÍ Xeon ÊÇ Intel Corporation ¼°Æä·ÖÖ§»ú¹¹ÔÚÃÀ¹úºÍÆäËû¹ú¼ÒµÄÉ̱ê»ò×¢²áÉ̱ꡣ

Linux ÊÇ Linus Torvalds µÄ×¢²áÉ̱ꡣ

Microsoft, IntelliMouse, MS-DOS, Outlook, Windows, Windows Media, ºÍ Windows NT ÊÇ Microsoft Corporation ÔÚÃÀ¹úºÍ/»òÆäËû¹ú¼ÒµÄÉ̱ê»ò×¢²áÉ̱ꡣ

Motif, OSF/1, ºÍ UNIX ÊÇ The Open Group ÔÚÃÀ¹úºÍÆäËû¹ú¼ÒµÄ×¢²áÉ̱ꣻ IT DialTone ºÍ The Open Group ÊÇÆäÉ̱ꡣ

Sun¡¢ Sun Microsystems¡¢ Java¡¢ Java Virtual Machine¡¢ JavaServer Pages¡¢ JDK¡¢ JRE¡¢ JSP¡¢ JVM¡¢ Netra¡¢ Solaris¡¢ StarOffice¡¢ Sun Blade¡¢ Sun Enterprise¡¢ Sun Fire¡¢ SunOS ÒÔ¼° Ultra ÊÇ Sun Microsystems, Inc. ÔÚÃÀ¹úºÍÆäËû¹ú¼ÒµÄÉ̱ê»ò×¢²áÉ̱ꡣ

Ðí¶àÖÆÔìÉ̺;­ÏúÉÌʹÓÃһЩ³ÆÎªÉ̱êµÄͼ°¸»òÎÄ×ÖÉè¼ÆÀ´ÕÃÏÔ×Ô¼ºµÄ²úÆ·¡£ ±¾ÎĵµÖгöÏֵģ¬ Ϊ FreeBSD Project ËùÖªÏþµÄÉ̱꣬ºóÃæ½«ÒÔ '™' »ò '®' ·ûºÅÀ´±ê×¢¡£


Ŀ¼
µÚI²¿·Ö. »ù´¡
µÚ1Õ¡¡½éÉÜ
1.1 ÔÚ FreeBSD ÉϽøÐпª·¢
1.2 BSD ÀíÄî
1.3 Ö¸µ¼ÐԼܹ¹Éè¼ÆÔ­Ôò
1.4 /usr/srcµÄ²ã´Î½á¹¹
µÚ2Õ¡¡±à³Ì¹¤¾ß
2.1 ¸ÅÊö
2.2 ½éÉÜ
2.3 ±à³Ì³õ²½
2.4 Óà cc ±àÒë
2.5 Make
2.6 µ÷ÊÔ
2.7 ʹÓà Emacs ×÷Ϊ¿ª·¢»·¾³
2.8 ²¹³äÔĶÁ
µÚ3Õ¡¡°²È«µÄ±à³Ì
3.1 ÌáÒª
3.2 °²È«µÄÉè¼Æ·½·¨
3.3 »º³åÇøÒç³ö
3.4 SetUID ÎÊÌâ
3.5 ÏÞÖÆÄãµÄ³ÌÐò»·¾³
3.6 ÐÅÈÎ
3.7 ¾ºÌ¬Ìõ¼þ
µÚ4Õ¡¡±¾µØ»¯Óë¹ú¼Ê»¯ - L10N ºÍ I18N
4.1 ±àдÊÊÓ¦¹ú¼Ê»¯µÄÓ¦ÓóÌÐò
µÚ5Õ¡¡Ô´´úÂëÊ÷Ö¸ÄϺÍά»¤·¢Õ¹²ßÂÔ
5.1 Makefile ÖÐµÄ MAINTAINER
5.2 µÚÈý·½Èí¼þ
5.3 ·Á°­Ð﵀ (Encumbered) Îļþ
5.4 ¹²Ïí¿â
µÚ6Õ¡¡»Ø¹éÓëÐÔÄܲâÊÔ
6.1. ΢ÐÔÄܲâÊÔÁбí
µÚII²¿·Ö. ½ø³Ì¼äͨÐÅ
µÚ7Õ¡¡Ì×½Ó×Ö
7.1 ¸ÅÊö
7.2 ÁªÍøºÍ¶àÑùÐÔ
7.3 ЭÒé
7.4 Ì×½Ó×ÖÄ£ÐÍ
7.5 ÖØÒªµÄÌ×½Ó×Öº¯Êý
7.6 ¸¨Öúº¯Êý
7.7 ²¢·¢·þÎñÆ÷
µÚ8Õ¡¡IPv6ÄÚ²¿
8.1 IPv6/IPsecµÄʵÏÖ
µÚIII²¿·Ö. ÄÚºË
µÚ9Õ¡¡DMA
9.1 DMA ÊÇʲôÒÔ¼°ÈçºÎ¹¤×÷µÄ
µÚ10Õ¡¡Áª±à²¢°²×° FreeBSD ÄÚºË
10.1 ÒÔ ¡°´«Í³¡± ·½Ê½Áª±àÄÚºË
10.2 ÒÔ ¡°Ð¡± ·½Ê½Áª±àÄÚºË
µÚ11Õ¡¡µ÷ÊÔÄÚºË
11.1 ÈçºÎ½«Äں˵ıÀÀ£×ª´æÊý¾Ý±£´æ³ÉÎļþ
11.2 ʹÓà kgdb µ÷ÊÔÄں˵ıÀÀ£×ª´æ
11.3 ʹÓà DDD µ÷ÊÔ±ÀÀ£×ª´æÎļþ
11.4 ¶ÔÓÚ±ÀÀ£×ª´æµÄÑéʬʽ·ÖÎö
11.5 ʹÓà DDB ½øÐÐÔÚÏßÄں˵÷ÊÔ
11.6 ʹÓÃÔ¶³Ì GDB ½øÐÐÁª»úÄں˵÷ÊÔ
11.7 Óà GDB µ÷ÊԿɼÓÔØÄ£¿é
11.8 ÈçºÎµ÷ÊÔ¿ØÖÆÌ¨Çý¶¯
11.9 µ÷ÊÔËÀËø
11.10 ÓÃÓÚµ÷ÊÔµÄÄÚºËÑ¡ÏîÊõÓï±í
µÚIV²¿·Ö. ϵͳ½á¹¹
µÚ12Õ¡¡x86 »ã±àÓïÑÔ
12.1 ¸ÅÊö
12.2 ¹¤¾ß
12.3 ϵͳµ÷ÓÃ
12.4 ·µ»ØÖµ
12.5 ½¨Á¢¿ÉÒÆÖ²µÄ´úÂë
12.6 ±àдµÚÒ»¸ö³ÌÐò
12.7 ±àд UNIX® ¹ýÂ˳ÌÐò
12.8 »º´æ I/O
12.9 ÃüÁîÐвÎÊý
12.10 UNIX ÖеĻ·¾³
12.11 Îļþ´¦Àí
12.12 One-Pointed Mind
12.13 Using the FPU
12.14 ÖÒ¸æ
12.15 ÖÂл
µÚV²¿·Ö. ¸½Â¼
²Î¿¼ÊéÄ¿
Ë÷Òý
·¶ÀýÇåµ¥
Àý2-1. Ò»¸ö .emacs ÅäÖÃÎļþµÄÀý×Ó

µÚI²¿·Ö. »ù´¡


µÚ1Õ ¡¡½éÉÜ

¹©¸å£ºMurray Stokely ºÍ Jeroen Ruigrok van der Werven. ·­Ò룺Àî öÎ.

1.1 ÔÚ FreeBSD ÉϽøÐпª·¢

¡¡¡¡»¶Ó­ÄúµÄµ½À´¡£ ÏÖÔÚÄúÒѾ­°²×°ºÃ²Ù×÷ϵͳ£¬ ²¢×¼±¸¿ªÊ¼±à³ÌÁË¡£ µ«ÊÇ£¬ ´ÓÄÄÀï¿ªÊ¼ÄØ£¿ FreeBSD ÌṩÁËһЩʲô¹¤¾ß£¿ ËüÄܹ»ÎªÎÒ£¬ Ò»¸ö³ÌÐòÔ±Ìá¹©Ê²Ã´ÄØ£¿

¡¡¡¡ÕâЩ¶¼ÊDZ¾ÕÂ×¼±¸»Ø´ðµÄÎÊÌâ¡£ µ±È»£¬ ÓëËùÓÐÆäËûÖ°ÒµÀàËÆ£¬ ÈËÃǶԳÌÐòÉè¼ÆµÄÊìÁ·³Ì¶È×ÜÊÇ´æÔÚ²îÒìµÄ¡£ ¶ÔÓÐЩÈ˶øÑÔ£¬ ËüÖ»ÊÇÒ»ÖÖ°®ºÃ£» ¶ø¶ÔÁíһЩÈ˶øÑÔ£¬ ÕâÔòÊÇËûÃǵÄÖ°Òµ¡£ ÕâÒ»ÕÂÖеÄÄÚÈÝÖ÷ÒªÊÇÕë¶Ô³õѧ³ÌÐòÉè¼ÆµÄÈ˶ø×«Ð´£» µ±È»£¬ ¶ÔÓÚÄÇЩ²»ÊìϤ FreeBSD ƽ̨µÄ³ÌÐòÔ±À´Ëµ£¬ ËüҲʮ·ÖÓÐÓá£


1.2 BSD ÀíÄî

¡¡¡¡¶Ô×î³õµÄÈí¼þ¹¤¾ßÉè¼Æ¹ÛÄîÒÔ¼°¿ÉÓÃÐÔ¡¢ ÐÔÄÜÓëÎȶ¨ÐÔ¸øÓèÓ¦ÓеÄ×ðÖØ£¬ ²¢ÖÆ×÷×î¼ÑµÄÀà UNIX® ²Ù×÷ϵͳÈí¼þ°ü¡£


1.3 Ö¸µ¼ÐԼܹ¹Éè¼ÆÔ­Ôò

¡¡¡¡ÏÂÃæµÄÖ¸µ¼ÐÔÉè¼ÆÔ­ÔòÃèÊöÁËÎÒÃǵÄÉè¼ÆÀíÄî

  • ֻҪijһ¹¦ÄܵÄȱʧ²»»áµ¼ÖÂÎÞ·¨Íê³Éij¸öʵ¼ÊµÄÓ¦ÓóÌÐò£¬ ¾Í²»ÐÂÔö¸Ã¹¦ÄÜ¡£

  • ¾ö¶¨ÏµÍ³²»×ö³ÉʲôÑù×Ó£¬ Óë¾ö¶¨½«Ëü×ö³ÉʲôÑù×ÓͬÑùÖØÒª¡£ ²»È¥Âú×ãËùÓеÄÐèÒª£¬ ¶øÊÇÈÃϵͳ¾ß±¸¿ÉÀ©Õ¹ÐÔ£¬ ʹÆäÄܹ»ÏòÉϼæÈÝ¡£

  • ¾¡¿ÉÄܳéÏó´úÂëÖеÄͨÓò¿·Ö£¬ ³ý·ÇûÓпÉÒÔÓÃÀ´³éÏóµÄʵÀý¡£

  • Èç¹ûûÓÐÍêÈ«Àí½âÒ»¸öÎÊÌ⣬ ×îºÃ¸É´à²»ÌṩÈκνâ¾ö·½°¸¡£

  • Èç¹ûÄÜÓà 10% µÄ¹¤×÷Íê³É 90% µÄ¹¤×÷£¬ ÔòÑ¡Ôñ½Ï¼òµ¥µÄ½â¾ö·½°¸¡£

  • ¾¡¿ÉÄܸôÀ븴ÔÓÐÔ¡£

  • Ìṩ»úÖÆ¶ø·Ç²ßÂÔ¡£ ¾ßÌå¶øÑÔ£¬ ½«Óû§½çÃæ²ßÂÔ½»Óɿͻ§È¥Ñ¡¶¨¡£

¡¡¡¡Õª×Ô Scheifler & Gettys£º "X Window System"


1.4 /usr/srcµÄ²ã´Î½á¹¹

¡¡¡¡FreeBSD µÄÍêÕûÔ´´úÂë¶¼¿ÉÒÔ´ÓÎÒÃǹ«¿ªµÄ CVS ´úÂë¿âÖлñÈ¡¡£ Ô´´úÂëͨ³£»á°²×°µ½ /usr/src Ŀ¼ÖУ¬ Ëü°üÀ¨ÁËÏÂÃæÕâЩĿ¼£º

¡¡¡¡

Ŀ¼ ˵Ã÷
bin/ ÔÚ /bin ÖеÄÎļþµÄÔ´´úÂë
contrib/ ÓÉÆäËû¿ª·¢×é֯ά»¤µÄÔ´´úÂë
crypto/ ÓëÃÜÂëѧÓйصÄÔ´´úÂë
etc/ ÔÚ /etc ÖеÄÎļþµÄÔ´´úÂë
games/ ÔÚ /usr/games ÖеÄÎļþµÄÔ´´úÂë
gnu/ ²ÉÓà GNU Public License ÊÚȨµÄ¹¤¾ß
include/ ÔÚ /usr/include ÖеÄÎļþµÄÔ´´úÂë
kerberos5/ µÚ 5 °æ Kerberos µÄÔ´´úÂë
lib/ ÔÚ /usr/lib ÖеÄÎļþµÄÔ´´úÂë
libexec/ ÔÚ /usr/libexec ÖеÄÎļþµÄÔ´´úÂë
release/ ÓÃÓÚÖÆ×÷ FreeBSD ·¢Ðа汾µÄÎļþ
rescue/ ½¨Ôìϵͳʱ /rescueÖеŤ¾ß
sbin/ ÔÚ /sbin ÖеÄÎļþµÄÔ´´úÂë
secure/ FreeSec µÄÔ´´úÂë
share/ ÔÚ /usr/share ÖеÄÎļþµÄÔ´´úÂë
sys/ Äں˵ÄÔ´´úÂëÎļþ
tools/ ÓÃÓÚά»¤ºÍ×Ô¶¯²âÊÔ FreeBSD µÄ¹¤¾ß
usr.bin/ ÔÚ /usr/bin ÖеÄÎļþµÄÔ´´úÂë
usr.sbin/ ÔÚ /usr/sbin ÖеÄÎļþµÄÔ´´úÂë



µÚ2Õ ¡¡±à³Ì¹¤¾ß

¹©¸å£ºJames Raynard ºÍ Murray Stokely. ·­Ò룺Jokhva.

2.1 ¸ÅÊö

¡¡¡¡ÕâÒ»Õ½éÉÜÁË FreeBSD ÌṩµÄһЩ±à³Ì¹¤¾ß£¬ºÜ¶àÕâЩ¹¤¾ßÔÚÆäËû°æ±¾µÄ UNIX Öж¼ÄÜʹÓá£ÕâÀïÎÒÃDz»»á³¢ÊÔÃèÊöÈκαà³Ìϸ½Ú¡£´ó ¶àÊýÕ½ڼÙÉèÄúÒÔǰûÓлòÖ»ÓкÜÉٵıà³Ì֪ʶ£¬µ«ÎÒÃÇÏ£Íû³ÌÐòÔ±Ò²ÄÜ´ÓÖÐÊÜÒæ¡£


2.2 ½éÉÜ

¡¡¡¡FreeBSD ÌṩÁËÒ»¸ö·Ç³£ÓÅÐãµÄ¿ª·¢»·¾³¡£ÓÐ C£¬C++ ºÍ Fortran ±àÒëÆ÷ÒÔ¼° »ù±¾ÏµÍ³×Ô´øµÄÒ»¸ö»ã±àÆ÷¡£¸ü²»ÒªËµ Perl ½âÊÍÆ÷ºÍºÜ¶à¾­µä UNIX ¹¤¾ß£¬±ÈÈç sed ºÍ awk¡£Èç¹û»¹²»¹»£¬Ports Öл¹Óиü ¶àµÄ±àÒëÆ÷¡£FreeBSD Óë¶àÖÖ±ê×¼¼æÈÝ£¬ ±ÈÈç POSIX® ºÍ ANSI C, µ±È»»¹ÓÐËü×Ô¼ºµÄ BSD ´«Í³¡£ Òò´Ë£¬ ÎÒÃÇÔÚ FreeBSD ƽ̨ÉÏдµÄÓ¦Óò»¼ÓÐ޸ĻòÉÔ¼ÓÐ޸ľÍÄÜÔÚºÜ¶àÆ½Ì¨ÉÏÔËÐС£

¡¡¡¡Èç¹ûÄã´ÓδÔÚ UNIX ƽ̨ÉÏд¹ý³ÌÐò£¬ËùÓÐÕâЩǿ´óÖ®´¦¿´ÆðÀ´»áÈÃÈËìÅÄ¿¡£ ÕâÆªÎĵµµÄÄ¿µÄ¾ÍÊǰïÖúÄãѸËÙÉÏÊÖ£¬¶ø²»ÐíÒªÉîÈë¸ü¶à¸ß¼¶ÂÛÌâ¡£ÎÒÃǵÄÄ¿µÄ¾ÍÊÇÈà ÕâÆªÎĵµ¸øÄãÌṩ×ã¹»µÄ»ù´¡ÖªÊ¶À´Àí½âÎÒÃǵÄÎĵµ¡£

¡¡¡¡ÕâÆªÎĵµ²»ÒªÇóÄãÓбà³Ì֪ʶ£¬»òÕßÄãÖ»ÓкÜÉٵıà³Ì֪ʶ¡£µ±È»£¬ÎÒÃǼٶ¨Äã »áʹÓà UNIX ²¢ÇÒÔ¸ÒâÀ´Ñ§¡£


2.3 ±à³Ì³õ²½

¡¡¡¡³ÌÐò¾ÍÊÇһϵÁÐÖ¸ÁîµÄ¼¯ºÏ£¬ÕâЩָÁîÄÜÇýʹ¼ÆËã»úÈ¥×ö²»Í¬µÄÊÂÇé¡£ÓÐʱºò¼Æ Ëã»úÖ´ÐеÄÒ»¸öÖ¸ÁîÈ¡¾öÓÚËüËùÖ´ÐеÄǰһ¸öÖ¸Áî¡£±¾Õ½«½éÉÜÁ½ÖÖÖ÷ÒªµÄ¸ø³öÖ¸Á Ò²½Ð ¡°ÃüÁ£¬µÄ·½Ê½¡£Ò»ÖÖ·½Ê½ÊÇʹÓà ½âÊÍÆ÷ £¬ÁíÒ»ÖÖ·½Ê½ÊÇʹÓà ±àÒëÆ÷¡£ÈËÀàÓïÑÔ¶Ô ÓÚ¼ÆËã»úÀ´ËµÓïÒåÄ£ºýÌ«ÄÑÓÚÀí½â£¬Òò´Ë¼ÆËã»úÃüÁî¶¼ÓÃΪÁËÌØ¶¨Ä¿µÄÉè¼ÆµÄµÄÒ»ÖÖ»ò ÆäËûÖÖ¼ÆËã»úÓïÑÔдµÄ¡£


2.3.1 ½âÊÍÆ÷

¡¡¡¡Ê¹ÓýâÊÍÆ÷µÄ¼ÆËã»úÓïÑÔ¾ÍÏñÒ»¸ö»·¾³¡£½âÊÍÆ÷¸ø³öÌáʾ·ûºó£¬ÄãÊäÈëÒ»¸öÃü Á½âÊÍÆ÷¾Í»áÖ´ÐÐÕâ¸öÃüÁî¡£¶ÔÓÚ¸ü¸´ÔӵijÌÐò£¬¿ÉÒÔ°ÑÃüÁîдÈëÒ»¸öÎļþÈ»ºó ÈýâÊÍÆ÷×°ÈëÕâ¸öÎļþÔÙÖ´ÐÐÆäÖеÄÃüÁî¡£Èç¹ûÓдíÎó·¢Éú£¬Ðí¶à½âÊÍÆ÷»á½øÈëÒ»¸ö µ÷ÊÔ»·¾³ÈÃÄãÀ´×·×ÙÎÊÌâ¡£

¡¡¡¡ÕâÖÖ·½Ê½µÄÓŵã¾ÍÊÇ¿ÉÒÔÂíÉÏ¿´¼ûÃüÁîµÄÖ´Ðнá¹û£¬²¢ÇÒѸËٵĸÄÕý´íÎó¡£Èç ¹ûÄãÏëºÍ±ðÈË·ÖÏí×Ô¼ºµÄ³ÌÐò£¬×î´óµÄ»µ´¦¾ÍÏÔÏÖ³öÀ´ÁË¡£±ðÈËÐèÒªºÍÄãÒ»ÑùµÄ½âÊÍ Æ÷£¬»òÕßÄã±ØÐë°Ñ½âÊÍÆ÷¸øËûÃÇ£¬¶øÇÒËûÃÇ»¹ÒªÖªµÀÔõôʹÓÃÕâ¸ö½âÊÍÆ÷¡£Óû§Ò²²» Ï£ÍûÔÚ°´´íÒ»¸ö¼üµÄÇé¿öϾͱ»ÈÓµ½µ÷ÊÔ»·¾³ÖС£´Ó³ÌÐòÖ´ÐÐЧÂÊÀ´¿´£¬½âÊÍÆ÷»á ʹÓúܶàÄڴ棬¶øÇÒͨ³£Çé¿öÏÂÉú³ÉµÄ´úÂëÒ²²»Èç±àÒëÆ÷Éú³ÉµÄÓÐЧÂÊ¡£

¡¡¡¡ÎÒ¾õµÃ£¬Èç¹ûÄã´Óδ±à¹ý³ÌÐò£¬×îºÃ´Ó½âÊÍÀàÓïÑÔ¿ªÊ¼¡£Lisp£¬Smalltalk£¬ Perl ºÍ Basic ÓïÑÔ¾ÍÌṩÁËÕâÑùµÄ»·¾³¡£UNIX ÖÐµÄ shell (sh, csh) ×ÔÉí¾ÍÊÇÒ»¸ö½âÊÍÆ÷¡£Êµ¼ÊÇé ¿öÖУ¬ºÜ¶àÈ˶¼ÔÚËûÃÇ×Ô¼ºµÄ»úÆ÷ÉÏд shell ¡°scripts¡± À´×öºÜ¶à ¡°Î¬»¤¡±¹¤×÷¡£µÄÈ·£¬UNIX µÄÕÜѧÖÐÓÐÒ»²¿·Ö¾ÍÊÇÌṩºÜ¶àС¹¤¾ß£¬ ²¢Ê¹Óà shell scripts °ÑÕâЩ¹¤¾ß×éºÏÆðÀ´È¥×öÓÐÓõŤ×÷¡£


2.3.2 FreeBSD ÌṩµÄ½âÊÍÆ÷

¡¡¡¡ÔÚ FreeBSD Ports Collection ÖУ¬ÓÐÒ»¸öÁбíÁгöÁËÌṩµÄ½âÊÍÆ÷¡£Í¬Ê±»¹¼ò µ¥ÌÖÂÛÁËһЩ¸üÊÜ»¶Ó­µÄ½âÊÍÀàÓïÑÔ¡£

¡¡¡¡´Ó Ports Collection ÖÐÈçºÎÈ¡µÃ²¢°²×°Ó¦ÓóÌÐòµÄ½Ì³Ì¿ÉÒÔ´ÓÊÖ²áµÄ Ports section ÖÐÕÒµ½¡£

BASIC

Beginner's All-purpose Symbollic Instruction Code µÄËõд¡£20ÊÀ ¼Í50Äê´ú±»¿ª·¢³öÀ´¸ø´óѧÉúѧϰ±à³Ì¡£ÔÚ20ÊÀ¼Í80Äê´úÉú²úµÄ¸öÈ˵çÄÔÖаü º¬ÁËÕâÖÖÓïÑÔ¡£BASIC ÓïÑÔÊǺܶà³ÌÐòԱѧϰµÄµÚÒ»¸ö ±à³ÌÓïÑÔ¡£Í¬Ê±£¬ËüÒ²ÊÇ Visual Basic µÄ»ù´¡¡£

Bywater µÄ Basic ½âÊÍÆ÷ÄÜÔÚ Ports Collection ÖÐµÄ lang/bwbasic ÕÒµ½¡£Phil Cockroft µÄ Basic ½âÊÍÆ÷ (ÒÔǰ½Ð Rabbit Basic) ÔÚ lang/pbasic ÖС£

Lisp

20ÊÀ¼Í50Äê´ú¿ª·¢µÄÒ»ÖÖÓïÑÔ£¬×÷Ϊµ±Ê±ÄÇЩ¡°»ùÓÚÊý×Ö ¡±µÄÓïÑԵIJ¹³ä¡£Lisp²»ÊÇ»ùÓÚÊý×ֵ쬶øÊÇ»ùÓÚÁÐ±í£»Êµ¼ÊÉÏÕâ¸öÓï ÑÔµÄÃû×Ö¾ÍÊÇ ¡°List Processing¡±µÄËõд¡£ÔÚ AI (Artificial Intelligence) Ȧ×ÓÖзdz£ÊÜ»¶Ó­¡£

Lisp ÊÇÒ»Öַdz£Ç¿´ó¶ø¸´ÔÓµÄÓïÑÔ¡£µ«Ò²¿ÉÄܱäµÃÒì³£ÅÓ´ó¶øÓ·Öס£

ÔÚ FreeBSD ÖÐµÄ Ports Collection ÀïÃæÓи÷ÖÖ¿ÉÒÔÔÚ UNIX ϵͳÉÏÔË ÐÐµÄ Lisp ʵÏÖ¡£GNU Common Lisp ÔÚ lang/gcl Àï¿ÉÒÔÕÒµ½¡£Bruno Haible ºÍ Michael Stoll µÄ CLISP ÔÚ lang/clisp ÖпÉÒÔÕÒµ½¡£¶øÏñ°üº¬Ò»¸ö¿ÉÒÔ¸ß ¶ÈÓÅ»¯´úÂëµÄ±àÒëÆ÷µÄ CMUCL£¬»òÕßÏñ±È½Ï¼òµ¥µÄ Lisp µÄʵÏÖµÄ SLisp Ôò Óü¸°ÙÐÐ C ´úÂëʵÏÖÁË´ó²¿·Ö Common Lisp µÄ¹¦ÄÜ¡£Á½¸öÓïÑÔ·Ö±ðÔÚ lang/cmucl ºÍ lang/slisp ÖпÉÒÔÕÒµ½¡£

Perl

¶ÔÓÚϵͳ¹ÜÀíÔ±À´Ëµ·Ç³£ÊÜ»¶Ó­µÄ½Å±¾ÓïÑÔ£»Í¬Ê±Ò²¾­³£±»ÓÃÀ´Ð´Íòά Íø·þÎñÆ÷µÄ CGI ½Å±¾¡£

Perl ÔÚ Ports Collection ÖÐµÄ lang/perl5 ¿ÉÒÔÕÒµ½£¬ÊʺÏËùÓÐ FreeBSD °æ±¾¡£ ¶øÇÒÔÚ 4.X °æ±¾ÖÐÊÇ×÷Ϊ»ù±¾ÏµÍ³µÄ /usr/bin/perl À´°²×°µÄ¡£

Scheme

Lisp µÄÒ»¸ö±äÖÖ¡£±È Common Lisp ¸ü¼Ó½ô´Õ¶øÇåÎú¡£ÔÚ´óѧÀïÃæÏ൱ Á÷ÐÐÒòΪ×ã¹»¼òµ¥¡£ÍùÍùµ±×÷µÚÒ»ÃÅÓïÑԽ̸ø´óѧÉú£¬¶øÇÒÔÚÑо¿ÁìÓòÒ²ÓÐÒ» ¶¨³Ì¶ÈµÄÎüÒýÁ¦¡£

Scheme ÔÚ Ports Collection ÖÐµÄ lang/elk ¿ÉÒÔÕÒµ½ Elk Scheme ½âÊÍÆ÷¡£ lang/mit-scheme ÖеÄÊÇ MIT µÄ Scheme ½âÊÍÆ÷¡£ÔÚ lang/scm ÖÐÊÇ SCM Scheme ½âÊÍÆ÷¡£

Icon

Icon ÊÇÒ»Öָ߼¶ÓïÑÔ£¬ÔÚºÜ¶à·½ÃæÊʺϴ¦Àí×Ö·ûºÍ½á¹¹¡£FreeBSD ÖÐµÄ Icon °æ±¾ÔÚ lang/icon ÖпÉÒÔÕÒµ½¡£

Logo

Logo ÊÇÒ»ÖÖÈÝÒ×ѧϰµÄÓïÑÔ£¬²¢ÇÒÔÚÐí¶à¿Î³ÌÀïÃæ¶¼×÷Ϊһ¸ö½éÉÜÐÔ µÄ±à³ÌÓïÑÔ´æÔÚ¡£Èç¹û¸øÐ¡º¢×ÓÉϱà³Ì¿Î³Ì£¬Logo ÊÇÒ»¸ö·Ç³£°ôµÄ¿ªÊ¼¡£Òò Ϊ£¬¼´Ê¹¶ÔСº¢×ÓÀ´Ëµ£¬ÒªÓà Logo »­Í¼ÐÎÒ²ÊǺÜÈÝÒ×µÄÊÂÇé¡£

FreeBSD ÖÐµÄ Logo ×îа汾¿ÉÒÔÔÚ lang/logo ÖÐÕÒµ½¡£

Python

Python ÊÇÖÖÃæÏò¶ÔÏóµÄ½âÊÍÀàÓïÑÔ¡£Óµ»¤µÄÈ˶¼Ëµ Python ÊÇ¿ªÊ¼Ñ§ ϰ±à³ÌµÄ×î¼ÑÓïÑÔ¡£ÒòΪÏà¶ÔÀ´Ëµ±È½ÏÈÝÒ×Æð²½£¬¶øÇÒÓëÄÇЩÁ÷ÐеÄÄÜ¿ª·¢ÅÓ´ó¶ø¸´ ÔӵĽâÊÍÀàÓïÑÔÀ´±È(Perl ºÍ Tcl ÔÚÕâ¸ö·½ÃæºÜÁ÷ÐÐ)Ò»µãÒ²²»²î¡£

×îа汾µÄ Python ¿ÉÒÔÔÚ Ports Collection µÄ lang/python ÖÐÕÒµ½¡£

Ruby

Ruby ÊÇÒ»¸ö½âÊÍÀàÓïÑÔ£¬²¢ÇÒÊÇ´¿ÃæÏò¶ÔÏóµÄ¡£ÒòΪÆäÓï·¨ÈÝÒ×Àí½â ¶ø±ä»¯¶à¶Ë²¢ÇÒÊʺϿª·¢ÒÔ¼°Î¬»¤ÅÓ´ó¶ø¸´ÔӵijÌÐò¶ø¹ã·ºÁ÷ÐС£

Ruby ¿ÉÒÔÔÚ Ports Collection ÖÐµÄ lang/ruby18 ÖÐÕÒµ½¡£

Tcl ºÍ Tk

Tcl ÊÇÒ»¸öǶÈëʽµÄ½âÊÍÀàÓïÑÔ£¬Äܹ»±»ÒÆÖ²µ½ºÜ¶àƽ̨ÉÏÃæ¡£Òò´Ë±ä µÃ·Ç³£Á÷ÐС£Ëü¼È¿ÉÒÔ¿ìËÙµØÐ´³öСµÄÓ¦ÓóÌÐò£¬Ò²¿ÉÒÔ(ºÍ Tk Ò»ÆðʹÓ㬠һÖÖͼÐι¤¾ß)д³ö¹¦ÄÜ·±¶àµÄ³ÌÐò¡£

FreeBSD Öв»Í¬°æ±¾µÄ Tcl ¶¼ÔÚ ports ÀïÃæ¡£×îа汾£¬Tcl 8.4£¬¿ÉÒÔ ÔÚ lang/tcl84 ÖÐÕÒµ½¡£




2.3.3 ±àÒëÆ÷

¡¡¡¡±àÒëÆ÷Ôò·Ç³£²»Í¬¡£Ê×ÏÈ£¬´úÂë¿ÉÒÔʹÓñ༭Æ÷дµ½Ò»¸ö»ò¶à¸öÎļþÀïÃæ¡£È» ºóÔÙʹÓñàÒëÆ÷À´±àÒë´úÂ룬¿´ÕâЩ´úÂëÊÇ·ñÄܱ»½ÓÊÜ¡£Èç¹û±àÒë²»ÄÜͨ¹ý£¬Ò§½ôÑÀ ¹ØÄúÔÙ´ò¿ª±à¼­Æ÷ÖØÐÂÐ޸İɣ»Èç¹û±àÒëͨ¹ý£¬²¢ÇÒ±àÒëÆ÷¸øÁËÄãÒ»¸ö³ÌÐò¡£Äú¿ÉÒÔ ÔÚÃüÁîÐÐÏÂÖ´ÐлòÕßµ½µ÷ÊÔ»·¾³ÖÐÖ´ÐÐÒÔ±ã²é¿´´úÂëÓÐûÓб»ÕýÈ·Ö´ÐС£ [1]

¡¡¡¡ºÜÃ÷ÏÔ£¬ÕâÖÖ·½Ê½²¢²»Èç½âÊÍÆ÷Ö±½Ó¡£µ«È´¿ÉÒÔÈÃÄã×öºÜ¶à½âÊÍÀàÓïÑÔÎÞ·¨×ö µÄÀ§ÄѵÄÉõÖÁÎÞ·¨Íê³ÉµÄ¹¤×÷¡£ÀýÈçÖ±½ÓÓë²Ù×÷ϵͳ½»»¥©¤©¤»òÕߣ¬ÄãÉõÖÁ¿ÉÒÔ Ð´×Ô¼ºµÄ²Ù×÷ϵͳ¡£Èç¹ûÄãҪд·Ç³£ÓÐЧÂʵĴúÂ룬±àÒëÆ÷Ò²ºÜÓÐÓᣱàÒëÆ÷¿ÉÒÔ»¨ һЩʱ¼äÀ´ÓÅ»¯´úÂ룬¶ø½âÊÍÆ÷ÊÇÎÞ·¨Íê³ÉµÄ¡£ÁíÍ⣬·ÖÏíÄãдµÄ±àÒëÀà³ÌÐò±È½âÊÍ ÀàÓïÑÔÒªÖ±½ÓµÃ¶à¡£Ö»Òª°Ñ±àÒëºÃµÄ³ÌÐò¸ø±ðÈ˾ÍÐУ¬µ±È»ÎÒÃǼٶ¨±ðÈ˺ÍÄã¶¼ÓÐͬ Ò»Àà²Ù×÷ϵͳ¡£

¡¡¡¡±àÒëÀàÓïÑÔ°üÀ¨ Pascal£¬C ºÍ C++¡£C ºÍ C++ ºÜÑϸñ£¬ÊʺÏÄÇЩÓиü¶à¾­Ñé µÄ³ÌÐòÔ±£»¶ø Pascal£¬´ÓÁíÒ»·½ÃæÀ´Ëµ£¬±»Éè¼Æ³ÉΪһ¸ö½ÌѧÓïÑÔ£¬ÊʺϳõѧÕß¡£ FreeBSD ÔÚ»ù±¾ÏµÍ³ÖÐûÓÐÌṩ Pascal¡£µ«ÊÇÔÚ Ports Collection ÖÐÓÐ GNU Pascal Compiler (GPC) ºÍ Free Pascal Compiler£¬·Ö±ðÔÚ lang/gpc ºÍ lang/fpc ÖпÉÒÔÕÒµ½¡£

¡¡¡¡Èç¹ûÄãʹÓò»Í¬µÄ³ÌÐòÀ´Ð´±àÒëÀàÓïÑÔ£¬±à¼­-±àÒë-ÔËÐÐ-µ÷ÊÔ Õâ¸öÑ­»·»á±ä µÃºÜ·³ÈË¡£ºÜ¶àÉÌÒµ±àÒëÆ÷¿ª·¢ÁË Integrated Development Environments (ËõдΪ IDE)¡£FreeBSD ÔÚ»ù±¾ÏµÍ³ÖÐûÓаüº¬ IDE£¬µ«ÊÇÔÚ devel/kdevelop ÌṩÁËÒ»¸öÀý×Ó¡£ÄãÒ²¿É ÒÔʹÓà Emacs µ±×÷ IDE¡£°Ñ Emacs µ±×÷ IDE ÔÚ µÚ 2.7 ½Ú ÖÐÓÐÌÖ ÂÛ¡£


2.4 Óà cc ±àÒë

¡¡¡¡ÕâÒ»ÕÂÎÒÃÇÖ»ÌÖÂÛ GNU µÄ C ºÍ C++ ±àÒëÆ÷£¬ÒòΪÔÚ FreeBSD µÄ»ù±¾ÏµÍ³ÖÐ¾Í °üº¬ÁË¡£Ö±½ÓÔËÐÐ cc »ò gcc ¾Í¿ÉÒÔ¡£¶ø ÓýâÊÍÆ÷д³ÌÐòµÄϸ½Ú¶ÔÓÚ²»Í¬µÄ½âÊÍÆ÷¶¼ºÜ²»Ïàͬ£¬Í¨³£¿ÉÒÔÔÚÌØ¶¨µÄ½âÊÍÆ÷Îĵµ»ò ÕßÔÚÏß°ïÖúÖÐÕÒµ½¡£

¡¡¡¡Ò»µ©ÄãдÍêÄãµÄ½Ü×÷£¬ÏÂÒ»²½¾ÍÊǰÑÄãµÄ½Ü×÷ת»»³É¿ÉÒÔÔÚ FreeBSD ÉÏÔËÐÐ(Ï£ Íû¿ÉÒÔ£¡)µÄ¶«Î÷¡£Í¨³£Õâ°üº¬¼¸¸ö²½Ö裬²»Í¬µÄ²½ÖèÓɲ»Í¬µÄ³ÌÐòÀ´Íê³É¡£

  1. Ô¤´¦ÀíÄãµÄÔ´´úÂ룬ȥµô×¢ÊÍ£¬ÒÔ¼°ÆäËû¼¼ÇÉÐԵŤ×÷¾ÍÏñÔÚ C ÖÐÕ¹¿ªºê¡£

  2. ¼ì²é´úÂëµÄÓï·¨¿´ÄãÊÇ·ñ×ñÊØÁËÕâ¸öÓïÑԵĹæÔò¡£Èç¹ûûÓУ¬±àÒëÆ÷»á¸ø³ö ¾¯¸æ¡£

  3. °ÑÔ´´úÂëת»»Îª»ã±àÓïÑÔ ©¤©¤ ºÍ»úÆ÷´úÂëºÜÏàËÆ£¬ µ«ÊÇÔÚÒ»¶¨Çé¿öÏÂÎÒÃÇÈÔÈ»¿ÉÒÔÀí½â¡£ [2]

  4. °Ñ»ã±àÓïÑÔת»»Îª»úÆ÷ÓïÑÔ©¤©¤Êǵģ¬ÎÒÃÇÔÚ˵λԪºÍ×Ö½Ú£¬¾ÍÊÇ1ºÍ0¡£

  5. ¼ì²éÄãÊÇ·ñ׼ȷµØÊ¹ÓÃÁ˺¯ÊýºÍÈ«¾Ö±äÁ¿ÀàËÆµÄ¶«Î÷¡£ÀýÈ磬Èç¹ûÄãµ÷ÓÃÁË Ò»¸ö²»´æÔڵĺ¯Êý£¬±àÒëÆ÷¾Í»á¸ø³ö¾¯¸æ¡£

  6. Èç¹ûÄãÊÇ´Ó¶à¸öÔ´´úÂëÎļþ±àÒ룬¾ÍҪѧ»áÈçºÎ°ÑÕâЩÎļþ×éºÏµ½Ò»Æð¡£

  7. °Ñ²úÉú³öÀ´µÄ¶«Î÷ÓÃϵͳµÄÔËÐÐ×°ÔØÆ÷×°ÈëÄÚ´æ²¢ÔËÐС£

  8. ×îºó£¬°Ñ¿ÉÖ´ÐÐÎļþдÈëÎļþϵͳ¡£

¡¡¡¡±àÒë Õâ¸ö´ÊµÄÒâ˼ͨ³£Ö¸ 1 µ½ 4 ²½©¤©¤ÆäËûµÄ ²½Öè½Ð×ö Á¬½Ó¡£ÓÐʱºîµÚÒ»²½½Ð×ö Ô¤´¦Àí ¡£µÚÈýºÍµÚËIJ½½Ð×ö »ã±à ¡£

¡¡¡¡ÐÒÔ˵ÄÊÇ£¬¼¸ºõËùÓÐÕâЩϸ½Ú¶¼ÊÇÒþ²ØµÄ£¬ÒòΪ cc Ö»ÊÇ Ò»¸öǰ¶Ë¡£Ëü¸ù¾ÝÕýÈ·µÄ²ÎÊýµ÷ÓóÌÐòÀ´´¦Àí´úÂë¡£Ö»ÒªÊäÈë

% cc foobar.c

¡¡¡¡¾Í»á°Ñ foobar.c ͨ¹ýÒÔÉϵIJ½Öè±àÒë³öÀ´¡£Èç¹ûÄãÓÐ ¶à¸öÎļþÒª±àÒ룬ֻҪÊäÈë

% cc foo.c bar.c

¡¡¡¡×¢Ò⣬Óï·¨¼ì²é¾ÍÊÇ©¤©¤´¿´âµÄ¼ì²éÓï·¨¡£¶ø²»»á¼ì²âÄã¿ÉÄÜ·¸µÄÈκÎÂß¼­ ´íÎó¡£±ÈÈçÎÞÏÞÑ­»·£¬»òÕßÊÇÄãÏëÓÃÒ»ÔªÅÅÐòȴʹÓÃÁËðÅÝÅÅÐò¡£ [3]

¡¡¡¡cc ÓкܶàÑ¡ÏÔÚ°ïÖúÊÖ²áÖж¼¿ÉÒÔÕÒµ½¡£ÕâÀïÁгöÁËÒ» Щ×îÖØÒªµÄÑ¡Ï²¢ÇÒÓÐÀý×Ó¡£

-o filename

Êä³öµÄÎļþÃû¡£Èç¹ûÄ㲻ʹÓÃÕâ¸öÑ¡ÏccΪ²úÉú ³öÒ»¸ö½Ð a.out µÄÖ´ÐÐÎļþ¡£ [4]

% cc foobar.c
¿ÉÖ´ÐÐÎļþÊÇ a.out
% cc -o foobar foobar.c     ¿ÉÖ´ÐÐÎļþÊÇ foobar
       
-c

½ö½ö±àÒëÎļþ£¬²»»áÁ¬½Ó¡£Èç¹ûÄãÖ»Ïë¼ì²éÄãдµÄ²âÊÔ³ÌÐòµÄÓï·¨µÄ»°£¬ Õâ¸öÑ¡Ïî·Ç³£ÓÐÓ᣻òÕßÄã»áʹÓà Makefile¡£

% cc -c foobar.c
       

Õâ»á²úÉúÒ»¸ö Ä¿±êÎļþ (²»¿ÉÖ´ÐÐ) ½Ð×ö foobar.o¡£Õâ¸öÎļþ¿ÉÒÔºÍÆäËûµÄÄ¿±êÎļþÁ¬½ÓÔÚÒ»Æð ¹¹³ÉÒ»¸ö¿ÉÖ´ÐÐÎļþ¡£

-g

²úÉúÒ»¸ö¿Éµ÷ÊԵĿÉÖ´ÐÐÎļþ¡£±àÒëÆ÷»áÔÚ¿ÉÖ´ÐÐÎļþÖÐÖ²ÈëһЩÐÅÏ¢£¬ ÕâЩÐÅÏ¢Äܹ»°ÑÔ´ÎļþÖеÄÐÐÊýºÍ±»µ÷Óõĺ¯ÊýÁªÏµÆðÀ´¡£ÔÚÄãÒ»²½Ò»²½µ÷ÊÔ³Ì ÐòµÄʱºò£¬µ÷ÊÔÆ÷Äܹ»Ê¹ÓÃÕâЩÐÅÏ¢À´ÏÔʾԴ´úÂë¡£ÕâÊÇ ·Ç³£ ÓÐÓõģ»È±µã¾ÍÊDZ»Ö²ÈëµÄÐÅÏ¢ÈóÌÐò±äµÃ¸ü´ó¡£Í¨³£Çé¿öÏ£¬¿ª ·¢Ò»¸ö³ÌÐòµÄʱºòÎÒÃǾ­³£Ê¹Óà -g£¬µ«ÊÇÎÒÃÇÔÚ±àÒëÒ»¸ö ¡°release °æ±¾¡± µÄ³ÌÐòµÄʱºò£¬Èç¹û³ÌÐò¹¤×÷µÃÈÃÈËÂúÒâÁË£¬ÎÒ ÃǾͲ»Ê¹Óà -g ±àÒë¡£

% cc -g foobar.c
       

Õâ»á²úÉúÒ»¸ö¿Éµ÷ÊÔ°æ±¾µÄ³ÌÐò¡£ [5]

-O

²úÉúÒ»¸öÓÅ»¯°æ±¾µÄ¿ÉÖ´ÐÐÎļþ¡£±àÒëÆ÷»áʹÓÃһЩ´ÏÃ÷µÄ¼¼ÇɲúÉú³ö±È ÆÕͨ±àÒë²úÉúµÄÎļþÖ´Ðиü¿ìµÄ¿ÉÖ´ÐÐÎļþ¡£¿ÉÒÔÔÚ -O ¼Ó ÉÏÊý×ÖÀ´Ê¹Óøü¸ß¼¶µÄÓÅ»¯¡£µ«ÊÇÕâÑù×ö¾­³£»á±©Â¶³ö±àÒëÆ÷µÄÓÅ»¯Æ÷ÖеÄһЩ ´íÎó¡£ÀýÈ磬2.1.0 °æ±¾µÄ FreeBSD ÖÐµÄ cc ÔÚijЩÇé¿ö ÏÂʹÓÃÁË -O2 µÄ»°£¬»á²úÉú³ö´íÎóµÄ´úÂë¡£

ÓÅ»¯Í¨³£Ö»ÔÚ±àÒëÒ»¸ö release °æ±¾µÄʱºò²Å±»´ò¿ª¡£

% cc -O -o foobar foobar.c
       

Õâ»á²úÉúÒ»¸öÓÅ»¯°æ±¾µÄ foobar¡£

¡¡¡¡ÏÂÃæµÄÈý¸ö²ÎÊý»áÆÈʹ cc ¼ì²éÄãµÄ´úÂëÊÇ·ñ·ûºÏһЩ¹ú ¼Ê±ê×¼£¬¾­³£±»ÎÒÃǽÐ×ö ANSI ±ê×¼£¬ËäÈ»ÑϸñµÄÀ´ËµËüÊÇÒ»¸ö ISO ±ê×¼¡£

-Wall

´ò¿ªËùÓÐ cc µÄ×÷ÕßÈÏΪֵµÃ×¢ÒâµÄ¾¯¸æ¡£²»ÒªÖ» ¿´Õâ¸öÑ¡ÏîµÄÃû×Ö£¬Ëü²¢Ã»Óдò¿ªËùÓÐ cc Äܹ»×¢Òâµ½µÄ ËùÓо¯¸æ¡£

-ansi

¹Ø±Õ´ó¶àÊý£¬µ«²¢²»ÊÇËùÓУ¬cc ÌṩµÄ·Ç ANSI C ÌØÐÔ¡£²»ÒªÖ»¿´Ñ¡ÏîµÄÃû×Ö£¬Ëü²¢²»Ñϸñ±£ Ö¤ÄãµÄ´úÂë»á¼æÈݱê×¼¡£

-pedantic

¹Ø±Õ ËùÓÐ cc µÄ·Ç ANSI C ÌØÐÔ¡£

¡¡¡¡Ã»ÓÐÕâЩѡÏcc ÄÜÔÊÐíÄã°´ÕÕ±ê׼ʹÓÃһЩ·Ç±ê×¼µÄÀ© Õ¹¡£ÓÐһЩÀ©Õ¹·Ç³£ÓÐÓ㬵«²»ÄÜÓëÆäËû±àÒëÆ÷¼æÈÝ©¤©¤Êµ¼ÊÉÏ£¬Õâ¸ö±ê×¼µÄÖ÷Òª Ä¿µÄÖ®Ò»¾ÍÊÇÔÊÐíÎÒÃÇд³ö¿ÉÒÔÔÚÈκÎϵͳÉϵÄÓÉÈκαàÒëÆ÷±àÒëµÄ´úÂë¡£Õâ¾Í½Ð×ö ¿ÉÒÆÖ²´úÂë

¡¡¡¡Í¨³£À´Ëµ£¬ÄãÓ¦¸ÃÈÃÄãµÄ´úÂ뾡¿ÉÄܵĿÉÒÔÒÆÖ²¡£·ñÔòÄã¾Í²»µÃ²»ÍêÈ«ÖØÐ´ÄãµÄ ´úÂëÒÔ±ãÄܹ»ÔÚÆäËûµØ·½ÔËÐÐÖ®©¤©¤¶øÇÒË­ÖªµÀ¼¸ÄêºóÄãÊÇ·ñ»¹»áÓÃËü£¿

% cc -Wall -ansi -pedantic -o foobar foobar.c

¡¡¡¡Õâ»áÔÚ¼ì²é foobar.c¶Ô±ê×¼µÄ¼æÈÝÐÔÒÔºó²úÉúÒ»¸ö foobar ¿ÉÖ´ÐÐÎļþ¡£

-llibrary

ÔÚÁ¬½ÓµÄʱºòÖ¸¶¨Ò»¸öº¯Êý¿â¡£

×î³£¼ûµÄÇé¿ö¾ÍÊǵ±Äã±àÒëÒ»¸öʹÓÃÁËһЩ C ÖеÄÊýѧº¯ÊýµÄʱºò¡£²» Ïñ´ó¶àÊýÆäËûµÄƽ̨£¬ÕâЩº¯Êý¶¼²»ÔÚ C µÄ±ê×¼¿âÀïÃæ¡£Äã±ØÐë¸æËß±àÒëÆ÷¼Ó ÉÏÕâЩ¿â¡£

Õâ¸ö¹æÔò¾ÍÊÇ£¬Èç¹û¿âµÄÃû×Ö½Ð×ö libsomething.a£¬Äã¾Í±Ø Ðë¸ø cc ÕâÑùµÄÑ¡Ïî -lsomething¡£ÀýÈ磬Êýѧ¿â ½Ð×ö libm.a£¬Òò´ËÄã¸ø cc µÄÑ¡ Ïî¾ÍÊÇ -lm¡£Ò»°ãÇé¿öÏ£¬ÎÒÃÇÒª°ÑÕâ¸öÑ¡Ïî·Åµ½ÃüÁîÐÐµÄ ×îºó¡£

% cc -o foobar foobar.c -lm
       

Õâ¸ö»á°ÑÊýѧº¯Êý¿âÁ¬½Óµ½ foobar ÀïÃæ¡£

Èç¹ûÄãÒª±àÒë C++ ´úÂ룬ÄãÐèÒª -lg++£¬»òÕß -lstdc++ Èç¹ûÄãʹÓõÄÊÇ FreeBSD 2.2 »òÕ߸ü¸ß°æ±¾£¬À´ Á¬½Ó C++ ¿â¡£»òÕߣ¬Äã¿ÉÒÔÔËÐÐ c++ ¶ø²»ÊÇ cc À´±àÒë C++ ´úÂë¡£ÔÚ FreeBSD ÉÏ£¬ c++ Ò²¿ÉÒÔͨ¹ýÔËÐÐ g++ À´»½ÐÑ¡£

% cc -o foobar foobar.cc
-lg++     ¶ÔÓÚ FreeBSD 2.1.6 »òÕ߸üµÍµÄ°æ±¾
% cc -o foobar foobar.cc -lstdc++
¶Ô FreeBSD 2.2 »òÕ߸ü¸ßµÄ°æ±¾
% c++ -o foobar foobar.cc
       

Á½ÖÖÇé¿ö¶¼»á´Ó C++ Ô´Îļþ foobar.cc²úÉúÒ»¸ö ¿ÉÖ´ÐÐÎļþ foobar¡£×¢Ò⣬ÔÚ UNIX ϵͳÖУ¬C++ Ô´ ÎļþµÄ´«Í³ºó׺ÊÇ .C£¬.cxx »ò Õß .cc£¬¶ø²»ÊÇ MS-DOS® ÀàÐ굀 .cpp (Õâ¸öºó׺ÒѾ­±»Óõ½ÁËÆäËûµÄµØ·½)¡£ gcc ¸ù¾ÝÕâ¸öÔ¼¶¨À´È·¶¨Ó¦¸ÃʹÓúÎÖÖÀàÐ͵ıàÒëÆ÷À´±à ÒëÔ´Îļþ¡£µ«ÊÇ£¬Õâ¸öÏÞÖÆ²»ÔÙÆð×÷ÓÃÁË£¬Òò´ËÏÖÔÚÄã¿ÉÒÔ×ÔÓɵÄʹÓà .cpp Õâ¸öºó׺À´ÃüÃûÄãµÄ C++ Ô´Îļþ£¡


2.4.1 ³£¼û cc ÎÊÌâ

2.4.1.1. ÎÒ³¢ÊÔдһ¸ö³ÌÐò£¬ÆäÖÐʹÓÃÁË sin() Õâ¸öº¯ Êý¡£µ«ÊÇÎÒÈ´µÃµ½ÁËÈçϵĴíÎó¡£Õâ¸ö´íÎóÊÇʲôÒâ˼£¿
2.4.1.2. ºÃµÄ£¬ÎÒдÁËÒ»¸ö¼òµ¥µÄ³ÌÐò£¬Á·Ï°Ê¹Óà -lm¡£Ò² ¾ÍÊǼÆËã 2.1 µÄ 6 ´Î·½¡£
2.4.1.3. ÄÇôÎÒÔõô²ÅÄܸÄÕýÕâ¸ö´íÎó£¿
2.4.1.4. ÎÒ±àÒëÁËÒ»¸öÎļþ½Ð foobar.c µ«ÊÇÎÒûÓÐÕÒ µ½½Ð foobar µÄÖ´ÐÐÎļþ¡£Õâ¸öÎļþµ½ÄÄÀïÈ¥ÁË£¿
2.4.1.5. ºÃµÄ£¬ÎÒÓÐÒ»¸öÖ´ÐÐÎļþ foobar£¬ÎÒÓÃÃüÁî ls ¿ÉÒÔ¿´¼û£¬µ«ÊÇÔÚÃüÁîÐÐÎÒÊäÈë foobar È´µÃµ½Ìáʾ˵ûÓÐÕâ¸öÎļþ¡£ÎªÊ²Ã´ÕÒ²»µ½ÄØ£¿
2.4.1.6. ÎҵĿÉÖ´ÐÐÎļþ½Ð×ö test£¬µ«ÊÇÎÒÔËÐÐÖ®ºóÈ´ ʲôҲû·¢Éú¡£µ½µ×ÔõôÁË£¿
2.4.1.7. ÎÒ±àÒëÁËÒ»¸ö³ÌÐò£¬¿ªÊ¼¿´ÆðÀ´ÔËÐеò»´í¡£µ«ÊǺóÀ´µ÷ÊÔÁË£¬ËµÊ²Ã´ ¡°core dumped¡±¡£Õâ¸öÊÇʲôÒâ˼£¿
2.4.1.8. ͦ²»´í£¬µ«ÏÖÔÚÎÒ¸ÃÔõô°ìÄØ£¿
2.4.1.9. ÎҵijÌÐò°Ñ core dump ÒÔºó£¬ËµÓÐÒ»¸öʲô ¡°segmentation fault¡±¡£ÕâÊÇʲô£¿
2.4.1.10. ÓÐʱºòµ±Îҵõ½Ò»¸ö core dump£¬Ìáʾ˵ ¡°bus error¡±¡£ÎÒµÄ UNIX ½Ì²ÄÀïÃæËµÕâÒâζÕâÓ²¼þ´íÎ󣬵«ÊǼÆËã »ú¿´ÆðÀ´ÔËÐкÜÕý³£¡£ÕâÊÇÕæµÄÂð£¿
2.4.1.11. Èç¹ûÎÒ¿ÉÒÔÈà core dump ÔÚÐèÒªµÄʱºò²úÉú£¬ÄǾÍÕæµÄºÜ²»´í¡£ÎÒÄÜ ÕâÑù×öÂ𣬻òÕßÎҵõÈÖ±µ½·¢ÉúÒ»¸ö´íÎó£¿

2.4.1.1. ÎÒ³¢ÊÔдһ¸ö³ÌÐò£¬ÆäÖÐʹÓÃÁË sin() Õâ¸öº¯ Êý¡£µ«ÊÇÎÒÈ´µÃµ½ÁËÈçϵĴíÎó¡£Õâ¸ö´íÎóÊÇʲôÒâ˼£¿

/var/tmp/cc0143941.o: Undefined symbol `_sin' referenced from text segment
         

µ±Ê¹ÓÃÏñ sin() ÕâÑùµÄÊýѧº¯ÊýµÄʱºò£¬Äã±Ø Ðë¸æËß cc °ÑÊýѧº¯Êý¿â¸øÁ¬½Ó½øÀ´£¬¾ÍÏñÕâÑù£º

% cc -o foobar foobar.c -lm
         

2.4.1.2. ºÃµÄ£¬ÎÒдÁËÒ»¸ö¼òµ¥µÄ³ÌÐò£¬Á·Ï°Ê¹Óà -lm¡£Ò² ¾ÍÊǼÆËã 2.1 µÄ 6 ´Î·½¡£

#include <stdio.h>

int main() {
    float f;

    f = pow(2.1, 6);
    printf("2.1 ^ 6 = %f\n", f);
    return 0;
}
         

È»ºóÎÒ±àÒ룺

% cc temp.c -lm
         

¾ÍÏñÄã˵µÄÎÒÓ¦¸Ã×öµÄÄÇÑù¡£µ«ÊÇÎÒÔÚÔËÐеÄʱºòÈ´ÓÐÈçÏÂÌáʾ£º

% ./a.out
2.1 ^ 6 = 1023.000000
         

Õâ¸ö ²» ÊÇÕýÈ·µÄ´ð°¸£¡µ½µ×ÔõôÁË£¿

µ±±àÒëÆ÷¿´¼ûÄãµ÷ÓÃÁËÒ»¸öº¯Êý£¬Ëü»á¼ì²éÊÇ·ñÒѾ­ÓÐÁËÒ»¸öÏàÅäºÏµÄ ԭʼÀàÐÍ (prototype)£¬Èç¹ûûÓУ¬±àÒëÆ÷»á¼Ù¶¨º¯ÊýµÄ·µ»ØÖµÊÇ Õû Êý£¬Ç¡Ç¡²»ÊÇÄãµÄ³ÌÐòÏëÒªµÄ½á¹û¡£

2.4.1.3. ÄÇôÎÒÔõô²ÅÄܸÄÕýÕâ¸ö´íÎó£¿

Êýѧº¯ÊýµÄÉùÃ÷Ô­ÐͶ¼ÔÚ math.h ÀïÃæ¡£Èç¹û ÄãÒýÓÃÁËÕâ¸öÎļþ£¬±àÒëÆ÷¾ÍÄÜÕÒµ½Õâ¸öÔ­ÐÍÈ»ºó¾Í²»»á¶ÔÄãµÄ¼ÆËã×öÆæ¹ÖµÄ ¸ÉÈÅ¡£

#include <math.h>
#include <stdio.h>

int main() {
...
         

ÏñÒÔǰһÑù±àÒ룬ȻºóÔÙÔËÐУº

% ./a.out
2.1 ^ 6 = 85.766121
         

Èç¹ûÄãʹÓÃÁËÈκÎÒ»¸öÊýѧº¯Êý£¬Ò»¶¨Òª¼ÇµÃ ÒýÓà math.h Õâ¸öÎļþ£¬²¢ÇÒÁ¬½ÓÊýѧº¯Êý¿â¡£

2.4.1.4. ÎÒ±àÒëÁËÒ»¸öÎļþ½Ð foobar.c µ«ÊÇÎÒûÓÐÕÒ µ½½Ð foobar µÄÖ´ÐÐÎļþ¡£Õâ¸öÎļþµ½ÄÄÀïÈ¥ÁË£¿

¼Çס£¬³ý·ÇÄãÖ¸¶¨Ò»¸öÃû×Ö£¬cc»á°Ñ±àÒë³öµÄÎÄ ¼þ½Ð×ö a.out¡£Ê¹Óà -o filename Õâ¸öÑ¡ Ï

% cc -o foobar foobar.c
         

2.4.1.5. ºÃµÄ£¬ÎÒÓÐÒ»¸öÖ´ÐÐÎļþ foobar£¬ÎÒÓÃÃüÁî ls ¿ÉÒÔ¿´¼û£¬µ«ÊÇÔÚÃüÁîÐÐÎÒÊäÈë foobar È´µÃµ½Ìáʾ˵ûÓÐÕâ¸öÎļþ¡£ÎªÊ²Ã´ÕÒ²»µ½ÄØ£¿

²»Ïñ MS-DOS£¬UNIX ²»»áÔÚµ±Ç°Ä¿Â¼Ñ°ÕÒÄãÏëÖ´ÐеÄÎļþ£¬³ý·ÇÄã Ö¸¶¨ÕâÑù×ö¡£¿ÉÒÔÊäÈë ./foobar£¬Òâ˼ÊÇ ¡°ÔÚµ± ǰĿ¼ÏÂÔËÐÐÎļþ foobar¡£¡±£¬Ò²¿ÉÒԸı价 ¾³±äÁ¿ PATH ÏñÕâ¸öÑù×Ó

bin:/usr/bin:/usr/local/bin:.
         

×îºóµÄÄǸöµãµÄÒâ˼¾ÍÊÇ ¡°Èç¹ûÔÚÆäËûÈκÎĿ¼ÕÒ²»µ½£¬ÔÚµ±Ç° Ŀ¼ÖÐѰÕÒ¡£¡±

2.4.1.6. ÎҵĿÉÖ´ÐÐÎļþ½Ð×ö test£¬µ«ÊÇÎÒÔËÐÐÖ®ºóÈ´ ʲôҲû·¢Éú¡£µ½µ×ÔõôÁË£¿

´ó¶àÊý UNIX ϵͳÔÚ /usr/bin ÏÂÓÐÒ»¸ö³Ì Ðò½Ð×ö test¡£Shell »áÏȼì²éÕâ¸ö³ÌÐòÈ»ºóÔÚ¼ì²éµ±Ç° Ŀ¼ѰÕÒ¿ÉÖ´ÐÐÎļþ¡£¿ÉÒÔÊäÈ룺

% ./test
         

»òÕ߸øÄãµÄ³ÌÐòѡһ¸ö¸üºÃµÄÃû×Ö£¡

2.4.1.7. ÎÒ±àÒëÁËÒ»¸ö³ÌÐò£¬¿ªÊ¼¿´ÆðÀ´ÔËÐеò»´í¡£µ«ÊǺóÀ´µ÷ÊÔÁË£¬ËµÊ²Ã´ ¡°core dumped¡±¡£Õâ¸öÊÇʲôÒâ˼£¿

core dump Õâ¸öÃû×Ö¿ÉÒÔ×·Ëݵ½ UNIX µÄÔç ÆÚÀúÊ·£¬µ±Ê±µÄ¼ÆËã»ú¶¼Ê¹ÓÃÏßȦÄÚ´æ´¢´æÊý¾Ý¡£Í¨³£Çé¿öÏ£¬Èç¹ûÒ»¸ö³ÌÐò ÔÚÒ»¶¨µÄÇé¿öÏÂÖ´ÐÐʧ°ÜÁË£¬ÏµÍ³¾Í»á°ÑÏßȦÄÚ´æµÄÄÚÈÝдµ½´ÅÅÌÉϵÄÒ»¸öÎÄ ¼þÖУ¬Õâ¸öÎļþ¾Í½Ð core¡£Í¨¹ýÑо¿Õâ¸öÎļþ£¬³ÌÐò Ô±¾Í¿ÉÒÔ·¢ÏÖÎÊÌâÖ®ËùÔÚ¡£

2.4.1.8. ͦ²»´í£¬µ«ÏÖÔÚÎÒ¸ÃÔõô°ìÄØ£¿

ʹÓà gdb ·ÖÎöÕâ¸ö core Îļþ (¼û µÚ 2.6 ½Ú)¡£

2.4.1.9. ÎҵijÌÐò°Ñ core dump ÒÔºó£¬ËµÓÐÒ»¸öʲô ¡°segmentation fault¡±¡£ÕâÊÇʲô£¿

»ù±¾ÉÏÊÇÄãµÄ³ÌÐò³¢ÊÔ¶ÔÄÚ´æ½øÐÐijÖÖ·Ç·¨µÄ²Ù×÷µ¼Öµġ£UNIX ÔÚ Éè¼ÆÉÏÒª±£»¤²Ù×÷ϵͳ±¾ÉíºÍÆäËû³ÌÐò²»ÊÜ·Ç·¨³ÌÐòµÄ¸ÉÈÅ¡£

ͨ³£µÄÔ­ÒòÓÐÈçÏÂÕâЩ£º

  • ³¢ÊÔ¸³Öµ¸øÒ»¸ö NULL Ö¸Õ룬ÀýÈç

    char *foo = NULL;
    strcpy(foo, "bang!");
           
    
  • ʹÓÃÒ»¸öδ±»³õʼ»¯µÄÖ¸Õ룬ÀýÈç

    char *foo;
    strcpy(foo, "bang!");
           
    

    ÔÚijÖÖÇé¿öÏ£¬Ö¸ÕëËù°üº¬µÄÖµ»áÖ¸ÏòÄÚ´æÖÐij¸öÇøÓò£¬Õâ¸öÇøÓò ¶ÔÄãµÄ³ÌÐòÊDz»¿É²Ù×÷µÄ¡£ÔÚÄãµÄ³ÌÐòÔì³ÉÈÎºÎÆÆ»µÖ®Ç°£¬Äں˻áÖÕÖ¹³Ì Ðò¡£Èç¹ûÄãÔËÆø²»ºÃ£¬Õâ¸öÖ¸Õë»áÖ¸ÏòÄã×Ô¼ºµÄ³ÌÐòÔÚÄÚ´æÖеÄij¸öÇøÓò£¬ ´Ó¶øÆÆ»µ×ÔÉíµÄijЩÊý¾Ý½á¹¹£¬µ¼Ö³ÌÐòÆæ¹ÖµØ±ÀÀ£¡£

  • Êý×éÔ½½ç£¬ÀýÈç

    int bar[20];
    bar[27] = 6;
           
    
  • ³¢ÊÔÔÚÖ»¶ÁÄÚ´æÖд¢´æÊý¾Ý£¬ÀýÈç

    char *foo = "My string";
    strcpy(foo, "bang!");
           
    

    UNIX ±àÒëÆ÷¾­³£°ÑÏñ "My string" ÕâÑù µÄ×Ö·û´®·Åµ½Ö»¶ÁÄÚ´æÖС£

  • ´íÎóµÄʹÓú¯Êý malloc() ºÍ free()£¬ÀýÈç

    char bar[80];
    free(bar);
           
    

    or

    char *foo = malloc(27);
    free(foo);
    free(foo);
           
    

ÕâЩ´íÎó²¢²»×ܻᵼÖÂÄãµÄ³ÌÐò±ÀÀ££¬µ«ÕâЩ¶¼ÊÇ»µµÄϰ¹ß¡£ÓÐЩϵͳ ºÍ±àÒëÆ÷±ÈÆäËûµÄϵͳºÍ±àÒëÆ÷Óиü¶àµÄÈÝ´íÐÔ£¬Õâ¾ÍÊÇΪʲôһЩ³ÌÐòÔÚÒ» ¸öϵͳÉÏ¿ÉÒÔÔËÐкܺ㬶øÔÚÁíÒ»¸öϵͳÉÏÈ´»á±ÀÀ£¡£

2.4.1.10. ÓÐʱºòµ±Îҵõ½Ò»¸ö core dump£¬Ìáʾ˵ ¡°bus error¡±¡£ÎÒµÄ UNIX ½Ì²ÄÀïÃæËµÕâÒâζÕâÓ²¼þ´íÎ󣬵«ÊǼÆËã »ú¿´ÆðÀ´ÔËÐкÜÕý³£¡£ÕâÊÇÕæµÄÂð£¿

²»ÊÇÕæµÄ£¬ºÜÐÒÔ˲»ÊÇ(³ý·ÇÄãÕæµÄÓö¼ûÁËÒ»¸öÓ²¼þÎÊÌâ...)¡£Õâ ͨ³£ÊÇÓÃÁíÒ»ÖÖ·½Ê½ËµÄã³¢ÊÔ¶Áдһ¿éÎÞȨ¶ÁдµÄÄÚ´æ¡£

2.4.1.11. Èç¹ûÎÒ¿ÉÒÔÈà core dump ÔÚÐèÒªµÄʱºò²úÉú£¬ÄǾÍÕæµÄºÜ²»´í¡£ÎÒÄÜ ÕâÑù×öÂ𣬻òÕßÎҵõÈÖ±µ½·¢ÉúÒ»¸ö´íÎó£¿

¿ÉÒÔ£¬Çл»µ½ÁíÒ»¸ö¿ØÖÆÌ¨»òÕßÆð¶¯ xterm, Ö´ÐÐ

% ps
       

ÕÒµ½ÄãµÄ³ÌÐòµÄ½ø³ÌºÅ£¬È»ºóÖ´ÐÐ

% kill -ABRT pid
       

ÆäÖÐµÄ pid ¾ÍÊÇÄãÕÒµ½µÄ½ø³ÌºÅ¡£

Èç¹ûÄãµÄ³ÌÐòÏÝÈëÁËÒ»¸öÎÞÏÞÑ­»·£¬ÕâÑù×ö¾ÍºÜÓÐÓô¦¡£Èç¹ûÄãµÄ³ÌÐò żȻµÃµ½ÁË SIGABRT Ðźţ¬»¹ÓÐһЩÀàËÆµÄÐźÅÒ²ÓÐͬÑù µÄ¹¦Óá£

»òÕߣ¬Äã¿ÉÒÔʹÓú¯Êý abort() ÔÚ×Ô¼ºµÄ³ÌÐò ÖвúÉúÒ»¸ö core dump¡£Çë²Î¿¼ÊÖ²áµÄ abort(3) À´Á˽â¸ü¶à¡£

Èç¹ûÄãÏëÔÚ×Ô¼ºµÄ³ÌÐòÖ®Íâ²úÉúÒ»¸ö core dump£¬¶ø²»ÈóÌÐòÖÕÖ¹£¬ ÄÇôÄã¿ÉÒÔÓÃÃüÁî gcore¡£Çë²Î¿¼ÊÖ²áµÄ gcore(1) Á˽â¸ü¶à¡£


2.5 Make

2.5.1 ʲôÊÇ make£¿

¡¡¡¡µ±Äãдһ¸ö¼òµ¥µÄ³ÌÐò£¬Ö»ÓÐÒ»µ½Á½¸öÔ´ÎļþµÄʱºò£¬ÊäÈë

% cc file1.c file2.c

¡¡¡¡¾ÍûʲôÎÊÌ⣬µ«Èç¹ûÓкܶàÔ´Îļþ¾Í»áºÜ·³ÈË©¤©¤±àÒëµÄʱ¼äÒ²»áºÜ³¤¡£

¡¡¡¡Ò»¸ö·½·¨¾ÍÊÇʹÓÃÄ¿±êÎļþ£¬Ö»ÔÚÔ´ÎļþÓиıäµÄÇé¿öϲÅÖØÐ±àÒëÔ´Îļþ¡£ Òò´ËÄã¿ÉÒÔÕâÑù×ö£º

% cc file1.o file2.o ... file37.c ...

¡¡¡¡ÉϴαàÒëºó£¬file37.c ·¢ÉúÁ˸ı䣬µ«ÆäËûÎÄ ¼þûÓС£ÕâÑù×ö¿ÉÒÔÈñàÒë¹ý³Ì¿ìºÜ¶à£¬µ«ÊÇÒ²²»Äܽâ¾öÀÛÈ˵ÄÊäÈëÎÊÌâ¡£

¡¡¡¡»òÕßÎÒÃÇ¿ÉÒÔʹÓÃÒ»¸ö shell script À´½â¾öÊäÈëÎÊÌ⣬µ«ÊÇÒ²ÐèÒªÖØÐ±àÒë ËùÓÐÎļþ£¬ÔÚ´óÐÍÏîÄ¿ÉϺÜûÓÐЧÂÊ¡£

¡¡¡¡Èç¹ûÓгɰÙÉÏǧµÄÔ´ÎļþµÄ»°Ôõô°ì£¿Èç¹ûÎÒÃÇÔÚÓëºÜ¶àÈ˺Ï×÷д³ÌÐò£¬±ðÈË ¶ÔÔ´Îļþ½øÐÐÁËÐ޸ģ¬ÓÖûÓиæËßÄ㣬¸ÃÔõô°ì£¿

¡¡¡¡Ò²ÐíÎÒÃÇ¿ÉÒÔ°ÑÒÔÉÏÁ½ÖÖ·½·¨½áºÏ£¬Ð´Ò»ÖÖÏñ shell script Ò»ÑùµÄ¶«Î÷¡£Õâ ÖÖÎļþ°üº¬Ä³ÖÖ¼¼ÇÉ¿ÉÒÔ¾ö¶¨Ê²Ã´Ê±ºò¸Ã¶ÔÔ´Îļþ½øÐбàÒë¡£ÏÖÔÚËùÓÐÎÒÃÇÒªµÄ¾ÍÊÇ Ò»¸ö³ÌÐò¿ÉÒÔ¶®µÃÕâÖÖ¼¼ÇÉ£¬ÒòΪҪ¶®µÃÕâÖÖ¼¼ÇÉ£¬shell »¹Ã»ÄÇô´óµÄÄÜÄÍ¡£

¡¡¡¡Õâ¸ö³ÌÐò¾Í½Ð make¡£Ëü¶ÁÈëÒ»¸öÎļþ£¬½Ð makefile£¬Õâ¸öÎļþ¾ö¶¨ÁËÔ´ÎļþÖ®¼äµÄÒÀÀµ¹ØÏµ¡£¶øÇÒ ¾ö¶¨ÁËÔ´Îļþʲôʱºò¸Ã±àÒëʲôʱºò²»Ó¦¸Ã±àÒë¡£ÀýÈ磬ij¸ö¹æÔò¿ÉÒÔ˵ ¡° Èç¹û fromboz.o ±È fromboz.c Òª¾É£¬ Òâ˼¾ÍÊÇÓÐÈËÐÞ¸ÄÁË fromboz.c£¬Òò´ËÎÒÃÇÐèÒªÖØÐ±àÒëÕâ ¸öÎļþ¡£¡±Õâ¸ö makefile »¹ÓйæÔò֪ͨ make ¸Ã Ôõô ÖØÐ±àÒëÔ´Îļþ£¬Òò´Ë make ÊÇÒ»¸öÇ¿´óµÃ¶àµÄ¹¤¾ß¡£

¡¡¡¡makefile ͨ³£ºÍÏà¹ØµÄÔ´Îļþ±£´æÔÚͬһ¸öĿ¼Ï£¬¿ÉÒÔ½Ð×ö makefile£¬Makefile »òÕß MAKEFILE¡£´ó¶àÊý³ÌÐòÔ±»áʹÓà Makefile Õâ¸öÃû×Ö£¬ÒòΪÕâÑù¿ÉÒÔÈÃÕâ¸öÎļþ±»·ÅÔÚĿ¼ÁÐ ±íµÄ¶¥¶Ë£¬¿ÉÒÔºÜÈÝÒ׵ÿ´¼û¡£ [6]


2.5.2 ʹÓà make µÄÀý×Ó

¡¡¡¡ÕâÊÇÒ»¸ö·Ç³£¼òµ¥µÄ make Îļþ£º

foo: foo.c
    cc -o foo foo.c

¡¡¡¡°üº¬Á½ÐУ¬Ò»ÐÐÊÇÒÀÀµ¹ØÏµ£¬Ò»ÐÐÊÇÖ´Ðж¯×÷¡£

¡¡¡¡ÒÀÀµ¹ØÏµµÄÄÇÒ»Ðаüº¬Á˳ÌÐòµÄÃû×Ö (½Ð×ö target)£¬½ô¸ú×ÅÒ»¸öðºÅ£¬È»ºóÊǿոñ£¬×îºóÊÇÔ´ÎļþµÄ Ãû×Ö¡£µ± make¶ÁÈëÕâÒ»ÐеÄʱºò£¬»á¼ì²é foo ÊÇ·ñ´æÔÚ£»Èç¹û´æÔÚ£¬¾Í±È½Ï foo ºÍ foo.c ×îºóµÄÐÞ¸Äʱ¼äÓÐʲ ô²»Í¬¡£Èç¹û foo ²»´æÔÚ£¬»òÕß±È foo.c Òª¾É£¬¾Í¼ì²éÖ´Ðж¯×÷ÄÇÒ»Ðп´¿´¸ÃÔõô×ö¡£»»¾ä»° ˵£¬¾ÍÊÇ foo.c ÐèÒªÖØÐ±àÒëµÄʱºò¸ÃÔõô°ì¡£

¡¡¡¡Ö´Ðж¯×÷ÄÇÒ»ÐÐÒÔÒ»¸ö tab (°´Ï tab) ¿ªÊ¼£¬È»ºóÊÇÄãÔÚÃüÁîÐÐϲúÉú foo ËùÖ´ÐеÄÃüÁî¡£Èç¹û foo ¹ýÆÚÁË£¬»òÕß²»´æÔÚ£¬make ¾Í»á Ö´ÐÐÕâ¸öÃüÁîÀ´²úÉú foo¡£»»¾ä»°Ëµ£¬Õâ¾ÍÊÇÖØÐ±àÒë foo.c µÄ¹æÔò¡£

¡¡¡¡Òò´Ë£¬µ±ÄãÊäÈë make ʱ£¬Ëü»áÈ·¶¨ foo ºÍ foo.c ÔÚÐÞ¸Äʱ¼äÉÏÊÇ·ñͬ ²½¡£Õâ¸öÔ­Ôò¿ÉÒÔÔÚ Makefile ÀïÀ©Õ¹µ½³É°ÙÉÏǧµÄÄ¿±êÎÄ ¼þÉÏ©¤©¤Êµ¼ÊÉÏ£¬ÔÚ FreeBSD ÀÄãÖ»ÒªÔÚºÏÊʵÄĿ¼ÏÂÊäÈë make world ¾Í¿ÉÒÔ±àÒëÕû¸ö²Ù×÷ϵͳ£¡

¡¡¡¡makefile ÁíÒ»¸öÓÐÓõÄÌØµã¾ÍÊÇÄ¿±êÎļþ²»Ò»¶¨¾ÍÊdzÌÐò¡£ÀýÈ磬ÎÒÃÇ¿ÉÒÔ ÓÐÕâÑùµÄ make Îļþ¡£

foo: foo.c
    cc -o foo foo.c

install:
    cp foo /home/me

¡¡¡¡ÎÒÃÇ¿ÉÒÔÊäÈëÈçϵÄÃüÁî¸æËß make ¸ÃÖ´ÐÐÄĸöÄ¿±ê£º

% make target

¡¡¡¡make »áÖ»Ö´ÐÐÕâ¸öÄ¿±ê¶øºöÂÔÆäËûµÄÄ¿±ê¡£ÀýÈ磬Èç¹û ÎÒÃÇÊäÈë make foo£¬¾ÍÖ»ÓÐ foo ±»Ö´ÐУ¬±ØÒªµÄÇé¿öÏÂÖØÐ±àÒë foo ¶ø²»»á¼ÌÐøÖ´ÐÐ install Õâ¸öÄ¿±ê¡£

¡¡¡¡Èç¹ûÎÒÃÇÖ»ÊÇÊäÈë make Õâ¸öÃüÁmake ×Ü»áѰÕÒ µÚÒ»¸öÄ¿±ê£¬²¢ÇÒÔÚÖ´ÐÐÍêÒÔºó¾Í²»¹ÜÆäËûµÄÄ¿±êÁË¡£ÀýÈ磬Èç¹ûÎÒÃÇÊäÈë make foo£¬make ¾Í»áתµ½ foo Õâ¸öÄ¿±ê£¬ÔÚ±ØÒªµÄÇé¿öÏÂÖØÐ±àÒë foo£¬¶ø²»»áÖ´ÐÐ install Ä¿±ê£¬ È»ºó¾ÍÍ£Ö¹ÁË¡£

¡¡¡¡Ò»¶¨Òª×¢Ò⣬install Õâ¸öÄ¿±ê²»ÒÀÀµÈÎºÎÆäËû µÄ¶«Î÷£¡ÕâÒâζ×ÅÎÒÃÇÒ»µ©ÊäÈë make install£¬Õâ¸öÄ¿±ê ϵÄËùÓÐÃüÁî¶¼½«±»Ö´ÐС£ÕâÖÖÇé¿öÏ£¬foo ½«±»°²×°µ½Óà »§µÄ¼ÒĿ¼Ï¡£Ó¦ÓóÌÐòµÄ makefile ÕýÊÇÕâÑùдµÄ£¬ÒÔ±ã³ÌÐòÔÚÕýÈ·±àÒëºó¿ÉÒÔ±» °²×°µ½ÕýÈ·µÄĿ¼¡£

¡¡¡¡Òª³¢ÊÔ½âÊ͵ϰ»á±È½ÏÈÝÒ×ÈÃÈË»ìÏý¡£Èç¹ûÄ㲻̫¶® make ÊÇÈçºÎ¹¤×÷µÄ£¬×îºÃµÄ°ì·¨¾ÍÊÇÏÈдһ¸ö¼òµ¥µÄ³ÌÐòÀýÈç ¡°hello world¡± ÒÔ¼°ºÍÉÏÃæµÄÀý×ÓÏàͬµÄ make ÎļþÔÙȥʵÑ顣Ȼºó ÔÙ½øÒ»²½£¬Ê¹Óöà¸öÔ´Îļþ£¬»òÕßÈÃÄãµÄÔ´Îļþ°üº¬Ò»¸öÍ·Îļþ¡£ touch ÃüÁîÔÚÕâÀï¾Í·Ç³£ÓÐÓÃÁË©¤©¤ËüÄÜÈÃÔÚ²»¸Ä±äÎļþÄÚ ÈݵÄÇé¿öϸıäÎļþµÄÈÕÆÚ¡£


2.5.3 Make ºÍ include-Îļþ

¡¡¡¡C Ô´ÂëµÄ¿ªÍ·¾­³£ÓÐһϵÁб»°üº¬µÄÍ·Îļþ£¬ÀýÈç stdio.h¡£ÓÐһЩÊÇϵͳ¼¶µÄ Í·Îļþ£¬ÓÐһЩÊÇÄãÕýÔÚдµÄÏîÄ¿µÄÍ·Îļþ£º

#include <stdio.h>
#include "foo.h"

int main(....

¡¡¡¡ÒªÈ·¶¨ÔÚÄãµÄ foo.h ±»¸Ä±äÖ®ºó£¬Õâ¸öÎļþÒ²»á±»ÖØ Ð±àÒ룬¾ÍÒªÔÚÄãµÄ Makefile ÕâÑùд£º

foo: foo.c foo.h

¡¡¡¡µ±ÄãµÄÏîÄ¿±äµÃÔ½À´Ô½´ó£¬Äã×Ô¼ºµÄÍ·ÎļþÔ½À´Ô½¶àµÄʱºò£¬Òª×·×ÙËùÓÐÕâЩ Í·ÎļþºÍËùÓÐÒÀÀµËüµÄÎļþ»áÊÇÒ»¼þÍ´¿àµÄÊÂÇé¡£Èç¹ûÄã¸Ä±äÁËÆäÖÐÒ»¸öÍ·Îļþ£¬È´ ÍüÁËÖØÐ±àÒëËùÓÐÒÀÀµËüµÄÔ´Îļþ£¬½á¹û»áÊǺÜʧÍûµÄ¡£gcc ÓÐÒ»¸öÑ¡Ïî¿ÉÒÔ·ÖÎöÄãµÄÔ´ÎļþÈ»ºó²úÉúÒ»¸öÍ·ÎļþµÄÁбíºÍËüµÄÒÀÀµ¹ØÏµ£º -MM¡£

¡¡¡¡Èç¹ûÄã°ÑÏÂÃæµÄÄÚÈݼӵ½ÄãµÄ Makefile ÀïÃæ£º

depend:
    gcc -E -MM *.c > .depend

¡¡¡¡È»ºóÔËÐÐ make depend£¬¾Í»á²úÉúÒ»¸ö .depend£¬ÀïÃæ°üº¬ÁËÄ¿±êÎļþ£¬C ÎļþºÍÍ·ÎļþµÄÁÐ±í£º

foo.o: foo.c foo.h

¡¡¡¡Èç¹ûÄã¸Ä±äÁË foo.h£¬ÏÂÒ»´ÎÔËÐÐ make µÄʱºò£¬ËùÓÐÒÀÀµ foo.h µÄÎļþ ¾Í»á±»ÖØÐ±àÒë¡£

¡¡¡¡Ã¿Ò»´ÎÄãÔö¼ÓÒ»¸öÍ·ÎļþµÄʱºò£¬±ðÍüÁËÔËÐÐÒ»´Î make depend¡£


2.5.4 FreeBSD µÄ Makefile Îļþ

¡¡¡¡Ð´ Makefile Îļþ¿ÉÒÔÊǺÜÄѵÄÒ»¼þÊÂÇé¡£ÐÒÔ˵ÄÊÇ£¬Ïñ FreeBSD ÕâÑù»ùÓÚ BSD µÄϵͳ£¬ÏµÍ³±¾Éí¾Í×Ô´øÁËһЩ·Ç³£Ç¿´óµÄ Makefile Îļþ¡£Ò»¸öºÜºÃµÄÀý×Ó¾Í ÊÇ FreeBSD µÄ ports ϵͳ¡£ÕâÀïÁгöÁËÒ»¸öµäÐ굀 ports µÄ Makefile µÄÖØÒª²¿·Ö£º

MASTER_SITES=   ftp://freefall.cdrom.com/pub/FreeBSD/LOCAL_PORTS/
DISTFILES=      scheme-microcode+dist-7.3-freebsd.tgz

.include <bsd.port.mk>

¡¡¡¡ÏÖÔÚ£¬Èç¹ûÎÒÃǽøÈëÕâ¸ö port µÄĿ¼ȻºóÊäÈë make£¬¾ÍÓÐÈçϵIJ½Öè·¢Éú£º

  1. ¼ì²éÕâ¸ö port µÄÔ´ÎļþÔÚϵͳÖÐÊÇ·ñ´æÔÚ¡£

  2. Èç¹û²»´æÔÚ£¬¸ù¾Ý MASTER_SITES Ö¸¶¨µÄ URL£¬ÏµÍ³ ½«»áʹÓà FTP Á¬½ÓÏÂÔØÕâ¸öÔ´Îļþ¡£

  3. ¼ÆËãÔ´ÎļþµÄУ¼ìÂ룬ȻºóÓëÏÈǰ±»¼Ç¼µÄ£¬ÒÑÖªµÄ£¬ÍêºÃµÄÔ´ÎļþУ¼ì Âë¶Ô±È¡£ÕâÑù×ö¾ÍÊÇҪȷÈÏÔ´ÎļþÔÚ´«Ë͹ý³ÌÖÐûÓÐË𻵡£

  4. Ö´ÐÐÈκÎÈÃÔ´Îļþ¿ÉÒÔÔÚ FreeBSD ÉÏÔËÐеÄÐ޸ĩ¤©¤Õâ½Ð×ö ´ò²¹¶¡¡£

  5. Íê³ÉÔ´ÎļþÐèÒªµÄÌØÊâµÄÅäÖá£(ºÜ¶à UNIX ³ÌÐòÔÚ±»±àÒëµÄʱºò¶¼»á ¼ì²â×Ô¼ºÕýÔÚÄĸö°æ±¾µÄ UNIX ÉÏÃæÒÔ¼°ÄÄЩ¿ÉÑ¡µÄ UNIX ÌØÐÔÊÇ´æÔÚµÄ ©¤©¤ÕâÒ»²½ÀïÃæ£¬ÔÚ FreeBSD µÄ ports ¿ò¼ÜÖÐÕâЩ³ÌÐò½«»áÈ¡µÃÕâЩÐÅÏ¢¡£

  6. ±àÒë³ÌÐòµÄÔ´´úÂ롣ʵ¼ÊÉÏ£¬ÎÒÃǽ«½øÈëµ½Ô´´úÂë½âѹºóÉú³ÉµÄĿ¼ÖУ¬ È»ºóÔÙÖ´ÐÐ make©¤©¤³ÌÐò×ÔÉíµÄ make Îļþ°üº¬Á˱à Òë³ÌÐòËùÐèÒªµÄÐÅÏ¢¡£

  7. ÏÖÔÚÎÒÃÇÓÐÁËÒ»¸ö±àÒëºÃµÄ³ÌÐò¡£Èç¹ûÎÒÃÇÔ¸Ò⣬¿ÉÒÔ²âÊÔһϣ»µ±ÎÒÃÇ ¶Ô³ÌÐòÂúÒâÁËÒԺ󣬾ÍÊäÈë make install¡£Õâ¸öÃüÁî ½«°Ñ³ÌÐò×ÔÉí»¹ÓÐÈκÎËüÒÀÀµµÄÎļþ¶¼¸´ÖƵ½ÕýÈ·µÄλÖã»ÔÚÒ»¸ö °üÊý¾Ý¿â Öлá¼ÓÉÏÒ»Ìõ¼Ç¼ÒÔ±ãÎÒÃǸıäÏë·¨µÄʱºò¿É ÒԺܼòµ¥µÄɾ³ýµôÕâ¸ö port¡£

¡¡¡¡ÏÖÔÚÎÒÏëÄãÒ»¶¨»áͬÒ⣬¶ÔÓÚÒ»¸öÖ»ÓÐËÄÐеĽű¾£¬ÕâÈÃÈËÓ¡Ïó·Ç³£Éî¿Ì£¡

¡¡¡¡ÃØÃܾÍÔÚ×îºóÒ»ÐУ¬ÕâÒ»ÐиæËß make È¥ÕÒϵͳ¼¶µÄ make Îļþ£¬½Ð×ö bsd.port.mk¡£ÒªºöÂÔÕâÒ»Ðкܼòµ¥£¬µ«ÊÇ ¾ÍÊÇÕâÒ»ÐÐ×öÁËËùÓдÏÃ÷µÄ¹¤×÷©¤©¤ÓÐÈËÒѾ­Ð´ºÃÁËÒ»¸ö make Îļþ£¬Èà make È¥×ö¸Õ²ÅÌáµ½µÄ²½Öè (¼ÓÉÏһЩÎÒûÌáµ½µÄ£¬°üÀ¨¶Ô¿ÉÄÜ µÄ´íÎóµÄ´¦Àí)¡£¶øÇÒÈκÎÈ˶¼¿ÉÒÔÔÚ×Ô¼ºµÄ make ÎļþÖмòµ¥µÄ¼ÓÉÏÒ»ÐÐÃüÁîÀ´Ê¹ ÓÃÕâ¸öÎļþ£¡

¡¡¡¡Èç¹ûÄãÏë¿´¿´ÕâЩϵͳ¼¶µÄ make Îļþ£¬¿ÉÒÔµ½ /usr/share/mk ÀïÃæÕÒÕÒ¡£²»¹ý×îºÃµÈµ½Äã¶Ô make ÎļþÓÐ ÁËÒ»µãµã¸ÐÐԵľ­ÑéÒÔºóÔÙÈ¥¿´¡£ÒòΪÕâЩÎļþ¶¼·Ç³£¸´ÔÓ(¶øÇÒÈç¹ûÄãÔÚ¿´µÄʱ ºò£¬×îºÃ×¼±¸Ò»´ó±­Å¨Å¨µÄÂ̲裡)¡£


2.5.5 ¸ü¶à make µÄ¸ß¼¶Ó÷¨

¡¡¡¡Make ÊÇÒ»¸ö·Ç³£Ç¿´óµÄ¹¤¾ß£¬ÉõÖÁ»¹¿ÉÒÔ×ö±ÈÒÔÉÏÌáµ½ µÄ¸ü¸´ÔӵŤ×÷¡£²»ÐÒµÄÊÇ£¬make Óв»Í¬µÄ°æ±¾£¬¸÷¸ö°æ±¾Ö® ¼ä²î±ð»¹ºÜ´ó¡£Ñ§Ï°Ê¹ÓÃÕâ¸öÃüÁîµÄ×îºÃµÄ·½·¨¿ÉÄܾÍÊÇÔĶÁÎĵµ©¤©¤Ï£ÍûÕâÒ» ÕÂÄܹ»¸øÄãµÄѧϰ´òÒ»¸ö»ù´¡¡£

¡¡¡¡FreeBSD ×Ô´øµÄ make ½Ð×ö Berkeley make£» /usr/share/doc/psd/12.make ÊÇÒ»¸ö½Ì³Ì¡£Òª¿´Õâ¸ö½Ì³Ì£¬ ÔÚÄǸöĿ¼ÖÐÖ´ÐÐ

% zmore paper.ascii.gz

¡¡¡¡ Ports ÖеĺܶàÓ¦ÓóÌÐòʹÓà GNU make£¬Ëü °üº¬Ò»¸ö·Ç³£°ôµÄ ¡°info¡± Ò³ÃæµÄ¼¯ºÏ¡£Èç¹ûÄã°²×°ÁËÈκÎÒ»¸öÕâÑù µÄ port£¬GNU make ¾Í»á×Ô¶¯±»°²×°Îª gmake ÃüÁî¡£µ±È»ÄãÒ²¿ÉÒÔÓÃÕý³£µÄ port »ò package µÄ·½Ê½ À´°²×°¡£

¡¡¡¡Òª²é¿´ GNU make µÄ info Ò³Ãæ£¬Äã±ØÐë±à¼­ /usr/local/info ·¾¶Ï嵀 dir ÎÄ ¼þ£¬ÔÚÆäÖÐÌí¼ÓÒ»¸öÌõÄ¿¡£ÐèÒªÌí¼ÓµÄÄÚÈÝ¿ÉÒÔÊÇÕâÑù

 * Make: (make).                 The GNU Make utility.

¡¡¡¡Ò»µ©ÄãÍê³É±à¼­£¬¾Í¿ÉÒÔÊäÈëÃüÁî info È»ºó´Ó²Ë µ¥ÖÐÑ¡Ôñ make (»òÕßÔÚ Emacs ÖУ¬ÊäÈë C-h i)¡£


2.6 µ÷ÊÔ

2.6.1 µ÷ÊÔÆ÷

¡¡¡¡FreeBSD ×Ô´øµÄµ÷ÊÔÆ÷½Ð gdb (GNU debugger)¡£ÒªÔËÐУ¬ÊäÈë

% gdb progname

¡¡¡¡È»¶ø´ó¶àÊýÈËϲ»¶ÔÚ Emacs ÖÐÔËÐÐÕâ¸öÃüÁî¡£ ¿ÉÒÔÕâÑùÀ´Æð¶¯Õâ¸öÃüÁ

M-x gdb RET progname RET

¡¡¡¡µ÷ÊÔÆ÷ÄÜÈÃÄãÔÚÒ»¸ö¿É¿ØÖƵĻ·¾³ÖÐÔËÐÐÒ»¸ö³ÌÐò¡£ÀýÈ磬Äã¿ÉÒÔÒ»´ÎÔËÐÐ³Ì ÐòµÄÒ»ÐдúÂ룬¼ì²é±äÁ¿µÄÖµ£¬¸Ä±äÕâЩֵ£¬»òÕßÈóÌÐòÔËÐе½Ä³¸ö¶¨µãÈ»ºóÍ£Ö¹µÈ µÈ¡£ÄãÉõÖÁ¿ÉÒÔµ÷ÊÔÄںˣ¬µ±È»ÕâÑù»á±ÈÎÒÃǽ«ÒªÌÖÂÛµÄÎÊÌâÒª¶àÒ»µãµã¼¼ÇÉ¡£

¡¡¡¡gdb Óзdz£°ôµÄÔÚÏß°ïÖú£¬»¹ÓÐͬÑù°ôµÄ info Ò³Ãæ¡£ Òò´ËÕâÒ»ÕÂÎÒÃÇ»á°Ñ×¢ÒâÁ¦¼¯Öе½Ò»Ð©»ù±¾µÄÃüÁîÉÏ¡£

¡¡¡¡×îºó£¬Èç¹ûÄ㲻ϰ¹ßÕâ¸öÃüÁîµÄÃüÁîÐнçÃæ£¬ÔÚ ports Öл¹ÓÐÒ»¸öËüµÄͼÐΠǰ¶Ë (xxgdb)¡£

¡¡¡¡ÕâÒ»ÕÂ×¼±¸Ö»½éÉÜ gdb µÄʹÓ÷½·¨£¬¶ø²»»áÇ£Éæµ½ÌØÊâ µÄÎÊÌâ±ÈÈçµ÷ÊÔÄںˡ£


2.6.2 ÔÚµ÷ÊÔÆ÷ÖÐÔËÐÐÒ»¸ö³ÌÐò

¡¡¡¡Òª×î´óÏ޶ȵÄÀûÓà gdb£¬ÐèҪʹÓà -g Õâ¸öÑ¡ÏîÀ´±àÒëÄãµÄ³ÌÐò¡£Èç¹ûÄãûÓÐÕâÑù×ö£¬ÄÇôÄãÖ»»á¿´ µ½ÄãÕýÔÚµ÷ÊԵĺ¯ÊýÃû×Ö£¬¶ø²»ÊÇËüµÄÔ´´úÂë¡£Èç¹û gdbÆð¶¯ ʱÌáʾ£º

... (no debugging symbols found) ...

¡¡¡¡Äã¾ÍÖªµÀÄãµÄ³ÌÐòÔÚ±àÒëµÄʱºòûÓÐʹÓà -g Ñ¡Ïî¡£

¡¡¡¡µ± gdb ¸ø³öÌáʾ·û£¬ÊäÈë break main¡£Õâ¾ÍÊǸæËßµ÷ÊÔÆ÷Ìø¹ý³ÌÐòÖÐÔ¤ÏÈÉèÖõĴúÂ룬´ÓÄãµÄ´úÂëµÄ×î ¿ªÍ·¿ªÊ¼¡£È»ºóÊäÈë run À´¿ªÊ¼ÄãµÄ³ÌÐò©¤©¤Õâ»á´Ó Ô¤ÏÈÉèÖõĴúÂ뿪ʼȻºóÔÚµ÷ÊÔÆ÷µ÷Óà main() µÄʱºò¾ÍÍ£ ÏÂÀ´¡£(Èç¹ûÄãÔøÃÔ»ó main() ÊÇÔÚÄÄÀï±»µ÷Óõģ¬ÏÖÔÚÓ¦¸Ã Ã÷°×Á˰ɣ¡)

¡¡¡¡ÏÖÔÚÄã¿ÉÒÔÒ»²½Ò»²½À´¼ì²éÄãµÄ³ÌÐò£¬°´Ï nÒ»´Î¾Í²é Ò»ÐС£Ò»µ©ÄãÅö¼ûÁËÒ»¸öº¯Êýµ÷Ó㬿ÉÒÔÊäÈë f ´Óº¯Êýµ÷ÓÃÖÐ Í˳öÀ´¡£Äã¿ÉÒÔÊäÈë up »ò down À´¿ìËÙ ¼ì²éÕâ¸öµ÷Óá£

¡¡¡¡ÕâÀïÁгöÁËÒ»¸ö¼òµ¥µÄÀý×Ó¡£Õ¹Ê¾ÁËÔõÑùÓà gdb ¶¨Î»Ò»¸ö´í Îó¡£ÕâÊÇÎÒÃǵijÌÐò(ÆäÖÐÓÐÒ»¸öÃ÷ÏԵĴíÎó)£º

#include <stdio.h>

int bazz(int anint);

main() {
    int i;

    printf("This is my program\n");
    bazz(i);
    return 0;
}

int bazz(int anint) {
    printf("You gave me %d\n", anint);
    return anint;
}

¡¡¡¡Õâ¸ö³ÌÐò¸ø i ¸³Öµ 5 ²¢°ÑËü´«µÝ¸ø Ò»¸öº¯Êý bazz()£¬Õâ¸öº¯Êý½«´òÓ¡³öÎÒÃǸø³öµÄÊýÖµ¡£

¡¡¡¡ÎÒÃÇÏÖÔÚ±àÒë²¢ÔËÐÐÕâ¸ö³ÌÐò£¬ÎÒÃÇ»áµÃµ½

% cc -g -o temp temp.c
% ./temp
This is my program
anint = 4231

¡¡¡¡µ«Õâ²¢²»ÊÇÎÒÃÇÏëÒªµÄ£¡Ó¦¸Ã¿´¿´µ½µ×·¢ÉúÁËʲô£¡

% gdb temp
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) break main               Skip the set-up code
Breakpoint 1 at 0x160f: file temp.c, line 9.    gdb puts breakpoint at main()
(gdb) run                   Run as far as main()
Starting program: /home/james/tmp/temp      Program starts running

Breakpoint 1, main () at temp.c:9       gdb stops at main()
(gdb) n                       Go to next line
This is my program              Program prints out
(gdb) s                       step into bazz()
bazz (anint=4231) at temp.c:17          gdb displays stack frame
(gdb)

¡¡¡¡Í£×¡£¡Ôõô anint »áÊÇ 4231£¿ÄѵÀ ÎÒÃÇûÓÐÔÚº¯Êý main() ÖÐÉ趨Ϊ 5 Âð£¿ÏÖÔÚÎÒÃÇתµ½ main() À´¿´¿´¡£

(gdb) up                   Move up call stack
#1  0x1625 in main () at temp.c:11      gdb displays stack frame
(gdb) p i                   Show us the value of i
$1 = 4231                   gdb displays 4231

¡¡¡¡Å¶£¬ÌìÄÄ£¡¿´¿´Õâ´úÂ룬ÎÒÃÇÍüÁ˳õʼ»¯ i ÁË¡£±¾À´ÎÒÃÇ ÊÇÏëµÄ

...
main() {
    int i;

    i = 5;
    printf("This is my program\n");
...

¡¡¡¡µ«ÊÇÎÒÃÇÍüÁË i=5; ÕâÒ»ÐС£ÒòΪÎÒÃÇûÓгõʼ»¯ i£¬Õâ¸ö±äÁ¿ÔÚ³ÌÐòÔËÐеÄʱºò¾Í´¢´æÁËżȻÔÚÄÇ¿éÄÚ´æÖдæÔÚµÄ ÈÎÒâÖµ¡£

×¢Òâ: gdb »áÏÔʾÎÒÃǽøÈë»òÀ뿪һ¸öº¯ÊýʱµÄÕ»µÄÖµ¡£¼´ ʹÊÇÎÒÃÇÔÚʹÓà up »ò down µÄʱºò¡£ Õâ»áÏÔʾº¯ÊýµÄÃû³Æ»¹ÓвÎÊýµÄÖµ£¬ÈÃÎÒÃÇÖªµÀ×Ô¼ºµÄλÖÃÒÔ¼°ÕýÔÚ·¢ÉúʲôÊÂÇé¡£ (Õ»ÄÜ´¢´æ³ÌÐòÔÚµ÷Óú¯ÊýµÄʱʹÓõIJÎÊý£¬ÒÔ¼°µ÷ÓÃʱµÄλÖã¬ÒÔ±ã³ÌÐòÔÚ´Óº¯ Êýµ÷ÓýáÊøºóÖªµÀ×Ô¼ºµÄλÖá£)


2.6.3 ¼ì²é core Îļþ

¡¡¡¡»ù±¾ÉÏ core Îļþ¾ÍÊÇÒ»¸ö°üº¬Á˳ÌÐò±ÀÀ£Ê±Õâ¸ö½ø³ÌµÄËùÓÐÐÅÏ¢µÄÎļþ¡£ÔÚÄÇ ¡°Ò£Ô¶µÄ»Æ½ðÄê´ú¡±£¬³ÌÐòÔ±²»µÃ²»°Ñ core ÎļþÒÔÊ®Áù½øÖƵķ½Ê½ÏÔʾ ³öÀ´£¬È»ºóÂúÍ·´óº¹µÄÔĶÁ»úÆ÷ÂëµÄÊֲᣬµ«ÊÇÏÖÔÚÊÂÇé¾Í¼òµ¥µÃ¶àÁË¡£Ë³±ã˵һÏ£¬ ÔÚ FreeBSD ºÍÆäËûµÄ 4.4BSD ϵͳÏ£¬core Îļþ¶¼½Ð×÷ progname.core ¶ø²»ÊǼòµ¥½Ð core£¬ÕâÑù¿ÉÒÔºÜÇå³þµÄ±íʾ³öÕâ¸ö core ÎļþÊÇÊôÓÚÄĸö ³ÌÐò¡£

¡¡¡¡Òª¼ì²éÒ»¸ö core Îļþ£¬ÒÔͨ³£µÄ·½Ê½Æð¶¯ gdb¡£²»Òª ÊäÈë break »òÕß run£¬¶øÒªÊäÈë

(gdb) core progname.core

¡¡¡¡Èç¹ûÄãûÓÐºÍ core ÎļþÔÚͬһ¸öĿ¼£¬Ê×ÏÈÒªÖ´ÐÐ dir /path/to/core/file¡£

¡¡¡¡ÄãÓ¦¸Ã¿ÉÒÔ¿´¼û£º

% gdb a.out
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) core a.out.core
Core was generated by `a.out'.
Program terminated with signal 11, Segmentation fault.
Cannot access memory at address 0x7020796d.
#0  0x164a in bazz (anint=0x5) at temp.c:17
(gdb)

¡¡¡¡ÕâÖÖÇé¿öÏ£¬ÔËÐеijÌÐò½Ð a.out£¬Òò´Ë core Îļþ ¾Í½Ð a.out.core¡£ÎÒÃÇÖªµÀ³ÌÐò±ÀÀ£µÄÔ­Òò¾ÍÊǺ¯Êý bazz ÊÔͼ·ÃÎÊÒ»¿é²»ÊôÓÚËüµÄÄÚ´æ¡£

¡¡¡¡ÓÐʱºò£¬ÄÜÖªµÀÒ»¸öº¯ÊýÊÇÔõô±»µ÷ÓõÄÊǷdz£ÓÐÓô¦µÄ¡£ÒòΪÔÚÒ»¸ö¸´Ô ³ÌÐòÀïÃæÎÊÌâ¿ÉÄܻᷢÉúÔÚº¯Êýµ÷ÓÃÕ»ÉÏÃæºÜÔ¶µÄµØ·½¡£ÃüÁî bt »áÈà gdb Êä³öº¯Êýµ÷ÓÃÕ»µÄ»ØËÝ×·×Ù¡£

(gdb) bt
#0  0x164a in bazz (anint=0x5) at temp.c:17
#1  0xefbfd888 in end ()
#2  0x162c in main () at temp.c:11
(gdb)

¡¡¡¡º¯Êý end() ÔÚÒ»¸ö³ÌÐò±ÀÀ£µÄʱºò½«±»µ÷Óã»ÔÚ±¾Àý ÖУ¬º¯Êý bazz() ÊÇ´Ó main() Öб» µ÷Óõġ£


2.6.4 Õ³¸¶µ½Ò»¸öÕýÔÚÔËÐеijÌÐò

¡¡¡¡gdb Ò»¸ö×ÖµÄÌØÐÔ¾ÍÊÇËüÄÜÕ³¸¶µ½Ò»¸öÒѾ­ÔÚÔËÐÐ µÄ³ÌÐòÉÏ¡£µ±È»£¬ÎÒÃǵÃÊ×Ïȼٶ¨ÄãÓÐ×ã¹»µÄȨÏÞÕâÑùÈ¥×ö¡£Ò»¸ö³£¼ûµÄÎÊÌâ¾ÍÊÇ£¬ µ±ÎÒÃÇÔÚ×·×ÙÒ»¸ö°üº¬×Ó½ø³ÌµÄ³ÌÐòʱ£¬Èç¹ûÄãҪ׷×Ù×Ó½ø³Ì£¬µ«Êǵ÷ÊÔÆ÷Ö»ÔÊÐíÄã ×·×Ù¸¸½ø³Ì¡£

¡¡¡¡ÄãÒª×öµÄ¾ÍÊÇÆð¶¯ÁíÒ»¸ö gdb£¬È»ºóÓà ps ÕÒ³ö×Ó½ø³ÌµÄ½ø³ÌºÅ¡£È»ºóÔÚ gdbÖÐÖ´ÐÐ

(gdb) attach pid

¡¡¡¡¾Í¿ÉÒÔÏñƽʱһÑùµ÷ÊÔÁË¡£

¡¡¡¡¡°ÕâºÜºÃ£¬¡±Äã¿ÉÄÜÔÚÏ룬¡°µ±ÎÒÕâÑù×öÁËÒÔºó£¬×Ó½ø³Ì¾Í »á²»¼ûÁË¡±¡£±ðÅ£¬Ç×°®µÄ¶ÁÕߣ¬ÎÒÃÇ¿ÉÒÔÕâÑùÀ´×ö(²ÎÕÕ gdb µÄ info Ò³)

...
if ((pid = fork()) < 0)      /* _Always_ check this */
    error();
else if (pid == 0) {        /* child */
    int PauseMode = 1;

    while (PauseMode)
        sleep(10);  /* Wait until someone attaches to us */
    ...
} else {            /* parent */
    ...

¡¡¡¡ÏÖÔÚËùÓÐÄãÒª×öµÄ¾ÍÊÇÕ³¸¶µ½×Ó½ø³Ì£¬ÉèÖà PauseMode Ϊ 0£¬È»ºóµÈ´ýº¯Êý sleep ·µ»Ø£¡


2.7 ʹÓà Emacs ×÷Ϊ¿ª·¢»·¾³

2.7.1 Emacs

¡¡¡¡ºÜ²»ÐÒ£¬UNIX ϵͳ²»ÏñÆäËûµÄϵͳÄÇÑù´øÓÐÒ»ÖÖ¡°ÄãÒªµÄÈ«ÓУ¬²»ÒªµÄ¸ü¶à¡±µÄ£¬°üº¬ËùÓÐ µÄ£¬¾Þ´óµÄ³ÌÐò¿ª·¢»·¾³¡£ [7] µ«ÊÇ£¬Äã¿ÉÒԴһ¸ö×Ô¼ºµÄ¿ª·¢»·¾³¡£¿ÉÄܲ»»áºÜƯÁÁ£¬Ò²²»»á·Ç³£¼¯³É»¯¡£µ« ÊÇÄã¿ÉÒÔ°´×Ô¼ºµÄÐèÇóÀ´´î½¨¡£¶øÇÒÊÇÃâ·ÑµÄ¡£Ä㽫ӵÓÐËùÓеÄÔ´Âë¡£

¡¡¡¡ÎÊÌâµÄ´ð°¸¾ÍÊÇ Emacs¡£Èç½ñÓкܶàÈËÑá¶ñËü£¬Ò²Óкܶàϲ»¶Ëü¡£Èç¹ûÄãÊÇǰ ÕßÖ®Ò»£¬¿ÖÅÂÕâÒ»Õ²»»áÒýÆðÄãµÄÐËȤ¡£¶øÇÒ£¬ÄãÐèÒªÒ»¶¨Á¿µÄÄÚ´æÀ´ÔËÐÐ Emacs©¤©¤ÎÄ×Ö½çÃæÎÒÍÆ¼ö 8MB£¬¶øÔÚ X ÏÂ×îÉÙÐèÒª 16MB À´»ñµÃºÏÀíµÄÐÔÄÜ¡£

¡¡¡¡Emacs »ù±¾ÉÏÊÇÒ»¸ö¸ß¶È¿ÉÅäÖõı༭Æ÷©¤©¤Êµ¼ÊÉÏ£¬Emacs ¸üÏñÒ»¸ö²Ù ×÷ϵͳ¶ø²»ÏñÒ»¸ö±à¼­Æ÷£¡ºÜ¶à¿ª·¢ÈËÔ±ºÍϵͳ¹ÜÀíÔ±°ÑËùÓеÄʱ¼ä¶¼»¨ÔÚ Emacs ÀïÃæ£¬Ö»ÔÚÍ˳öµÇ½µÄʱºò²ÅÍ˳öÕâ¸ö±à¼­Æ÷¡£

¡¡¡¡ÒªÔÚÕâÀï¸ÅÀ¨ËùÓÐ Emacs ÄÜ×öµÄÊÂÇéÊDz»¿ÉÄܵ쬵«ÊÇÕâÀïÁгöÁËһЩ¿ª·¢ÈËÔ±¿ÉÄܸРÐËȤµÄÌØÐÔ£º

  • ·Ç³£Ç¿´óµÄ±à¼­Æ÷£¬ÔÊÐí¶Ô×Ö´®ºÍÕýÔò±í´ïʽ(ÀàÐÍ)½øÐÐËÑË÷ºÍÌæ´ú¡£Ìø ÖÁ¿é½á¹¹µÄ¿ªÊ¼/ĩ⣬µÈµÈ¡£

  • ÏÂÀ­²Ëµ¥ºÍÔÚÏß°ïÖú¡£

  • ÓïÑÔÏà¹ØµÄÓï·¨¸ßÁÁÏÔʾºÍËõ½ø¡£

  • ÍêÈ«¿ÉÅäÖá£

  • Äã¿ÉÒÔÔÚ Emacs ÖбàÒëºÍµ÷ÊÔ³ÌÐò¡£

  • ³öÏÖ±àÒë´íÎóÒÔºó£¬Äã¿ÉÒÔÖ±½ÓÌøÖÁ³öÎÊÌâµÄÄÇÒ»ÐдúÂë¡£

  • ±È½ÏÓÑºÃµÄ info µÄǰ¶Ë£¬¿ÉÒÔÔĶÁ GNU ³¬Îı¾ÎÄ µµ¡£µ±È»°üÀ¨ Emacs ×Ô¼ºµÄÎĵµ¡£

  • ÓÑºÃµÄ gdb µÄǰ¶Ë£¬ÔÊÐíÄãÔÚ×·×Ù³ÌÐòµÄʱºò²é¿´ Ô´´úÂë¡£

  • Äã¿ÉÒÔÔÚ±àÒë³ÌÐòµÄͬʱ²é¿´ Usenet ÐÂÎźÍÔĶÁÓʼþ¡£

¡¡¡¡ºÁÎÞÒÉÎÊ»¹Óкܶ౻ÎÒºöÂԵġ£

¡¡¡¡ÔÚ FreeBSD ÉÏ¿ÉÒÔÓà the Emacs port À´°²×° Emacs¡£

¡¡¡¡Ò»µ©°²×°ºÃÁË£¬¾Í¿ÉÒÔÔËÐÐ Emacs£¬È»ºóÊäÈë C-h t ÔĶÁ Emacs ½Ì³Ì©¤©¤Òâ˼¾ÍÊÇ˵°´×¡ control£¬ÔÙ°´ h£¬ËÉ¿ª control£¬È»ºóÔÙ°´ t¡£(»òÕߣ¬Äã¿ÉÒÔʹÓÃÊó ±ê´Ó Help ²Ëµ¥ÖØÑ¡Ôñ Emacs Tutorial)¡£

¡¡¡¡¾¡¹Ü Emacs Óв˵¥£¬×îºÃ»¹ÊÇѧϰһϼü×éºÏ¡£ÒòΪÔÚÄã±à¼­µÄʱºò£¬Á¬Ðø µØ°´ÏÂһϵÁа´¼ü£¬±ÈÕÒµ½Êó±êÈ»ºóµã»÷ÕýÈ·µÄµØ·½Òª¿ìµÃ¶à¡£¶øÇÒ£¬µ±ÄãºÍÒ»¸öÀÏ Emacs Óû§½»Á÷µÄʱºò£¬Äã¾­³£»áÅöµ½ÏÂÁеıí´ï ¡°M-x replace-s RET foo RET bar RET¡±£¬Òò´ËÖªµÀÕâЩ¶«Î÷»áºÜÓÐÓ᣶øÇÒÔÚÈÎ ºÎÇé¿öÏ£¬Emacs µÄ²Ëµ¥ÀïÓÀÔ¶·Å²»ÏÂËùÓÐËüʵ¼ÊÉÏÓµÓеÄÓÐÓõŦÄÜ¡£

¡¡¡¡ÐÒÔ˵ÄÊÇ£¬ºÜÈÝÒ×ѧϰ¼ü×éºÏ¡£ÒòΪ²Ëµ¥Ã¿¸öÏîÄ¿µÄºóÃæ¶¼±êʾÁ˶ÔÓ¦µÄ¼ü×é ºÏ¡£ÎҵĽ¨Òé¾ÍÊÇ£¬Ê×ÏÈʹÓò˵¥Ï±ÈÈ磬´ò¿ªÒ»¸öÎļþ£¬Ö±µ½ÄãÃ÷°×ÁËÆäÖеİ Ã²¢ÇÒ¿ÉÒÔ×ÔÐŵÄʹÓÃÕâ¸ö²Ëµ¥ÏÔÙ³¢ÊÔʹÓà C-x C-f¡£µ±ÄãÒ»µãÀ§ÄÑҲûÓÐµÄ Ê±ºò£¬¾Í¿ÉÒÔתµ½ÏÂÒ»¸ö²Ëµ¥Ïî¼ÌÐøÁ·Ï°¡£

¡¡¡¡Èç¹û¼Ç²»×¡Ò»¸öÌØÊâµÄ¼ü×éºÏµ½µ×ÄÜ×öʲô£¬¿ÉÒÔ´Ó Help ²Ëµ¥ÖÐÑ¡Ôñ Describe Key £¬È»ºóÊäÈëÕâ¸ö¼ü×éºÏ©¤©¤Emacs »á¸æËßÄãËüµ½µ×ÄܸÉʲô¡£ÄãÒ²¿ÉÒÔµã»÷ Command AproposÀ´Ñ°ÕÒ°üº¬Ò»¸öÌØ¶¨´ÊµÄÃüÁ ºóÃæ½ô¸úµÄ¾ÍÊǼü×éºÏ¡£

¡¡¡¡ÁíÍ⣬¸Õ²ÅÄǸö±í´ïʽµÄÒâ˼¾ÍÊǰ´×¡ Meta ¼ü£¬°´Ï x ¼ü£¬ËÉ¿ª Meta ¼ü£¬ÊäÈë replace-s (replace-stringµÄ¼òд ©¤©¤Emacs ÁíÒ»¸öÌØÐÔ¾ÍÊÇÃüÁîµÄËõд)£¬°´Ï return¼ü£¬Êä Èë foo(ÄãÒªÌæ»»µÄ×Ö´®)£¬ÊäÈë bar (ÄãÒªÓÃÀ´Ìæ»» foo µÄ×Ö´®) È»ºóÔٴΰ´Ï return ¼ü¡£ Emacs ¾Í»á°´ÄãµÄÒªÇó½øÐÐËÑË÷ºÍÌæ»»²Ù×÷¡£

¡¡¡¡ÄãÒ»¶¨ÔÚÒÉ»ó Meta ¼üÊǸöʲô¼ü¡£ÕâÊÇÒ»¸öºÜ¶à UNIX ¹¤×÷Õ¾¶¼ÓеÄÌØÊâµÄ¼ü¡£ºÜ²»ÐÒ£¬PCûÓÐÕâÑùÒ»¸ö¼ü¡£Í¨³£ÔÚ PC ÉÏÕâ¸ö¼üÊÇ alt ¼ü(Èç¹ûÄãÔËÆø²»ºÃ£¬Õâ¸ö¼üÔÚÄãµÄ PC ÉÏ»áÊÇ escape ¼ü)¡£

¡¡¡¡Å¶£¬ÒªÍ˳ö Emacs£¬¼üÈë C-x C-c (Òâ˼¾ÍÊǰ´×¡ control ¼ü£¬°´Ï x£¬°´Ï c£¬ÔÙËÉ¿ª control ¼ü)¡£Èç¹ûÄ㻹ÓÐÒѾ­´ò ¿ªµÄδ±£´æµÄÎļþ£¬Emacs »áÎÊÄãÊÇ·ñÒª±£´æÎļþ¡£(²»ÒªÀí»áÎĵµÖÐ˵µÄÍ˳ö Emacs µÄ³£Ó÷½·¨ C-z©¤©¤Õâ¸ö¼ü×éºÏ»á°Ñ Emacs ·Åµ½ºó ̨£¬¶øÇÒÕâ¸ö·½·¨Ö»ÔÚûÓÐÐéÄâ¿ØÖÆÌ¨µÄϵͳÉÏÓÐÓÃ)¡£


2.7.2 ÅäÖÃ Emacs

¡¡¡¡Emacs ÄÜ×öºÜ¶àÓÐÓõÄÊÂÇ飻һЩÊÇÄÚÖõģ¬ÁíÍâһЩÐèÒªÎÒÃǽøÐÐÅäÖá£

¡¡¡¡Emacs ûÓÐÓÃÒ»ÖÖ˽ÓеĺêÓïÑÔÀ´ÅäÖÃ×ÔÉí£¬¶øÊÇʹÓÃÁËijÖÖÌØ±ðÊÊÓ¦±à¼­Æ÷ µÄ Lisp °æ±¾£¬½Ð×ö Emacs Lisp¡£Èç¹ûÄãÒª¼ÌÐø¶ÁÏÂÈ¥²¢ÇÒÏëѧϰһµã Common Lisp£¬Ñ§Ï°Ê¹Óà Emacs Lisp ÊǺÜÓÐÓõġ£Emacs Lisp Óкܶà Common Lisp µÄÌØÐÔ£¬ ËäȻǰÕßÏ൱С (Òò´Ë¸üÈÝÒ×ÕÆÎÕ)¡£

¡¡¡¡Ñ§Ï° Emacs Lisp ×îºÃµÄ·½·¨¾ÍÊÇÏÂÔØ Emacs Tutorial¡£

¡¡¡¡µ«ÊÇ£¬ÒªÅäÖà Emacs ²¢²»ÐèÒªÈκÎʵ¼ÊµÄ Lisp ֪ʶ£¬ÒòΪÎÒÒѾ­ÁгöÁËÒ» ¸ö .emacs Àý×Ó£¬×ã¹»ÈÃÄã˳ÀûµÄ¿ªÊ¼¹¤×÷¡£Ö»Òª°ÑÕâ¸öÎÄ ¼þ¸´ÖƵ½ÄãµÄ¼ÒĿ¼£¬Èç¹û Emacs ÒѾ­ÔÚÔËÐУ¬¾ÍÖØÐÂÆð¶¯£»Emacs »á´ÓÕâ¸öÎļþ ÖжÁÈ¡ÃüÁȻºó(Ï£Íû)ÄܸøÄãÒ»¸öÓÐÓõĻù±¾ÉèÖá£


2.7.3 Ò»¸ö .emacs ÅäÖÃÎļþµÄÀý×Ó

¡¡¡¡²»ÐÒµÄÊÇ£¬ÒªÏêϸ½âÊ͵ϰ»°¾Í³¤ÁË£»µ«ÊÇ»¹ÊÇÓÐÒ»Á½µãÖµµÃ×¢Òâ¡£

  • ÒÔ ; ¿ªÍ·µÄÊÇ×¢ÊÍ£¬»á±» Emacs ºöÂÔµô¡£

  • µÚÒ»ÐÐÀïÃæµÄ -*- Emacs-Lisp -*- ÄÜ ÈÃÎÒÃÇÔÚ Emacs ÀïÃæ±à¼­Õâ¸ö .emacs£¬²¢ÇÒ´ò¿ªËù ÓÐ Emacs Lisp µÄ±à¼­ÌØÐÔ¡£Emacs Ò»°ã»á³¢ÊÔ¸ù¾ÝÎļþÃûÀ´²Â²â£¬¶øÇÒºÜÓÐ¿É ÄÜ²Â´í¡£

  • ÔÚijЩģʽÏ£¬tab ¼ü±»°ó¶¨µ½Ò»¸öËõ½øº¯ÊýÉÏ¡£Òò ´Ë°´Ï tab ¼üºó£¬ËüÄÜËõ½øÒ»ÐдúÂë¡£Èç¹ûÄãÏë°Ñ tab µ±×÷ Ò»¸ö×Ö·û²åÈëµ½Äã±à¼­µÄ¶«Î÷ÀïÃæ£¬ÐèÒªÔÚ°´Ï tab ¼üµÄʱ ͬʱ°´×¡ control ¼ü¡£

  • Õâ¸öÎļþͨ¹ýʶ±ðÎļþÃûºó׺À´Ö§³Ö C£¬C++£¬Perl£¬Lisp ºÍ Scheme µÄÓï·¨¸ßÁÁ¡£

  • Emacs ÒѾ­ÓÐÒ»¸öÔ¤Ïȶ¨ÒåµÄº¯Êý½Ð next-error¡£ ÔÚÒ»¸ö±àÒë´íÎóÊä³ö´°¿Ú£¬°´Ï M-n ÄÜÈôÓÒ»¸ö±àÒë´íÎó ÒÆ¶¯µ½ÁíÒ»¸ö£»ÎÒÃÇ»¹¶¨ÒåÁËÒ»¸öÀàËÆµÄº¯Êý£¬ previous-error£¬Õâ¸öº¯ÊýÔÚÄã°´Ï M-p ºó£¬ÄÜÈÃÄã»Øµ½ÉÏÒ»¸ö±àÒë´íÎ󡣯äÖÐ×îºÃµÄÌØÐÔ¾ÍÊǰ´ Ï C-c C-c ºó£¬Äܸù¾Ý´íÎó´ò¿ªÏàÓ¦µÄÎļþ²¢ÇÒÌøµ½ÏàÓ¦ µÄÄÇÐдúÂë¡£

  • ÎÒÃÇ´ò¿ªÁË Emacs ×÷Ϊ ·þÎñ¶ËÔËÐеÄÌØÐÔ£¬ÕâÑùµ±ÄãÔÚ Emacs Íâ×öÒ» ЩÊÂÇéµÄʱºò£¬ÓÖÐèÒª±à¼­Ò»¸öÎļþµÄʱºò£¬Ö»ÐèÒªÊäÈë

    % emacsclient filename
         
    

    È»ºó¾Í¿ÉÒÔÔÚ Emacs ±à¼­ÄǸöÎļþÁË£¡ [8]

Àý 2-1. Ò»¸ö .emacs ÅäÖÃÎļþµÄÀý×Ó

;; -*-Emacs-Lisp-*-

;; This file is designed to be re-evaled; use the variable first-time
;; to avoid any problems with this.
(defvar first-time t
  "Flag signifying this is the first time that .emacs has been evaled")

;; Meta
(global-set-key "\M- " 'set-mark-command)
(global-set-key "\M-\C-h" 'backward-kill-word)
(global-set-key "\M-\C-r" 'query-replace)
(global-set-key "\M-r" 'replace-string)
(global-set-key "\M-g" 'goto-line)
(global-set-key "\M-h" 'help-command)

;; Function keys
(global-set-key [f1] 'manual-entry)
(global-set-key [f2] 'info)
(global-set-key [f3] 'repeat-complex-command)
(global-set-key [f4] 'advertised-undo)
(global-set-key [f5] 'eval-current-buffer)
(global-set-key [f6] 'buffer-menu)
(global-set-key [f7] 'other-window)
(global-set-key [f8] 'find-file)
(global-set-key [f9] 'save-buffer)
(global-set-key [f10] 'next-error)
(global-set-key [f11] 'compile)
(global-set-key [f12] 'grep)
(global-set-key [C-f1] 'compile)
(global-set-key [C-f2] 'grep)
(global-set-key [C-f3] 'next-error)
(global-set-key [C-f4] 'previous-error)
(global-set-key [C-f5] 'display-faces)
(global-set-key [C-f8] 'dired)
(global-set-key [C-f10] 'kill-compilation)

;; Keypad bindings
(global-set-key [up] "\C-p")
(global-set-key [down] "\C-n")
(global-set-key [left] "\C-b")
(global-set-key [right] "\C-f")
(global-set-key [home] "\C-a")
(global-set-key [end] "\C-e")
(global-set-key [prior] "\M-v")
(global-set-key [next] "\C-v")
(global-set-key [C-up] "\M-\C-b")
(global-set-key [C-down] "\M-\C-f")
(global-set-key [C-left] "\M-b")
(global-set-key [C-right] "\M-f")
(global-set-key [C-home] "\M-<")
(global-set-key [C-end] "\M->")
(global-set-key [C-prior] "\M-<")
(global-set-key [C-next] "\M->")

;; Mouse
(global-set-key [mouse-3] 'imenu)

;; Misc
(global-set-key [C-tab] "\C-q\t")   ; Control tab quotes a tab.
(setq backup-by-copying-when-mismatch t)

;; Treat 'y' or <CR> as yes, 'n' as no.
(fset 'yes-or-no-p 'y-or-n-p)
(define-key query-replace-map [return] 'act)
(define-key query-replace-map [?\C-m] 'act)

;; Load packages
(require 'desktop)
(require 'tar-mode)

;; Pretty diff mode
(autoload 'ediff-buffers "ediff" "Intelligent Emacs interface to diff" t)
(autoload 'ediff-files "ediff" "Intelligent Emacs interface to diff" t)
(autoload 'ediff-files-remote "ediff"
  "Intelligent Emacs interface to diff")

(if first-time
    (setq auto-mode-alist
      (append '(("\\.cpp$" . c++-mode)
            ("\\.hpp$" . c++-mode)
            ("\\.lsp$" . lisp-mode)
            ("\\.scm$" . scheme-mode)
            ("\\.pl$" . perl-mode)
            ) auto-mode-alist)))

;; Auto font lock mode
(defvar font-lock-auto-mode-list
  (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode 'perl-mode 'scheme-mode)
  "List of modes to always start in font-lock-mode")

(defvar font-lock-mode-keyword-alist
  '((c++-c-mode . c-font-lock-keywords)
    (perl-mode . perl-font-lock-keywords))
  "Associations between modes and keywords")

(defun font-lock-auto-mode-select ()
  "Automatically select font-lock-mode if the current major mode is in font-lock-auto-mode-list"
  (if (memq major-mode font-lock-auto-mode-list)
      (progn
    (font-lock-mode t))
    )
  )

(global-set-key [M-f1] 'font-lock-fontify-buffer)

;; New dabbrev stuff
;(require 'new-dabbrev)
(setq dabbrev-always-check-other-buffers t)
(setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_")
(add-hook 'emacs-lisp-mode-hook
      '(lambda ()
         (set (make-local-variable 'dabbrev-case-fold-search) nil)
         (set (make-local-variable 'dabbrev-case-replace) nil)))
(add-hook 'c-mode-hook
      '(lambda ()
         (set (make-local-variable 'dabbrev-case-fold-search) nil)
         (set (make-local-variable 'dabbrev-case-replace) nil)))
(add-hook 'text-mode-hook
      '(lambda ()
         (set (make-local-variable 'dabbrev-case-fold-search) t)
         (set (make-local-variable 'dabbrev-case-replace) t)))

;; C++ and C mode...
(defun my-c++-mode-hook ()
  (setq tab-width 4)
  (define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
  (define-key c++-mode-map "\C-ce" 'c-comment-edit)
  (setq c++-auto-hungry-initial-state 'none)
  (setq c++-delete-function 'backward-delete-char)
  (setq c++-tab-always-indent t)
  (setq c-indent-level 4)
  (setq c-continued-statement-offset 4)
  (setq c++-empty-arglist-indent 4))

(defun my-c-mode-hook ()
  (setq tab-width 4)
  (define-key c-mode-map "\C-m" 'reindent-then-newline-and-indent)
  (define-key c-mode-map "\C-ce" 'c-comment-edit)
  (setq c-auto-hungry-initial-state 'none)
  (setq c-delete-function 'backward-delete-char)
  (setq c-tab-always-indent t)
;; BSD-ish indentation style
  (setq c-indent-level 4)
  (setq c-continued-statement-offset 4)
  (setq c-brace-offset -4)
  (setq c-argdecl-indent 0)
  (setq c-label-offset -4))

;; Perl mode
(defun my-perl-mode-hook ()
  (setq tab-width 4)
  (define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
  (setq perl-indent-level 4)
  (setq perl-continued-statement-offset 4))

;; Scheme mode...
(defun my-scheme-mode-hook ()
  (define-key scheme-mode-map "\C-m" 'reindent-then-newline-and-indent))

;; Emacs-Lisp mode...
(defun my-lisp-mode-hook ()
  (define-key lisp-mode-map "\C-m" 'reindent-then-newline-and-indent)
  (define-key lisp-mode-map "\C-i" 'lisp-indent-line)
  (define-key lisp-mode-map "\C-j" 'eval-print-last-sexp))

;; Add all of the hooks...
(add-hook 'c++-mode-hook 'my-c++-mode-hook)
(add-hook 'c-mode-hook 'my-c-mode-hook)
(add-hook 'scheme-mode-hook 'my-scheme-mode-hook)
(add-hook 'emacs-lisp-mode-hook 'my-lisp-mode-hook)
(add-hook 'lisp-mode-hook 'my-lisp-mode-hook)
(add-hook 'perl-mode-hook 'my-perl-mode-hook)

;; Complement to next-error
(defun previous-error (n)
  "Visit previous compilation error message and corresponding source code."
  (interactive "p")
  (next-error (- n)))

;; Misc...
(transient-mark-mode 1)
(setq mark-even-if-inactive t)
(setq visible-bell nil)
(setq next-line-add-newlines nil)
(setq compile-command "make")
(setq suggest-key-bindings nil)
(put 'eval-expression 'disabled nil)
(put 'narrow-to-region 'disabled nil)
(put 'set-goal-column 'disabled nil)
(if (>= emacs-major-version 21)
    (setq show-trailing-whitespace t))

;; Elisp archive searching
(autoload 'format-lisp-code-directory "lispdir" nil t)
(autoload 'lisp-dir-apropos "lispdir" nil t)
(autoload 'lisp-dir-retrieve "lispdir" nil t)
(autoload 'lisp-dir-verify "lispdir" nil t)

;; Font lock mode
(defun my-make-face (face color &optional bold)
  "Create a face from a color and optionally make it bold"
  (make-face face)
  (copy-face 'default face)
  (set-face-foreground face color)
  (if bold (make-face-bold face))
  )

(if (eq window-system 'x)
    (progn
      (my-make-face 'blue "blue")
      (my-make-face 'red "red")
      (my-make-face 'green "dark green")
      (setq font-lock-comment-face 'blue)
      (setq font-lock-string-face 'bold)
      (setq font-lock-type-face 'bold)
      (setq font-lock-keyword-face 'bold)
      (setq font-lock-function-name-face 'red)
      (setq font-lock-doc-string-face 'green)
      (add-hook 'find-file-hooks 'font-lock-auto-mode-select)

      (setq baud-rate 1000000)
      (global-set-key "\C-cmm" 'menu-bar-mode)
      (global-set-key "\C-cms" 'scroll-bar-mode)
      (global-set-key [backspace] 'backward-delete-char)
                    ;      (global-set-key [delete] 'delete-char)
      (standard-display-european t)
      (load-library "iso-transl")))

;; X11 or PC using direct screen writes
(if window-system
    (progn
      ;;      (global-set-key [M-f1] 'hilit-repaint-command)
      ;;      (global-set-key [M-f2] [?\C-u M-f1])
      (setq hilit-mode-enable-list
        '(not text-mode c-mode c++-mode emacs-lisp-mode lisp-mode
          scheme-mode)
        hilit-auto-highlight nil
        hilit-auto-rehighlight 'visible
        hilit-inhibit-hooks nil
        hilit-inhibit-rebinding t)
      (require 'hilit19)
      (require 'paren))
  (setq baud-rate 2400)         ; For slow serial connections
  )

;; TTY type terminal
(if (and (not window-system)
     (not (equal system-type 'ms-dos)))
    (progn
      (if first-time
      (progn
        (keyboard-translate ?\C-h ?\C-?)
        (keyboard-translate ?\C-? ?\C-h)))))

;; Under UNIX
(if (not (equal system-type 'ms-dos))
    (progn
      (if first-time
      (server-start))))

;; Add any face changes here
(add-hook 'term-setup-hook 'my-term-setup-hook)
(defun my-term-setup-hook ()
  (if (eq window-system 'pc)
      (progn
;;  (set-face-background 'default "red")
    )))

;; Restore the "desktop" - do this as late as possible
(if first-time
    (progn
      (desktop-load-default)
      (desktop-read)))

;; Indicate that this file has been read at least once
(setq first-time nil)

;; No need to debug anything now

(setq debug-on-error nil)

;; All done
(message "All done, %s%s" (user-login-name) ".")
   

2.7.4 À©Õ¹ Emacs ËùÖ§³ÖÓïÑԵķ¶Î§

¡¡¡¡ÏÖÔÚ£¬Èç¹ûÄãÖ»ÊÇÏëÓà .emacs É趨ºÃµÄÓïÑÔ (C, C++, Perl, Lisp ºÍ Scheme) À´±à³Ì£¬ÊÂÇé¾ÍºÜºÃ°ì¡£µ«ÊÇ£¬Èç¹ûͻȻһ¸öеÄÓï ÑÔ£¬½Ð ¡°whizbang¡±£¬Óкܶ༤¶¯ÈËÐĵÄÌØÐÔ£¬³öÀ´ÁË£¬»á·¢ÉúʲôÊÂÇ飿

¡¡¡¡µÚÒ»¼þÒª×öµÄÊÂÇé¾ÍÊÇÕÒµ½ÊÇ·ñÓÐÈκÎÎļþÄܹ»¸æËß Emacs ¹ØÓÚÕâ¸öÓïÑ﵀ ÐÅÏ¢¡£ÕâÖÖÎļþͨ³£ÒÔ .el ½á⣬ÊÇ ¡°Emacs Lisp¡± µÄËõд¡£ÀýÈ磬Èç¹û whizbang ÊÇ FreeBSD µÄÒ»¸ö port£¬ÄÇôÎÒÃÇ ¿ÉÒÔÓÃÈçÏÂÃüÁîÀ´¶¨Î»ÕâЩÎļþ

% find /usr/ports/lang/whizbang -name "*.el" -print

¡¡¡¡È»ºó°²×°ÕâЩÎļþµ½ Emacs µÄϵͳ¼¶ Lisp Ŀ¼¡£ÔÚ FreeBSD 2.1.0-Release ÀÕâ¸öĿ¼¾ÍÊÇ /usr/local/share/emacs/site-lisp¡£

¡¡¡¡ÀýÈ磬Èç¹û¸Õ²ÅµÄ¶¨Î»ÃüÁîµÄÊä³öÊÇ

/usr/ports/lang/whizbang/work/misc/whizbang.el

¡¡¡¡ÎÒÃÇ¿ÉÒÔÖ´ÐÐ

# cp /usr/ports/lang/whizbang/work/misc/whizbang.el /usr/local/share/emacs/site-lisp

¡¡¡¡ÏÂÒ»²½£¬ÎÒÃÇÐèҪȷ¶¨ whizbang µÄÔ´ÎļþÊÇÒÔʲôºó׺½áβ¡£ÎÒÃǼٶ¨ÕâЩ Ô´Îļþ¶¼ÊÇÒÔ .wiz ½áβ¡£ÎÒÃÇÐèÒªÔÚ .emacs ¼ÓÉÏÒ»Ìõʹ Emacs Äܹ»Ê¹Óà whizbang.el ÖеÄÐÅÏ¢¡£

¡¡¡¡ÔÚ .emacs ÖÐÕÒµ½ auto-mode-alist entry£¬Îª whizbang Ìí¼ÓÒ»ÐУ¬ÀýÈ磺

...
("\\.lsp$" . lisp-mode)
("\\.wiz$" . whizbang-mode)
("\\.scm$" . scheme-mode)
...

¡¡¡¡Òâ˼¾ÍÊÇ£¬µ±Äã±à¼­Ò»¸öÒÔ .wiz ½áβµÄÎļþµÄʱºò£¬ Emacs »á×Ô¶¯½øÈë whizbang-mode¡£

¡¡¡¡¾ÍÔÚÏÂÃæ£¬Äã»á·¢ÏÖ font-lock-auto-mode-list ÕâÒ»Ìõ¡£ Ìí¼Ó whizbang-mode

;; Auto font lock mode
(defvar font-lock-auto-mode-list
  (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'whizbang-mode 'lisp-mode 'perl-mode 'scheme-mode)
  "List of modes to always start in font-lock-mode")

¡¡¡¡ÕâÒâζ×ŵ±Äã±à¼­ .wiz ÎļþµÄʱºò£¬Emacs »á×Ô¶¯ ´ò¿ª font-lock-mode(¾ÍÊÇÓï·¨¸ßÁÁ)¡£

¡¡¡¡Õâ¾ÍÊÇËùÓбØÒªµÄ²½Öè¡£Èç¹ûÔÚÄã´ò¿ªÒ»¸ö .wiz ÎÄ ¼þµÄʱºò£¬»¹ÓÐÐèÒª×Ô¶¯Ö´ÐеÄÈÎºÎÆäËû²½Ö裬Äã¿ÉÒÔÌí¼ÓÒ»¸ö whizbang-mode hook (²é¿´ my-scheme-mode-hook ÖÐÌí¼Ó auto-indent µÄ²½Öè×÷ΪÀý×Ó)¡£


2.8 ²¹³äÔĶÁ

¡¡¡¡¹ØÓÚ FreeBSD Ï´¿ª·¢»·¾³µÄÐÅÏ¢µÄÐ޸ģ¬¿ÉÒԲο´ development(7)¡£

  • Brian Harvey and Matthew Wright Simply Scheme MIT 1994. ISBN 0-262-08226-8

  • Randall Schwartz Learning Perl O'Reilly 1993 ISBN 1-56592-042-2

  • Patrick Henry Winston and Berthold Klaus Paul Horn Lisp (3rd Edition) Addison-Wesley 1989 ISBN 0-201-08319-1

  • Brian W. Kernighan and Rob Pike The Unix Programming Environment Prentice-Hall 1984 ISBN 0-13-937681-X

  • Brian W. Kernighan and Dennis M. Ritchie The C Programming Language (2nd Edition) Prentice-Hall 1988 ISBN 0-13-110362-8

  • Bjarne Stroustrup The C++ Programming Language Addison-Wesley 1991 ISBN 0-201-53992-6

  • W. Richard Stevens Advanced Programming in the Unix Environment Addison-Wesley 1992 ISBN 0-201-56317-7

  • W. Richard Stevens Unix Network Programming Prentice-Hall 1990 ISBN 0-13-949876-1


µÚ3Õ ¡¡°²È«µÄ±à³Ì

¹©¸å£ºMurray Stokely. ·­Ò룺susn @NewSMTH.

3.1 ÌáÒª

¡¡¡¡±¾ÕÂÃèÊöÁËÊ®Äê¼äһЩÁîUNIX³ÌÐòÔ±¸Ðµ½À§»óµÄ°²È«ÎÊÌ⣬ ²¢ÌṩÁËһЩÐµĹ¤¾ßÀ´°ïÖú³ÌÐòÔ±±ÜÃâÉú³É¿É±»ÀûÓõĴúÂë¡£


3.2 °²È«µÄÉè¼Æ·½·¨

¡¡¡¡±àд°²È«µÄÓ¦ÓóÌÐòÒª´ø×Ž÷É÷ºÍÂÔÓб¯¹ÛµÄÉú»î¹Ûµã¡£³ÌÐòÓ¦¸Ã±¾×Å ¡°×îÐ¡ÌØÈ¨¡±µÄÔ­ÔòÔËÐУ¬ÕâÑù¾Í²»»áÓдø×Å´óÓÚ×ã¹»ÄÜÍê³É Æä¹¦ÄܵÄȨÏ޵Ľø³ÌÔÚÔËÐС£Ô¤ÏȲâÊԵĴúÂëÓ¦¸ÃËæÊ±¿ÉÒÔÖØÓÃÒÔ±ÜÃâÓöµ½ һЩ±¾ÒѾ­ÐÞ¸´µÄͨ³£´íÎó¡£

¡¡¡¡UNIX»·¾³µÄÏÝÚåÖ®Ò»¾ÍÊǺÜÈÝÒ×µÄÖÆÔìÒ»¸öÎȽ¡»·¾³µÄ¼ÙÏó¡£³ÌÐò Ó¦¸ÃÓÀÔ¶²»ÒªÏàÐÅÓû§µÄÊäÈë(ÒÔ¸÷ÖÖÐÎʽ)£¬ÏµÍ³×ÊÔ´£¬½ø³Ì¼äͨѶ£¬»òÕß ´¥·¢Ê¼þµÄʱÖÓ¡£UNIX½ø³Ì²»ÊÇͬ²½ÔËÐУ¬ËùÒÔÂß¼­²Ù×÷ºÜÉÙÊÇÔ­×ÓÀàÐÍ¡£


3.3 »º³åÇøÒç³ö

¡¡¡¡»º³åÇøÒç³öµÄ©¶´Ëæ×ŷ롤ŵÒÀÂü 1 ¹¹¼ÜµÄ³ö ÏÖ¾ÍÒѾ­¿ªÊ¼³öÏÖÁË¡£ ÔÚ1988ÄêËæ×ÅĪÀï˹»¥ÁªÍøÈ䳿µÄ¹ã·º´«²¥ËûÃÇ¿ªÊ¼ÉùÃûÀǽ塣²»ÐÒµÄÊÇ£¬ ͬÑùµÄÕâÖÖ¹¥»÷Ò»Ö±³ÖÐøµ½½ñÌì¡£ 1999ÄêµÄ17¸öCERT(Computer Emergency Response Team, ¿¨ÄÚ»ù÷¡´óѧ¼ÆËã»ú½ô¼±ÏìӦС×é)µÄ°²È«Í¨¸æÖУ¬ ËûÃÇÖеÄ10¸öÖ±½ÓÊÇÓÉÈí¼þµÄ»º³åÇøÒç³ö¶ø µ¼Öµġ£µ½Ä¿Ç°ÎªÖ¹£¬´ó²¿·ÖµÄ»º³åÇøÒç³öµÄ¹¥»÷¶¼ÊÇ»ùÓÚ´Ý»ÙÕ»µÄ·½Ê½¡£

¡¡¡¡´ó²¿·ÖÏÖ´ú¼ÆËã»úϵͳʹÓÃÕ»À´¸ø½ø³Ì´«µÝ²ÎÊý²¢ÇÒ´æ´¢¾Ö²¿±äÁ¿¡£ Õ»ÊÇÒ»ÖÖÔÚ½ø³ÌÓ³ÏóÄÚ´æµÄ¸ßµØÖ·Äڵĺó½øÏȳö(LIFO)µÄ»º³åÇø¡£ µ±³ÌÐòµ÷ÓÃÒ»¸öº¯Êýʱһ¸öеġ°Õ»Ö¡¡±»á±»´´½¨¡£Õâ¸öÕ»Ö¡°üº¬×Å ´«µÝ¸øº¯ÊýµÄ¸÷ÖÖ²ÎÊýºÍһЩ¶¯Ì¬µÄ¾Ö²¿±äÁ¿¿Õ¼ä¡£¡°Õ»Ö¸Õ롱¼Ç¼×ŵ±Ç° Õ»¶¥µÄλÖᣠÓÉÓÚÕ»Ö¸ÕëµÄÖµ»áÒòΪбäÁ¿µÄѹÈëÕ»¶¥¶ø¾­³£µÄ±ä»¯£¬Ðí¶àʵÏÖÒ²ÌṩÁË Ò»ÖÖ"Ö¡Ö¸Õë"À´¶¨Î»ÔÚÕ»Ö¡µÄÆðʼλÖã¬ÒÔ±ã¾Ö²¿±äÁ¿¿ÉÒÔ¸üÈÝÒ׵ı»·ÃÎÊ¡£ 1µ÷Óú¯ÊýµÄ·µ»ØµØÖ·Ò²Í¬Ñù´æ´¢ÔÚÕ»ÖУ¬ ÓÉÓÚÔÚº¯ÊýÖеľֲ¿±äÁ¿¸²¸ÇÁ˺¯ÊýµÄ·µ»ØµØÖ·³ÉΪÁËÕ»Òç³öµÄÒ»¸öÔ­Òò£¬ Õâ¾ÍDZÔÚµÄ×¼ÐíÁËÒ»¸ö¶ñÒâÓû§¿ÉÒÔÖ´ÐÐËû(Ëý)ËùÏëÔËÐеÄÈκδúÂë¡£

¡¡¡¡ËäÈ»»ùÓÚÕ»µÄ¹¥»÷ÊÇĿǰ×î¹ã·ºµÄ£¬ÕâÒ²¿ÉÒÔʹ»ùÓڶѵĹ¥»÷(malloc/ free)±ä³É¿ÉÄÜ¡£

¡¡¡¡C³ÌÐòÓïÑÔ²¢²»ÏñÆäËûһЩ±à³ÌÓïÑÔÒ»Ñù×Ô¶¯µÄ×öÊý×é»òÕßÖ¸ÕëµÄ±ß ½ç¼ì²é¡£ÁíÍ⣬C±ê×¼¿â»¹¾ßÓÐÏ൱һЩ·Ç³£Î£ÏյIJÙ×÷º¯Êý¡£

strcpy(char *dest, const char *src)

¿Éµ¼ÖÂdest»º³åÇøÒç³ö

strcat(char *dest, const char *src)

¿Éµ¼ÖÂdest»º³åÇøÒç³ö

getwd(char *buf)

¿Éµ¼ÖÂbuf»º³åÇøÒç³ö

gets(char *s)

¿Éµ¼ÖÂs»º³åÇøÒç³ö

[vf]scanf(const char *format, ...)

¿Éµ¼Ö²ÎÊýÒç³ö

realpath(char *path, char resolved_path[])

¿Éµ¼ÖÂpath»º³åÇøÒç³ö

[v]sprintf(char *str, const char *format, ...)

¿Éµ¼ÖÂstr»º³åÇøÒç³ö


3.3.1 »º³åÇøÒç³öʾÀý

¡¡¡¡ÏÂÃæµÄʾÀý´úÂë°üº¬ÁËÒ»¸ö»º³åÇøÒç³öµÄÇé¿ö£¬Ëü»á¸²¸Çº¯ÊýµÄ·µ»ØµØÖ·²¢ÇÒ Á¢¼´Ìø¹ýÁ˽ôËæ´Ëº¯ÊýÖ®ºóµ÷Óá£(ÊÚȨÓÚ5)

#include <stdio.h>

void manipulate(char *buffer) {
  char newbuffer[80];
  strcpy(newbuffer,buffer);
}

int main() {
  char ch,buffer[4096];
  int i=0;

  while ((buffer[i++] = getchar()) != '\n') {};
  
  i=1;
  manipulate(buffer);
  i=2;
  printf("The value of i is : %d\n",i);
  return 0;
}

¡¡¡¡ÈÃÎÒÃÇÀ´²é¿´Ò»ÏÂÈç¹ûÔÚÊäÈë»Ø³µÖ®Ç°ÊäÈë160¸ö¿Õ¸ñºóÕâ¸öС³ÌÐò µÄÄÚ´æÓ³ÏóÊǸöʲôÑù×Ó¡£

¡¡¡¡[XXX figure here!]

¡¡¡¡ºÜÃ÷ÏÔ¸ü¶àµÄ¶ñÒâÊäÈëÄܱ»Éè¼Æ³öÖ´ÐÐʵ¼ÊµÄ±àÒëÖ¸Áî(ÀýÈç exec(/bin/sh))¡£


3.3.2 ±ÜÃ⻺³åÇøÒç³ö

¡¡¡¡¶ÔÓÚÕ»Òç³öµÄ×îÖ±½ÓµÄ½â¾ö·½·¨¾ÍÊÇ×ÜÊÇʹÓó¤¶ÈÓÐÏÞµÄÄÚ´æºÍ ×Ö·û´®¸´Öƺ¯Êý¡£strncpyºÍstrncat ÊÇC±ê×¼¿âµÄÒ»²¿·Ö¡£ ÕâЩº¯Êý½ÓÊÕÒ»¸ö²»´óÓÚÄ¿±ê»º³åÇø³¤¶ÈµÄÖµ×÷Ϊ²ÎÊý¡£ÕâЩº¯Êý»á´Ó Ô´µØÖ·¸´ÖÆ´ËÖµ³¤µÄ×Ö½ÚÊýµ½Ä¿±êµØÖ·¡£È»¶øÕâЩº¯Êý»¹ÊÇÓÐһЩÎÊÌâ¡£ Èç¹ûÊäÈ뻺³åÇøµÄ³¤¶ÈºÍÄ¿±ê»º³åÇøµÄÒ»Ñù³¤Ôòº¯Êý²»±£Ö¤Á½Õß¶¼ÒÔNUL ×÷Ϊ½áÊø·û¡£ ³¤¶È²ÎÊýÔÚstrncpyºÍstrncatº¯ÊýÖÐͬÑùµÄ²»Ò»ÖºÜÈÝÒ×µ¼Ö³ÌÐòÔ±ÔÚ Õý³£Ê¹ÓÃʱ¸Ðµ½À§»ó¡£Í¬Ê±µ±¸´ÖÆÒ»¸ö½Ï¶ÌµÄ×Ö·û´®µ½Ò»¸öºÜ´óµÄ»º³å ÇøÖÐʱÏà¶ÔÓÚstrcpyÒ²ÓкÜÖØ´óµÄÐÔÄÜËðʧ£¬ ÒòΪstrncpy»áÓÃNULÌî³äËùÖ¸¶¨µÄ³¤¶È¡£

¡¡¡¡ÔÚOpenBSDÖУ¬ÁíÒ»¸öÄÚ´æ¸´ÖÆµÄʵÏÖÒѾ­¹æ±ÜÁËÕâЩÎÊÌâ¡£ º¯ÊýstrlcpyºÍstrlcat ±£Ö¤Á˵±Ö¸¶¨ÁË·ÇÁãµÄ³¤¶È²ÎÊýʱĿ±ê×Ö·û´®×ÜÊÇÒÔNUL×÷Ϊ½áÊø·û¡£ ¹ØÓÚÕâЩº¯ÊýµÄ¸ü¶àÐÅÏ¢Çë²Î¿¼7¡£OpenBSD µÄstrlcpyºÍstrlcat ×Ô´ÓFreeBSD3.3µÄ°æ±¾ÒѾ­±»ÒýÈëÁË¡£


3.3.2.1 »ùÓÚ±àÒëÆ÷ÔËÐÐʱ±ß½ç¼ì²é

¡¡¡¡²»ÐÒµÄÊÇÈÓÈ»ÓÐÏ൱ÊýÁ¿µÄ´úÂëÔڹ㷺ʹÓÃäĿµÄÄÚ´æ¸´ÖÆ¹¦ÄÜ ¶ø²»ÊÇÎÒÃÇËùÌá¼°µ½µÄÈκÎÓÐÏÞÖÆµÄ¸´ÖÆÀý³Ì¡£ÐÒÔ˵ÄÊÇ»¹ÓÐÁíÒ»¸ö½â ¾ö·½°¸¡£ÓÐһЩ±àÒëÆ÷²å¼þºÍ¿âÔÚC/C++ÖÐÒ»Ö±ÔÚ×öÔËÐÐʱµÄ±ß½ç¼ì²é¡£

¡¡¡¡×÷Ϊgcc´úÂëÉú³ÉÆ÷µÄÒ»¸öС²¹¶¡StackGuard¾ÍÊÇÕâÑùÒ»¿î²å¼þ¡£ Ô´×ÔStackGuard Õ¾µã:

¡°StackGuard ¼ì²â²¢¿¿×ű£»¤ÔÚÕ»Öеķµ»ØµØÖ·²» Êܵ½¸ü¸ÄÀ´·ÀÓùÕë¶ÔÕ»µÄ¾çÁÒ¹¥»÷¡£µ±º¯Êý±»µ÷ÓÃʱStackGuardÔÚÕ»ÖÐ ½ôÁÚ·µ»ØµØÖ··ÅÖÃÁËÒ»¸ö¡®canary¡¯(ÉÚ±ø»ò̽Õë)¡£Èç¹ûº¯Êý·µ»ØÊ±ÉÚ±ø ÒѾ­±»¸Ä±äÁË£¬¾ÍÊÇÓÐÕë¶ÔÕ»µÄ¹¥»÷ʵʩÁË£¬ÄÇô³ÌÐò»áÔÚsyslogÖз¢ ³öÒ»¸öÈëÇÖ¾¯±¨²¢ÇÒÍ£Ö¹ÔËÐС£

¡°StackGuard×÷Ϊgcc´úÂëÉú³ÉÆ÷µÄÒ»¸öС²¹¶¡À´Êµ ÏÖ£¬ÌرðÊÇfunction_prolog()ºÍfunction_epilog()³ÌÐò¡£ ÔöÇ¿µÄfunction_prolog()ÔÚº¯Êý¿ªÊ¼Ê±ÔÚÕ»Öа²×°ÁËÉÚ±ø£¬¶ø function_epilog()ÔÚº¯ÊýÍ˳öʱ¼ì²éÉÚ±øµÄÍêÕûÐÔ¡£ÈÎºÎÆäËûÆÆ»µ·µ »ØµØÖ·µÄÐÐΪÔÚº¯Êý·µ»ØÊ±¾ÍÕâÑù±»¼ì²âµ½ÁË¡£



¡¡¡¡Ê¹ÓÃStackGuardÖØÐ±àÒëÄãµÄ³ÌÐò¿ÉÒÔÓÐЧµÄ·ÀÖ¹´ó²¿·ÖµÄ»º³å ÇøÒç³öµÄ¹¥»÷£¬µ«ÊÇÕâÈÔÈ»ÊǸöÕÛÖԵİ취¡£


3.3.2.2 »ùÓÚ¿âÔËÐÐʱ±ß½ç¼ì²é

¡¡¡¡»ùÓÚ±àÒëÆ÷µÄ»úÖÆ¶ÔÓÚ²»ÄÜÖØÐ±àÒëµÄÖ»Óжþ½øÖƵÄÈí¼þÍê È«ÎÞÓ᣶ÔÓÚÕâЩÇé¿öÈÔ»¹ÊÇÓкܶà¿â¿ÉÒÔ¶ÔC¿âÖеIJ»°²È«µÄº¯Êý (strcpy, fscanf, getwdµÈ)ÖØÐÂʵÏÖ²¢È·±£ÕâЩº¯Êý¾ö²»»ØÐ´ Õ»Ö¸Õë¡£

  • libsafe

  • libverify

  • libparanoia

¡¡¡¡²»ÐÒµÄÊÇÕâЩ»ùÓÚ¿âµÄ·À»¤ÓÐһЩȱµã¡£ÕâЩ¿â½ö½ö±£»¤ºÍ°²È« Ïà¹ØµÄһС²¿·Ö¼¯ºÏ£¬ËûÃǺöÂÔÁËʵ¼ÊµÄÎÊÌâ¡£Èç¹û³ÌÐòʹÓòÎÊý -fomit-frame-pointer½øÐбàÒëµÄ»°ÕâЩ·À»¤Ò²Ðí»áʧ°Ü¡£Í¬Ñù£¬»·¾³ ±äÁ¿LD_PRELOADºÍLD_LIBRARY_PATHÒ²¿ÉÒÔ±»Óû§È¡Ïû»òÕßÖØÖá£


3.4 SetUID ÎÊÌâ

¡¡¡¡¶ÔÓÚ¸ø¶¨µÄ½ø³ÌÖÁÉÙÓÐ6¸ö²»Í¬µÄIDÓëÖ®¹ØÁª¡£Òò´ËÄã²»µÃ²»·Ç³£ ¹Ø×¢ÄãµÄ³ÌÐòÔÚÈκÎÌØ¶¨Ê±¿ÌµÄȨÏÞÎÊÌâ¡£ÌØ±ðµÄ£¬ËùÓÐseteuidµÄ³ÌÐò ÔÚ²»ÐèÒªµÄʱºò»áÁ¢¿Ì·ÅÆúËûÃǵÄÌØÈ¨¡£

¡¡¡¡Êµ¼ÊÓû§IDÖ»Äܱ»³¬¼¶Óû§½ø³Ì¸Ä±ä¡£µ±Óû§³õʼµÇ½ʱ login³ÌÐòÉèÖÃËü²¢ÇÒ¼«ÉÙ½øÐиü¸Ä¡£

¡¡¡¡Èç¹û³ÌÐò×¼ÐíseteuidλÉèÖõϰÓÐЧÓû§ID»á±»exec() º¯ÊýÉèÖá£Ó¦ÓóÌÐò¿ÉÒÔµ÷ÓÃseteuid() ÔÚÈκÎʱºòÉèÖÃÓÐЧµÄÓû§IDΪÈÎÒâµÄʵ¼ÊÓû§ID»òÕß±£´æ ÉèÖÃ-Óû§-ID¡£µ±ÓÐЧÓû§ID±» exec()º¯ÊýÉèÖÃºó£¬ Ç°Ò»¸öIDµÄÖµ»á±»±£´æÔÚÉèÖÃ-Óû§-IDÖС£


3.5 ÏÞÖÆÄãµÄ³ÌÐò»·¾³

¡¡¡¡´«Í³µÄÏÞÖÆ½ø³ÌµÄ·½·¨ÊÇʹÓÃϵͳµ÷ÓÃchroot() ¡£Õâ¸öϵͳµ÷ÓÃʹµÃ´Ó½ø³Ì¼°ÆäÈκÎ×Ó½ø³ÌËùÒýÓÃµÄÆäËûµÄ ·¾¶±äΪ¸ù·¾¶¡£¶ÔÓÚҪʹ³ÌÐòÔËÐгɹ¦Õâ¸öµ÷ÓñØÐëÔÚÒýÓõÄĿ¼ÉÏ ÓµÓÐÖ´ÐÐ(ËÑË÷)µÄȨÏÞ¡£Ö±µ½ÄãʹÓÃÁËchdir() ÔÚÄãµÄл·¾³ÖÐËü²Å»áʵ¼ÊµÄÉúЧ¡£Í¬Ê±Ó¦¸Ã×¢Òâµ½Èç¹û³ÌÐò¾ßÓг¬¼¶ Óû§µÄȨÏÞËüºÜÈÝÒ׵İÚÍÑchrootËùÉèÖõĻ·¾³¡£Ëü¿ÉÄÜ¿¿´´½¨É豸½Úµã À´¶ÁÈ¡Äں˵ÄÄÚÈÝ£¬¶Ô³ÌÐòÔÚjailÍâ°ó¶¨Ò»¸öµ÷ÊÔÆ÷£¬»òÕß¿¿ÆäËû´´ÔìÐÔ µÄ·½·¨À´Íê³É²Ù×÷¡£

¡¡¡¡ÏµÍ³µ÷ÓÃchroot()µÄÐÐΪ¿ÉÒÔ±» sysctl±äÁ¿kern.chroot_allow_open_directories µÄÖµÔÚÒ»¶¨³Ì¶ÈÉÏ¿ØÖÆ¡£µ±´ËֵΪ0ʱ£¬Èç¹ûÓÐÈκÎĿ¼±»´ò¿ª chroot()½«»á·µ»ØEPERM²¢Ê§°Ü¡£µ±±»ÖÃΪĬÈÏÖµ1£¬Èç¹û ÈκÎĿ¼±»´ò¿ª²¢ÇÒ½ø³ÌÒѾ­×¼±¸µ÷Óà chroot() ÄÇôchroot()½«»á·µ»ØEPERM²¢Ê§°Ü¡£¶ÔÓÚÆäËûµÄ Öµ£¬¶Ô´ò¿ªÄ¿Â¼µÄ¼ì²é»á±»ÍêÈ«µÄºöÊÓ¡£


3.5.1 FreeBSDµÄjail¹¦ÄÜ

¡¡¡¡JailµÄ¸ÅÄîÔÚchroot()Ö®ÉÏ×÷ÁËÑÓÉ죬Ëü ¿¿ÏÞÖÆ³¬¼¶Óû§µÄȨÁ¦À´´´½¨ÁËÒ»¸öÕæÕýµÄ"ÐéÄâ·þÎñÆ÷"¡£Ò»µ©Ò»¸ö¼à Óü±»ÉèÖúúóÕû¸öÍøÂç±ØÐëͨ¹ýÌØ±ðµÄIPµØÖ·²ÅÄܵ½´ï£¬ÔÚÕâÀï"³¬¼¶Óà »§È¨ÏÞ"µÄÁ¦Á¿ÍêÈ«µÄÊܵ½ÏÞÖÆ¡£

¡¡¡¡µ±ÔÚjailÖÐʱ£¬ËùÓÐÔÚÄÚºËÖÐʹÓÃsuser() µ÷Óõij¬¼¶Óû§È¨Ï޵ij¢ÊÔ¶¼»áʧ°Ü¡£È»¶ø£¬Ò»Ð©¶Ôsuser() µÄµ÷ÓÃÒѾ­±»¸ü¸ÄΪеĽӿÚsuser_xxx() ¡£Õâ¸öº¯Êý¶ÔÈϿɻòÕ߾ܾø±»ÏÞÖÆµÄ½ø³ÌȥȡµÃ³¬¼¶Óû§µÄȨ ÏÞµÄÐÐΪ¸ºÔð¡£

¡¡¡¡Ò»¸öÔÚJail»·¾³Öеij¬¼¶Óû§½ø³ÌÓÐÒÔÏÂȨÁ¦:

  • ʹÓÿÉÐÅÈεIJÙ×÷£º setuid, seteuid, setgid, setegid, setgroups, setreuid, setregid, setlogin

  • ʹÓÃsetrlimitÉèÖÃ×ÊÔ´ÏÞÖÆ

  • ±à¼­Ò»Ð©sysctl½ÚµãÖµ (kern.hostname)

  • chroot()

  • ÔÚ vnode ÉÏÉèÖñêÖ¾£º chflags¡¢ fchflags

  • ÉèÖà vnode ½ÚµãµÄÊôÐÔ£¬ Èç·ÃÎÊȨÏÞ¡¢ ËùÓÐÕß¡¢ ËùÓÐ×é¡¢ ³ß´ç¡¢ ÉϴηÃÎÊʱ¼ä£¬ ÒÔ¼°ÐÞ¸Äʱ¼ä¡£

  • ÔÚ»¥ÁªÍøÓòÉϰó¶¨ÌØÈ¨¶Ë¿Ú (¶Ë¿ÚºÅ < 1024)

¡¡¡¡JailÊÇÒ»¸ö¶ÔÓÚÔÚÒ»¸ö°²È«»·¾³ÖÐ ÔËÐÐÒ»¸öÈÔÓÐһЩȱµãµÄ³ÌÐò·Ç³£ÓÐÓõŤ¾ß¡£Ä¿Ç°£¬IPC»úÖÆ»¹Ã»Óб» ¸ü¸Äµ½suser_xxxÒÔÖÁÓÚÏñMySQLÖ®ÀàµÄ³ÌÐò»¹²» ÄÜÔËÐÐÔÚjailÖС£ÔÚjailÖг¬¼¶Óû§µÄ´æÈ¡¿ÉÄÜ»¹Óзdz£ÓÐÏ޵ĺ¬Ò壬 µ«ÊÇûÓÐ;¾¶ÄÜÕýÈ·µÄÖ¸³ö"·Ç³£ÓÐÏÞ"Òâζ×Åʲô¡£


3.5.2 POSIX®.1e ´¦ÀíÄÜÁ¦

¡¡¡¡POSIXÒѾ­·¢²¼ÁËÒ»¸ö¹¤×÷²Ý°¸£¬Ôö¼ÓÁËʼþÉ󼯣¬·ÃÎÊ¿ØÖÆÁÐ±í£¬ ¾«Ï¸ÌØÈ¨¿ØÖÆ£¬ÐÅÏ¢±êÇ©ºÍÇ¿ÖÆ·ÃÎÊ¿ØÖÆ¡£

¡¡¡¡ÕâÊÇÒ»¸öÕýÔÚ½øÕ¹ÖеŤ×÷²¢ÇÒÊÇ TrustedBSDÏîÄ¿µÄÖØµã¡£Ò»Ð©³õʼ»¯µÄ¹¤×÷ÒѾ­±»Ìá½»µ½ FreeBSD-CURRENT(cap_set_proc(3))¡£


3.6 ÐÅÈÎ

¡¡¡¡Ò»¸ö³ÌÐòÓ¦¸ÃÓÀÔ¶²»Òª¼ÙÉèÓû§»·¾³Êǽ¡È«µÄ¡£Õâ°üÀ¨(µ«ÊǾö²»ÏÞÓÚ´Ë): Óû§ÊäÈ룬Ðźţ¬»·¾³±äÁ¿£¬×ÊÔ´£¬IPC£¬mmap(ÄÚ´æÓ³Éä)£¬¹¤×÷Ŀ¼µÄÎļþϵͳ£¬ ÎļþÃèÊö·û£¬´ò¿ªÎļþµÄÊýÁ¿£¬µÈµÈ

¡¡¡¡ÄãÓÀÔ¶²»Òª¼ÙÉèÄã¿ÉÒÔ²¶×½µ½ËùÓеÄÓû§¿ÉÄܲúÉúµÄ·Ç·¨ÊäÈëÑùʽ¡£ »»ÑÔÖ®£¬ÄãµÄ³ÌÐòÓ¦¸Ã¹ýÂËÖ»×¼ÐíһЩÄãÈÏΪ°²È«µÄÌØ±ðµÄÊäÈë×Ó¼¯¡£ ²»ÕýÈ·µÄÈ·ÈÏÊý¾Ý»áµ¼Ö¸÷ÖÖ´íÎó£¬ÌرðÊÇÔÚ»¥ÁªÍøÉϵÄCGI½Å±¾¡£ ¶ÔÓÚÎļþÃûÄãÓ¦¸Ã¶îÍâСÐıÈÈç·¾¶("../", "/")£¬·ûºÅÁ¬½ÓºÍshellµÄÍ˳ö·û¡£

¡¡¡¡PerlÓÐÒ»¸ö·Ç³£°ôµÄÌØÐÔ½Ð×ö¡°Taint¡±Ä£Ê½ÄܱÜÃâ½Å±¾´ÓÍⲿ³ÌÐòÔÚ²» °²È«µÄ;¾¶µÃµ½Ê¹ÓõÄÊý¾Ý¡£Õâ¸ö·½Ê½»á¼ì²éÃüÁîÐвÎÊý£¬»·¾³±äÁ¿£¬Î»Öà ÐÅϢȷ¶¨ÏµÍ³µ÷ÓÃ(readdir(),readlink() ,getpwxxx())µÄ½á¹ûºÍËùÓÐÎļþµÄÊäÈë¡£


3.7 ¾ºÌ¬Ìõ¼þ

¡¡¡¡¾ºÌ¬Ìõ¼þÊÇÓɺÍʼþʱ¼äÏà¹ØµÄÒâÁÏÖ®ÍâµÄÒÀÀµËùµ¼Öµķ´³£ÐÐΪ¡£ »»¾ä»°Ëµ£¬Ò»¸ö³ÌÐòÔ±²»ÕýÈ·µÄ¼ÙÉèÒ»¸öÌØÊâµÄʼþ×ÜÊÇÔÚÁíÒ»¸öʼþ֮ǰ·¢Éú¡£

¡¡¡¡Ò»Ð©Í¨³£µÄµ¼Ö¾ºÌ¬Ìõ¼þµÄÔ­ÒòÊÇÐźţ¬´æÈ¡¼ì²éºÍ´ò¿ªÎļþ²Ù×÷¡£ ÓÉÓÚÐźÅÉúÀ´¾ÍÊÇÒ첽ʼþËùÒÔÔÚ´¦ÀíËûÃÇÊ±ÒªÌØ±ðµ±ÐÄ¡£´æÈ¡¼ì²éÖÐʹ ÓÃaccess(2)È»ºóʹÓÃopen(2) ÊǺÜÃ÷ÏԵķÇÔ­×Ó²Ù×÷¡£Óû§¿ÉÒÔÔÚÁ½´Îµ÷ÓÃÖÐÒÆ×ßÎļþ¡£»»ÑÔÖ®£¬ÓÐÌØ ȨµÄ³ÌÐòÓ¦¸ÃʹÓÃseteuid()È»ºóÖ±½Óµ÷Óà open()¡£ÑØ×Åͬһ˼·£¬Ò»¸ö³ÌÐòÓ¦¸Ã×ÜÊÇÔÚ open()֮ǰÉèÖÃÕýÈ·µÄÑÚÂëÀ´Åųý²»ºÏÂß¼­µÄ chmod()µ÷Óá£


µÚ4Õ ¡¡±¾µØ»¯Óë¹ú¼Ê»¯ - L10N ºÍ I18N

·­Ò룺susn @NewSMTH.

4.1 ±àдÊÊÓ¦¹ú¼Ê»¯µÄÓ¦ÓóÌÐò

¡¡¡¡ÎªÁËʹÄãµÄ³ÌÐò¶ÔÓÚʹÓÃÆäËûÓïÑÔµÄÓû§¸ü¼ÓÓÐÓ㬠ÎÒÃÇÏ£ÍûÄãµÄ³ÌÐòÓ¦¸Ã¹ú¼Ê»¯¡£ GNUµÄgcc±àÒëÆ÷ºÍGUI¿â±ÈÈçQT»òÕßGTKµÈͨ¹ý¶Ô×Ö·û´®µÄÌØÊâ´¦ÀíÀ´Ö§³Ö¹ú¼Ê»¯¡£ Éú³ÉÒ»¸öÖ§³Ö¹ú¼Ê»¯µÄ³ÌÐò·Ç³£ÈÝÒס£ ËüʹµÃ·¢²¼ÕߺܿìµÄ°ÑÄãµÄ³ÌÐòÒÆÖ²³ÉÆäËûÓïÑÔ¡£ Çë²Î¿´ÏêϸµÄI18NÎĵµÀ´»ñµÃ¸ü¶àµÄÐÅÏ¢¡£

¡¡¡¡¶Ô±ÈÓëͨ³£µÄÀí½â£¬¼æÈݹú¼Ê»¯µÄ´úÂë·Ç³£ÈÝÒ×±àд¡£ ͨ³££¬ËüÖ»ÐèҪʹÓÃÒ»Ð©ÌØÊâµÄ¹¦Äܺ¯ÊýÀ´°ü×°Ò»ÏÂÄãµÄ×Ö·û´®¡£ ÁíÍ⣬ÇëÈ·ÈÏÖ§³ÖÁË¿í×Ö·û»òÕß¶à×Ö½Ú×Ö·û¡£


4.1.1 ÕûºÏI18N³É¹ûµÄºÅÕÙ

¡¡¡¡ÖµµÃÎÒÃÇ×¢ÒâµÄÊǸ÷¸ö¹ú¼Ò×Ô¼ºµÄI18N/L10N µÄ¹¤×÷ÒѾ­±ä³ÉÁËÖØ¸´±Ë´ËµÄ¹¤×÷¡£ ÎÒÃÇÖеÄÐí¶àÈËÒ»Ö±ÔÚ×ö×ÅÖØ¸´µÄÎÞЧÂʵÄÖØ¸´·¢Ã÷¹¤×÷¡£ ÎÒÃÇÏ£Íû¸÷¸öÖ÷ÒªI18NµÄ×éÖ¯Äܾۼ¯³ÉÒ»¸ö´óµÄ×éÖ¯µ£¸ºÆðÏñ ºËÐÄÍŶÓÒ»ÑùµÄÔðÈΡ£

¡¡¡¡µ±Ç°£¬ÎÒÃÇÏ£Íû£¬µ±ÄãÔÚ±àд»òÕßÒÆÖ²I18N³ÌÐòʱ£¬ Äܹ»·¢²¼¸ø¸÷¸ö¹ú¼ÒÏà¹ØµÄFreeBSDÓʼþÁбí×÷Ϊ²âÊÔ¡£ ½«À´£¬ÎÒÃÇÏ£ÍûÄÜÉú³É¿ÉÒÔÖ±½ÓʹÓø÷ÖÖÓïÑÔµÄÓ¦ÓóÌÐò ¶ø²»ÊÇ»¹Òª×öһЩ»ìÂÒµÄÆÆ½â¡£

¡¡¡¡FreeBSD ¹ú¼Ê»¯ÓʼþÁбí ÒѾ­½¨Á¢¡£Èç¹ûÄãÊÇÒ»¸öI18N/L10NµÄ¿ª·¢Õߣ¬ Çë·¢Ë͸øÎÒÃÇÈκÎÄãÄÜÏëµ½µÄÓëÖ®Ïà¹ØµÄ˵Ã÷£¬Ïë·¨£¬ÎÊÌâµÈµÈ¡£

¡¡¡¡Michael C. Wu ½«»áά»¤I18NµÄ¹¤×÷£¬Ö÷Ò³ÔÚ http://www.FreeBSD.org/~keichii/i18n/index.html¡£ ÇëͬʱÔĶÁBSDCon2000 I18NµÄÓÉClive Lin£¬Chia-Liang KaoºÍMichael C.Wu ÔÚhttp://www.FreeBSD.org/~keichii/papers/ Ìá³öµÄÎÄÕ¡£


4.1.2 Perl ºÍ Python

¡¡¡¡PerlºÍPythonÓµÓÐI18NºÍ´¦Àí¿í×Ö·ûµÄ¿â¡£ÇëʹÓÃËûÃÇÀ´¼æÈÝI18N¡£

¡¡¡¡ÔھɵÄFreeBSD°æ±¾ÖУ¬Perl»á¸ø³öһЩûÓÐÔÚÄãµÄϵͳÖа²×°Á˱¾µØ¿í ×Ö·ûµÄ¾¯¸æ¡£Äã¿ÉÒÔÔÚÄãµÄshellÖÐÉèÖû·¾³±äÁ¿LD_PRELOADΪ /usr/lib/libxpg4.so¡£

¡¡¡¡ÔÚ»ùÓÚshµÄshellÖÐ:

LD_PRELOAD=/usr/lib/libxpg4.so

¡¡¡¡ÔÚ»ùÓÚC-shµÄshellÖÐ:

setenv LD_PRELOAD /usr/lib/libxpg4.so

µÚ5Õ ¡¡Ô´´úÂëÊ÷Ö¸ÄϺÍά»¤·¢Õ¹²ßÂÔ

¹©¸å£ºPoul-Henning Kamp.

¡¡¡¡ÕâÒ»Õ¼ÇÊöÁË FreeBSD Ô´´úÂëÊ÷¸÷ÖÖ¸÷ÑùµÄÖ¸ÄϺÍÓÐЧµÄά»¤·¢Õ¹²ßÂÔ¡£


5.1 Makefile ÖÐµÄ MAINTAINER

¡¡¡¡Èç¹û FreeBSD ·¢²¼µÄijһ²¿·ÖÕýÓÉÒ»¸öÈË»òһȺÈËÀ´Î¬»¤£¬ ËûÃÇ¿ÉÒÔͨ¹ýÔÚÔ´´úÂëÊ÷Öиò¿·ÖµÄ¶¥¼¶Ä¿Â¼ÀïµÄ Makefile ÖÐÌí¼ÓÒ»ÐÐ

MAINTAINER= µç×ÓÐÅÏ䵨ַ
À´°ÑÕâÒ»Çé¿ö¸æËßÈ«ÊÀ½ç¡£ (ÒëÕß×¢£º Ŀǰ src/ µÄά»¤²ßÂÔÒªÇóÈ«²¿´ËÀà˵Ã÷·ÅÔÚ MAINTAINERS Îļþ£¬ ¶ø·ÇÆäËûĿ¼ÖÐµÄ Makefile Àï¡£)

¡¡¡¡¾ßÌåÒâÒåÈçÏÂ:

¡¡¡¡Î¬»¤ÕßÓµÓдúÂë²¢¸ºÔðά»¤´úÂë¡£ ÕâÒâζ×ÅËûÓÐÔðÈÎÐÞÕý´íÎóºÍ»ØÓ¦¹ØÓڸôúÂëµÄÎÊÌⱨ¸æ£» ¶ÔÓÚÀ´×ÔµÚÈý·½µÄÈí¼þ£¬ ά»¤Õß»¹ÓÐÔðÈÎÔÚÊʵ±µÄʱºò¸üÐÂÆä°æ±¾ (ÒëÕß×¢£º ά»¤Õß¿ÉÒÔÊÓµÚÈý·½Èí¼þа汾ÊÇ·ñÒÑÂú×ãÆ·ÖÊÒªÇó¾ö¶¨ÊÇ·ñ¸ú½ø)¡£

¡¡¡¡ÔÚÌá½»¶ÔÓÐά»¤ÕßµÄĿ¼ÖеÄÄÚÈݽøÐиü¸Ä֮ǰ£¬ Ó¦ÏȽ»¸øÎ¬»¤Õ߸´Éó¡£ Ö»ÓдúÂëά»¤ÕßÌ«³¤Ê±¼äûÓлظ´ÓʼþµÄʱºò£¬ ²Å¿ÉÒÔ²»¾­Î¬»¤Õ߸´ÉóÖ±½ÓÌá½»¸Ä¶¯¡£ ¾¡¹ÜÈç´Ë£¬ Ö»Òª¿ÉÄܵϰ£¬ ÈÔÈ»½¨ÒéÄúÕÒÁíÍâһЩÈËÀ´¸´ÉóÏ£Íû½øÐеĸ͝¡£

¡¡¡¡µ±È»£¬ ²»¿ÉÄÜËæÒâÈÃÒ»¸öÈË»òÍÅÌå¼ÓÈëά»¤ÕßµÄÐÐÁУ¬ ÒòΪά»¤Õß±ØÐëͬÒâ³Ðµ£Ïà¹ØµÄÔðÈΡ£ ÁíÒ»·½Ã棬 ά»¤Õß²¢²»Ò»¶¨Ö»ÊÇÒ»¸ö committer£¬ ËüÒ²ÍêÈ«¿ÉÒÔÊÇÒ»¸öÍŶӡ£


5.2 µÚÈý·½Èí¼þ

¹©¸å£ºPoul-Henning Kamp ºÍ David O'Brien. ·­Ò룺Àî öÎ.

¡¡¡¡FreeBSD µÄ·¢ÐаæÖУ¬ ¿ÉÄÜÓÐijЩ²¿·Ö°üº¬ÔÚ FreeBSD ÏîĿ֮Íâ»îÔ¾µØÎ¬»¤×ŵÄÈí¼þ¡£ ÓÉÓÚÀúÊ·Ô­Òò£¬ ÎÒÃǽ«Æä³ÆÎª contributed Èí¼þ¡£ ¾ÙÀý˵À´£¬ ÓÐ sendmail¡¢ gcc ºÍ patch µÈµÈ¡£

¡¡¡¡ÔÚ¹ýÈ¥¼¸ÄêÖУ¬ ÎÒÃdz¢ÊÔÁËÐí¶à²»Í¬µÄ·½·¨À´´¦ÀíÕâÀàÈí¼þ£¬ ÕâЩ·½·¨¶¼¸÷ÓÐÀû±×£¬ Òò¶øÒ²¾ÍûÓÐÃ÷È·µÄʤÕß¡£

¡¡¡¡»ùÓÚÕâÖÖÇé¿ö£¬ ÔÚ¾­ÀúÁËһЩÕù³³Ö®ºó£¬ ÎÒÃÇÑ¡¶¨ÁËÒ»ÖÖ×÷ΪÔÚδÀ´ÒýÈë´ËÀàÈí¼þµÄ ¡°¹Ù·½¡± ×ö·¨¡£ ¸ü½øÒ»²½£¬ ÎÒÃÇÇ¿ÁÒ½¨ÒéÒÑÓеĵÚÈý·½Èí¼þ¶¼Öð½¥¹ý¶Éµ½Ê¹ÓÃÕâÖÖ·½·¨£¬ ÒòΪÓëÏÈǰʹÓõÄ×ö·¨Ïà±È£¬ Ëü¾ßÓÐÊ®·ÖÃ÷ÏÔµÄÓÅÔ½ÐÔ£¬ ÀýÈ磬 È¡µÃÓëÆäËûÈí¼þ×÷Õß (¼´Ê¹Ã»ÓÐÌṩ cvs ·ÃÎÊȨ) ¡°¹Ù·½¡± °æ±¾Ö®¼äµÄ²îÒì»á¸üÈÝÒ×£¬ µÈµÈ¡£ Õâ»áʹµÃ½«ÐÞÕýÄÚÈÝ»ØÀ¡¸øµÚÈý·½Èí¼þµÄÖ÷Òª¿ª·¢Õß±äµÃ·Ç³£ÈÝÒס£

¡¡¡¡µ±È»£¬ ×îÖÕÕâЩ·½·¨ÊÇÐèÒªÓɾßÌåµÄÈËÀ´ÂäʵµÄ¡£ Èç¹ûÕâһģʽʮ·Ö²»ÊÊÓÚij¸ö¾ßÌåµÄÈí¼þ°ü£¬ ÔòÔڵõ½ core team ÒÔ¼°ÆäËû¿ª·¢ÕßÈϿɵÄǰÌáÏ£¬ ¿ÉÒÔÊʵ±µØ½øÐÐÀýÍâ´¦Àí¡£ ÊÇ·ñÄܹ»³ÖÐøÎ¬»¤µÚÈý·½Èí¼þ°ü£¬ ÔòÊǽøÐÐÕâÀà¾ö²ßµÄ¹Ø¼üÒòËØ¡£

×¢Òâ: ÓÉÓÚ RCS Îļþ¸ñʽÒÔ¼° CVS ʹÓà vendor ·Ö֧ʱµÄһЩ²»µ±Éè¼Æ£¬ ¶ÔÓÚÄÇЩÈÔ´¦ÓÚ vendor ·ÖÖ§µÄÎļþÊÇ Ç¿ÁÒ½¨Òé²»Òª ½øÐÐÈκÎС¹æÄ£µÄÒÔ¼°¶Ô´úÂëÐÞÊÎÐÔÐ޸ĵġ£ ÀàËÆ ¡°Æ´Ð´´íÎó¡± ÕâÑùµÄÎÊÌ⣬ ¾ÍÊôÓÚÇ°ÃæÌáµ½µÄ ¡°ÐÞÊÎÐÔ¡± ÐÞ¸ÄÒ»À࣬ Òò´Ë¶ÔÄÇЩ°æ±¾ºÅΪ 1.1.x.x µÄÎļþ£¬ Ó¦¸Ã¾¡Ò»ÇпÉÄܱÜÃâ¡£ ²»Ç¡µ±µØÐÞ¸ÄÒ»¸ö×Ö·û£¬ ¶¼ÓпÉÄÜ»áʹ´úÂë¿â²úÉúÑÏÖØµÄÅòÕÍ¡£

¡¡¡¡½ÓÏÂÀ´½«ÀûÓÃǶÈëʽÓïÑÔ Tcl À´Õ¹Ê¾Ç°ÃæËùÌáµ½µÄÕâÖÖģʽÈçºÎÔË×÷£º

¡¡¡¡src/contrib/tcl Ŀ¼Öаüº¬ÁËÓÉÈí¼þ°ü×÷Õß·¢²¼µÄ´úÂë¡£ ÍêÈ«²»ÊÊÓÚ FreeBSD µÄÄÇЩ²¿·Ö¿ÉÒÔÍêȫɾȥ¡£ ¶ÔÓÚ Tcl ¶øÑÔ£¬ ÔÚµ¼Èë֮ǰ¾Í¿ÉÒÔɾȥ mac¡¢ win ÒÔ¼° compat ÕâЩ×ÓĿ¼ÁË¡£

¡¡¡¡src/lib/libtcl ÖÐÖ»°üº¬ bmake ·ç¸ñµÄ Makefile£¬ ËüʹÓñê×¼µÄ bsd.lib.mk makefile ¹æÔòÀ´Éú³É¿âÎļþ£¬ ²¢°²×°Îĵµ¡£

¡¡¡¡src/usr.bin/tclsh ÖÐÖ»°üº¬Ê¹Óñê×¼µÄ bsd.prog.mk ¹æÔò£¬ ÓÃÓÚÉú³ÉºÍ°²×° tclsh ³ÌÐò¼°ÆäËù¹ØÁªµÄÁª»úÊÖ²áµÄ bmake ·ç¸ñµÄ Makefile¡£

¡¡¡¡src/tools/tools/tcl_bmake Öаüº¬Ò»×é shell-½Å±¾£¬ ÕâЩ½Å±¾¿ÉÒÔÓÃÓÚ°ïÖúÈËÃǸüРtcl Èí¼þ¡£ ÕâÑùµÄ½Å±¾²¢²»×÷ΪÈí¼þ¹¹½¨»ò°²×°¹ý³ÌµÄ×é³É²¿·Ö¡£

¡¡¡¡½ÓÏÂÀ´µÄÖØÒª×¢ÒâÊÂÏî¾ÍÊÇ£¬ src/contrib/tcl Ŀ¼Êǰ´ÕÕÒÔÏµĹæÔò´´½¨µÄ£º Õâ¸öĿ¼ÖеÄÔ´´úÂëÓ¦ÓëÆä×÷Õß·¢²¼µÄÐÎʽ±£³ÖÒ»Ö (ͨ¹ýÊʵ±Ê¹Óà CVS µÄ vendor-·ÖÖ§£¬ ²¢¹Ø±Õ RCS ¹Ø¼ü×ÖÀ©Õ¹)£¬ Ö»¼ÓÈ뾡¿ÉÄÜÉÙµÄרÓÃÓÚ FreeBSD µÄ¸Ä¶¯¡£ Èç¹û¶Ô´ËÓÐÈκÎÒÉÎÊ£¬ ÔòÒ»¶¨ÒªÏÈѯÎÊÒ»ÏÂÓо­ÑéµÄÈË£¬ ¶ø²»ÒªÔÚ¶ÔËüÄÜ ¡°Õý³£ÔËת¡± µÄÆÚÍûÖÐÖý³É´ó´í¡£ CVS ±¾Éí²¢²»ÄܺöÂÔÓÉÓÚµ¼ÈëʱµÄÊèºöÒý·¢µÄʹʣ¬ ¶ø»ØÍËÕâÖÖÎÊÌ⣬ ¸üÊÇÐèÒª´óÁ¿µÄ¶îÍâ²Ù×÷²ÅÄÜ×öµ½¡£

¡¡¡¡ÓÉÓÚÇ°ÃæÌáµ½µÄÄÇЩ¹ØÓÚ CVS µÄ vendor ·ÖÖ§Éè¼ÆµÄÖÆÔ¼£¬ ÎÒÃÇÒªÇóÀ´×ÔÈí¼þÔ­×÷ÕßµÄ ¡°¹Ù·½¡± ²¹¶¡£¬ ±ØÐëÊ×ÏÈ´òÔÚÆä·Ö·¢µÄÔ´´úÂëÖ®ÉÏ£¬ È»ºóÔÙ½«Ð޸ĹýµÄ´úÂëÖØÐµ¼Èëµ½ vendor ·ÖÖ§¡£ ¹Ù·½²¹¶¡ÔÚÈκÎʱºò£¬ ¶¼²»Ó¦Ö±½ÓÓ¦ÓÃÓÚ´Ó FreeBSD Ô´´úÂë¿â¼ì³öµÄÔ´´úÂ룬 ²¢Ö´ÐÐ ¡°commit¡± ²Ù×÷£¬ ÒòΪÕâ»áÆÆ»µ vendor ·ÖÖ§µÄÒ»ÖÂÐÔ£¬ ²¢ÇÒ£¬ ÓÉÓÚÕâÑùµÄ²Ù×÷»áµ¼Ö²úÉúÐ޸ijåÍ»£¬ »á¸øÎ´À´µ¼ÈëаæÊ±´øÀ´Âé·³¡£

¡¡¡¡ÓÉÓÚÐí¶àÈí¼þ°ü¿ÉÄÜ»á°üº¬ÓÃÓÚ FreeBSD ÒÔÍâµÄÌåϵ½á¹¹ºÍ»·¾³µÄÎļþ£¬ ÎÒÃÇÔÊÐíÔÚµ¼Èëǰ´Ó¹Ù·½·¢ÐеĴúÂëÖÐɾȥÄÇЩ¶Ô FreeBSD ÎÞÓõIJ¿·Ö£¬ ÒÔÆÚ½ÚÊ¡´ÅÅ̿ռ䡣 °üº¬°æÈ¨ÉùÃ÷ºÍ·¢ÐÐ˵Ã÷£¬ ÒÔ¼°ÆäËûÀàËÆµÄÓÃÓÚ˵Ã÷ÆäËûÎļþµÄÎĵµ£¬ Ôò ²» Ӧɾ³ý¡£

¡¡¡¡Èç¹û·½±ãµÄ»°£¬ Ó¦¾¡¿ÉÄÜʹÓÃʹÓÃijЩ¹¤¾ßÉú³ÉµÄ bmake Makefile Îļþ£¬ ÕâЩ¹¤¾ß¿ÉÒÔʹÉý¼¶µ½Î´À´µÄа汾ʱµÄ¹¤×÷±äµÃ¼òµ¥¡£ Èç¹ûÄúÍê³ÉÁËÕâÀ๤×÷£¬ ÇëÎñ±Ø½«ÕâЩ¹¤¾ß (Èç¹ûÐèÒªµÄ»°) ·Åµ½ src/tools Ŀ¼ÖÐÓëÄúËùÒÆÖ²µÄ³ÌÐò¶ÔÓ¦µÄĿ¼ÖУ¬ ÒÔ±ãΪ½«À´µÄά»¤ÕßËùÀûÓá£

¡¡¡¡ÔÚ src/contrib/tcl µÄ¶¥¼¶Ä¿Â¼ÖУ¬ Ó¦Ôö¼ÓÒ»¸öÃûΪ FREEBSD-upgrade µÄÎļþ£¬ ÔÚÆäÖÐ˵Ã÷һЩÀàËÆÏÂÃæµÄÄÚÈÝ£º

  • ɾȥÁËÄÄЩÎļþ¡£

  • ´ÓºÎ´¦¿ÉÒÔ»ñµÃԭʼµÄ·¢Ðа汾£¬ ÒÔ¼°¹Ù·½ÍøÕ¾¡£

  • Èç¹ûÓв¹¶¡£¬ Ó¦ÈçºÎ·´À¡¸øÔ­×÷Õß¡£

  • Èç¹ûÐèÒªµÄ»°£¬ ¶Ô FreeBSD-רÓÐ ¸Ä¶¯µÄ¸ÅҪ˵Ã÷¡£

¡¡¡¡²»¹ý£¬ Çë²»Òª½« FREEBSD-upgrade ËæµÚÈý·½Èí¼þµÄÔ´´úÂëһͬµ¼Èë¡£ Ïà·´£¬ ÄúÓ¦ÔÚ×î³õµÄ import ²Ù×÷Ö®ºóÓà cvs add FREEBSD-upgrade ; cvs ci À´Íê³ÉÕâÒ»¹¤×÷¡£ ÔÚ src/contrib/cpio ÖУ¬ Õâ¸öÎļþµÄÄÚÈÝÈçÏ£º

This directory contains virgin sources of the original distribution files
on a "vendor" branch.  Do not, under any circumstances, attempt to upgrade
the files in this directory via patches and a cvs commit.  New versions or
official-patch versions must be imported.  Please remember to import with
"-ko" to prevent CVS from corrupting any vendor RCS Ids.

For the import of GNU cpio 2.4.2, the following files were removed:

        INSTALL         cpio.info       mkdir.c             
        Makefile.in     cpio.texi       mkinstalldirs

To upgrade to a newer version of cpio, when it is available:
        1. Unpack the new version into an empty directory.
           [Do not make ANY changes to the files.]

        2. Remove the files listed above and any others that don't apply to
           FreeBSD.

        3. Use the command:
                cvs import -ko -m 'Virgin import of GNU cpio v<version>' \
                        src/contrib/cpio GNU cpio_<version>

           For example, to do the import of version 2.4.2, I typed:
                cvs import -ko -m 'Virgin import of GNU v2.4.2' \
                        src/contrib/cpio GNU cpio_2_4_2

        4. Follow the instructions printed out in step 3 to resolve any
           conflicts between local FreeBSD changes and the newer version.

Do not, under any circumstances, deviate from this procedure.

To make local changes to cpio, simply patch and commit to the main
branch (aka HEAD).  Never make local changes on the GNU branch.

All local changes should be submitted to "cpio@gnu.ai.mit.edu" for
inclusion in the next vendor release.

obrien@FreeBSD.org - 30 March 1997

5.3 ·Á°­Ð﵀ (Encumbered) Îļþ

¡¡¡¡Å¼¶û¿ÉÄÜ»áÐèÒªÔÚ FreeBSD Ô´´úÂëÊ÷Éϰüº¬Ä³Ð©·Á°­ÐÔµÄÎļþ¡£ ÀýÈ磬 Èç¹ûij¸öÉ豸ÐèÒªÊ×ÏȼÓÔØÒ»Ð¡¶Î¶þ½øÖÆ´úÂë²ÅÄÜÕý³£¹¤×÷£¬ ¶øÎÒÃDz¢Ã»ÓÐÕâЩ´úÂëµÄÔ´Îļþ£¬ ÔòÕâ¸ö¶þ½øÖÆÎļþ¾Í±»ÈÏΪÊÇ·Á°­ÐԵġ£ ÔÚ FreeBSD Ô´ÂëÊ÷ÉÏÒýÈëÕâÀà·Á°­ÐÔÎļþʱµÄ¹æÔòÈçÏ¡£

  1. ÓÉϵͳ CPU ½âÊÍ»òÖ´ÐеÄÈκÎÒÔ·ÇÔ´´úÂë¸ñʽ±£´æµÄÎļþ£¬ ¶¼±»ÈÏΪÊÇ·Á°­ÐԵġ£

  2. ÊÚȨÏÞÖÆ¶àÓÚ BSD »ò GNU µÄÈκÎÎļþ¶¼ÊÇ·Á°­ÐԵġ£

  3. ³ý·ÇÊÊÓà (1) »ò (2) Ìõ¿î£¬ °üº¬¿ÉÒÔÏÂÔØµ½Ó²¼þÉ豸µÄÎļþ²¢²»±»ÈÏΪÊÇ·Á°­ÐԵġ£ ÕâЩÎļþ±ØÐë±£´æÎªÆ½Ì¨ÖÐÁ¢µÄ ASCII ¸ñʽ (ÍÆ¼öʹÓà file2c »ò uuencode À´½øÐбàÂë)¡£

  4. ·Á°­ÐÔµÄÎļþ£¬ ÔÚ¼ÓÈëµ½ CVS ´úÂë¿â֮ǰ£¬ ±ØÐë»ñµÃ ºËÐÄС×é µÄÃ÷ʾÅú×¼¡£

  5. ·Á°­ÐÔÎļþÓ¦ÖÃÓÚ src/contrib »ò src/sys/contrib¡£

  6. Ó¦±£³ÖÄ£¿éµÄÕûÌåÐÔ¡£ ³ý·ÇÔÚ·Ç·Á°­ÐÔ´úÂëÖ®¼ä´æÔÚ´úÂ븴Ó㬠·ñÔò²»Ó¦½«Æä¸îÁÑ¿ªÀ´¡£

  7. Ô¤±àÒëµÄÄ¿±êÎļþ£¬ Ó¦ÃüÃûΪ Ìåϵ½á¹¹Ãû/ÎļþÃû.o.uu¡£

  8. ÄÚºËÎļþ£º

    1. ¶¼Ó¦ÔÚ conf/files.* ÖмÓÒÔÒýÓà (ÒÔ¼ò»¯¹¹½¨¹ý³Ì)¡£

    2. ¶¼Ó¦×÷Ϊ LINT µÄÒ»²¿·Ö£¬ µ« ºËÐÄС×é ¿ÉÒÔ¸ù¾Ý¸ö°¸¾ö¶¨ÊÇ·ñ½«Æä×¢Ê͵ô¡£ ´ËÍ⣬ ºËÐÄС×é ¿ÉÒÔÔÚÉÔºó¸Ä±äÕâЩ¾ö¶¨¡£

    3. Õýʽ·¢Ðй¤³Ìʦ (Release Engineer) ÓÐȨ¾ö¶¨ÊÇ·ñÔÊÐíÕâЩÎļþ½øÈëÕýʽµÄ·¢Ðа汾¡£

  9. Óû§¼¶Îļþ£º

    1. ºËÐÄС×é ÓÐȨ¾ö¶¨ÕâЩ´úÂëÊÇ·ñÓ¦³ÉΪ make world µÄÒ»²¿·Ö¡£

    2. Õýʽ·¢Ðй¤³Ìʦ ÓÐȨ¾ö¶¨ÕâЩ´úÂëÊÇ·ñÄܽøÈëÕýʽ·¢Ðа档


5.4 ¹²Ïí¿â

¹©¸å£ºÇ³¼û ÏÍ¡¢ Peter Wemm ºÍ David O'Brien. ·­Ò룺CnYouker.

¡¡¡¡Èç¹ûÄãÏëÌí¼Ó¹²Ïí¿âÖ§³Öµ½Ò»¸öÔ­À´²»°üº¬¹²Ïí¿âÖ§³ÖµÄ port »òÊÇÆäËüÈí¼þ£¬ ¹²Ïí¿âµÄ°æ±¾ºÅÓ¦¸Ã×ñÑ­ÈçϹæÔò¡£Í¨³£À´Ëµ£¬Óɴ˵óöµÄÊý×ÖÓëÈí¼þµÄ·¢Ðа汾Î޹ء£

¡¡¡¡½¨Á¢¹²Ïí¿âµÄÈý¸öÔ­ÔòÊÇ£º

  • ´Ó1.0¿ªÊ¼

  • Èç¹û¸Ä¶¯ÓëÒÔǰ°æ±¾Ïà¼æÈÝ£¬Ôö¼Ó¸±°æ±¾ºÅ£¨×¢Ò⣬ELFϵͳºöÂÔ¸±°æ±¾ºÅ£©¡£

  • Èç¹ûÊǸö²»¼æÈݵĸ͝£¬Ôö¼ÓÖ÷°æ±¾ºÅ¡£

¡¡¡¡ÀýÈ磬Ìí¼Óº¯ÊýºÍÐÞÕý´íÎóµ¼Ö¸±°æ±¾ºÅÔö¼Ó£¬ ¶øÉ¾³ýº¯Êý¡¢º¯Êýµ÷ÓÃÓï·¨¸Ä±äµÈ£¬»áÆÈʹÖ÷°æ±¾ºÅ¸Ä±ä¡£

¡¡¡¡±£³ÖÕâÖÖÐÎʽµÄ°æ±¾ºÅ£ºÖ÷°æ±¾ºÅ.¸±°æ±¾ºÅ (x.y)¡£ ÎÒÃÇµÄ a.out ¶¯Ì¬Á´½ÓÆ÷²»ÄܺܺõĴ¦Àí x.y.z ÐÎʽµÄ°æ±¾ºÅ¡£ÔڱȽϹ²Ïí¿â°æ±¾ºÅÒÔ¾ö¶¨¸úÄĸö¿âÎļþÁ´½ÓµÄʱºò£¬ ÈκÎyÒÔºóµÄ°æ±¾ºÅ(ÄÇÊÇÖ¸µÚÈý¸öÊý×Ö) ×ÜÊǻᱻºöÂÔ¡£ Èç¹û¸ø¶¨µÄÁ½¸ö¹²Ïí¿âµÄ²»Í¬ÔÚÓÚ¡°Ï¸Î¢¡±°æ±¾ (¡°micro¡± revision)µÄ»°£¬ ld.so½«»áÓë½Ï¸ßÐÞ¶©°æ±¾µÄÁ´½Ó¡£¼´£¬Èç¹ûÄãÒªÓë libfoo.so.3.3.3Á´½Ó£¬Á´½ÓÆ÷Ö»ÔÚ(ELFÎļþµÄ)Í·²¿¼Ç¼ 3.3, ²¢ÇÒÔÚÁ¬½Óʱ£¬ÓëÎļþÃûÒÔ libfoo.so.3.(ÈκÎÊý×Ö >= 3).(ÏÖÓеÄ×î¸ßÊý×Ö) ¿ªÍ·µÄÈκÎÎļþÁ´½Ó¡£

×¢Òâ: ld.so ×ÜÊÇ»áʹÓà ¡°¸±¡±°æ±¾ºÅ×î¸ßµÄ¡£ÀýÈ磬¼´Ê¹Ò»¸ö³ÌÐò×î³õÊÇ(±»É趨)Óë libc.so.2.0Á´½ÓµÄ£¬ ld.soÒ²»áÓÅÏÈÑ¡ÔñʹÓà libc.so.2.2£¬¶ø²»ÊÇ libc.so.2.0¡£

¡¡¡¡ÁíÍ⣬ÎÒÃÇµÄ ELF ¶¯Ì¬Á´½ÓÆ÷ÍêÈ«²»´¦Àí¸±°æ±¾ºÅ¡£ ¿ÉÎÒÃÇ»¹ÊÇÓ¦¸ÃÖ¸¶¨Ò»¸öÖ÷°æ±¾ºÅºÍ¸±°æ±¾ºÅ£¬ÒòΪÎÒÃÇµÄ Makefile »á°´ÏµÍ³ÀàÐÍ¡°×öÕýÈ·µÄÊ¡±¡£

¡¡¡¡¶ÔÓÚ²»ÊôÓÚij¸ö port µÄ¿âÎļþ£¬ÎÒÃǵÄÔ­ÔòÊÇÔÚ¸÷¸ö FreeBSD Õýʽ·¢Ðаæ (RELEASE)Ö®¼äÖ»¸Ä±äÒ»´Î¹²Ïí¿â°æ±¾ºÅ(ÒëÕß×¢£ºÒ»°ãÖ»ÊǸ±°æ±¾ºÅ)¡£ ²¢ÇÒ£¬ÔÚ FreeBSD Õýʽ·¢Ðаæ (RELEASE) Ö÷°æ±¾Ö®¼ä(ÄÇÊÇÖ¸Ïñ´Ó 3.x µ½ 4.x)£¬ Ò²Ó¦¸Ã½ö¸Ä±äÒ»´Î¹²Ïí¿âÖ÷°æ±¾ºÅ¡£ µ±ÄãÐèÒª¶Ôϵͳ¿â×öһЩ¸Ä±ä²¢ÒªÔö¼Ó°æ±¾ºÅʱ£¬ Çë²é¿´ MakefileµÄCVSÌá½»ÈÕÖ¾¡£ ÕâÊÇ committer µÄÔðÈΣºÈ·±£×Ô(×î½üµÄ)Õýʽ·¢Ðаæ (RELEASE) Ö®ºóÖ»ÓеÚÒ»´ÎÕâÑùµÄ¸Ä¶¯»áÈÃÔÚ Makefile ÀïµÄ¹²Ïí¿â°æ±¾ºÅ¸üУ¬ ¶øËæºóµÄ(ÔÚÏÂÒ»¸ö RELEASE ֮ǰµÄ)¸Ä¶¯²»»áʹ¹²Ïí¿â°æ±¾ºÅ¸üС£


µÚ6Õ ¡¡»Ø¹éÓëÐÔÄܲâÊÔ

·­Ò룺Jokhva.

¡¡¡¡»Ø¹é²âÊÔͨ³£ÓÃÀ´¼ì²âϵͳÖеÄÌØ¶¨²¿·ÖÊÇ·ñÈçÆÚ¹¤×÷£¬ ²¢ÇÒҪȷ¶¨¾ÉµÄ´íÎóûÓÐÖØÐ³öÏÖ¡£

¡¡¡¡FreeBSD µÄ»Ø¹é²âÊÔ¹¤¾ßÄܹ»ÔÚ FreeBSD µÄÔ´´úÂëÊ÷ src/tools/regression ÖÐÕÒµ½¡£


6.1. ΢ÐÔÄܲâÊÔÁбí

ÕâÒ»Õ°üº¬ÁËһЩÔÚ FreeBSD ÉÏ»òÕß FreeBSD ×ÔÉí×öÊʺϵÄ΢ÐÔÄܲâÊԵĽ¨Òé¡£

ÒªÔÚÿһ´Îµ¥¶ÀµÄ²âÊÔµÄʱºòʹÓÃËùÓÐÎÒÃǸø³öµÄ½¨ÒéÊDz»¿ÉÄܵġ£ µ«ÊÇÄãÓõÃÔ½¶à£¬Äã²âÊÔС²î±ðµÄÄÜÁ¦¾Í»áÔ½ºÃ¡£

  • ¹Ø±Õ APM ºÍÈÎºÎÆäËû¸ÉÈÅʱÖӵĶ«Î÷ (ACPI ?)¡£

  • ½øÈëµ¥Óû§Ä£Ê½¡£ÀýÈ磬cron(8) ºÍÆäËûµÄÊØ»¤½ø³ÌÖ»»áÔö¼Ó²âÊԵIJ»×¼È·ÐÔ¡£sshd(8) Õâ¸öÊØ»¤½ø³ÌÒ²»áÔì³ÉÎÊÌâ¡£Èç¹ûÔÚ²âÊÔµÄʱºòÐèÒª ssh Á¬½Ó£¬ ÄÇôÄã»òÕß¹Ø±Õ SSHv1 µÄÃܳ×ÔÙÉú¹¦ÄÜ£¬»òÕßÔÚ²âÊÔµÄʱºòɱËÀ sshd ¸¸½ø³Ì¡£

  • ²»ÒªÔËÐÐ ntpd(8)¡£

  • Èç¹ûÓÐ syslog(3) ʼþ·¢Éú£¬Ê¹ÓÃÒ»¸ö¿Õ°×µÄ /etc/syslogd.conf ÔËÐÐ syslogd(8)£¬ »òÕߣ¬²»ÒªÔËÐÐËü¡£

  • ×îС»¯´ÅÅÌ I/O£¬¿ÉÄܵϰ£¬ÒªÍêÈ«±ÜÃâ¡£

  • ²»Òª¹ÒÔØ²»±ØÒªµÄÎļþϵͳ¡£

  • ¿ÉÄܵϰ£¬°Ñ /£¬ /usr£¬ ºÍÆäËûÈκÎÎļþ¹ÒÔØÎªÖ»¶Á¡£ ÕâÑùµÄ»°¿ÉÒÔ´Ó I/O ·½ÃæÈ¥µôµ½´ÅÅ̵ÄÒì²½¸üÐÂ(µÈµÈ)¡£

  • ʹÓà newfs(8) À´Éú³ÉÒª²âÊÔ¶ÁдµÄÎļþϵͳ¡£ ÔÚÿ´Î²âÊÔÔËÐÐǰʹÓà tar(1) »òÕß dump(8) ¸ø²âÊÔÎļþϵͳ¹àÊäÎļþ¡£²âÊÔ¿ªÊ¼Ç°ÏÈÐ¶ÔØÎļþϵͳ£¬ È»ºóÔÙ¹ÒÔØ¡£ÕâÑù×öµÄ»°Äܵõ½Ò»¸öÁ¬ÐøµÄÎļþϵͳ¸ñ¾Ö¡£ ¶ÔÓÚ¾­µä²âÊÔ£¬ÎÒÃÇÒª²âÊÔµÄĿ¼ÊÇ /usr/obj(Óà newfs ÖØÐ³õʼ»¯£¬È»ºóÔÙ¹ÒÔØ)¡£ Òª»ñµÃ 100% µÄÔÙÏÖ£¬ÇëʹÓà dd(1) ²úÉúµÄÎļþÀ´¹àÊäÎļþϵͳ¡£(Ò²¾ÍÊÇ£º dd if=myimage of=/dev/ad0s1h bs=1m)

  • ʹÓûùÓÚ malloc µÄ»òÕßÔ¤ÏÈ×°ÔØµÄ md(4) ·ÖÇø¡£

  • ²âÊÔµÄÿ´Îµ¥¶Àµü´úÖ®¼äÖØÆôϵͳ¡£ Õâ¿ÉÒÔ¸øÄãÒ»¸ö¸üÁ¬ÐøµÄ״̬¡£

  • ´ÓÄÚºËÖÐÈ¥µôËùÓв»ÖØÒªµÄÉ豸Çý¶¯¡£ÀýÈ磬Èç¹û²âÊÔ²»ÐèÒª USB£¬ ÄÇô¾Í²»Òª°Ñ USB ·Åµ½ÄÚºËÖС£Çý¶¯¼ÓÔØ¾­³£»á²úÉúÑÓʱ¡£

  • ²»ÒªÅäÖò»Ê¹ÓõÄÓ²¼þ¡£Èç¹û²âÊÔ²»Ê¹ÓÃÓ²ÅÌ£¬Ê¹Óà atacontrol(8) ºÍ camcontrol(8) È¥µôÓ²ÅÌ¡£

  • ³ý·Ç±ØÒª£¬·ñÔò²»ÒªÅäÖÃÍøÂ磬 »òÕߵȵ½²âÊÔÍêÒª°Ñ²âÊÔ½á¹û´«Êäµ½Áíһ̨»úÆ÷µÄʱºòÔÙÆô¶¯ÍøÂç¡£

    Èç¹ûϵͳ±ØÐëÁ¬½Óµ½¹«¹²ÍøÂ磬һ¶¨Òª×¢Òâ¹ã²¥Êý¾Ý¡£ ¼´Ê¹ÕâЩÊý¾ÝºÜÄѱ»×¢Òâµ½£¬Ò²»áÕ¼Óà CPU µÄʱÖÓÖÜÆÚ¡£ ×é²¥Ò²ÓÐÀàËÆµÄÇé¿ö¡£

  • °Ñÿһ¸öÎļþϵͳ·Åµ½Ëü×Ô¼ºµÄÓ²ÅÌÉÏ¡£ Õâ¿ÉÒÔ×îС»¯´ÅÅ̵ĴÅÍ·ËÑË÷ÓÅ»¯µÄ¶¶¶¯¡£

  • ¾¡Á¿¼õÉٰѽá¹ûÊä³öµ½´®¿Ú»ò VGA ¿ØÖÆÌ¨¡£ ½«½á¹ûµ¼ÈëÎļþ¿ÉÒÔ¼õÉÙÕ𶯸ÉÈÅ¡£ (´®¿ÚÖն˺ÜÈÝÒ×±ä³ÉÒ»¸öÆ¿¾±¡£) ÔÚ²âÊÔµÄʱºò²»Òª´¥Åö¼üÅÌ£¬ÉõÖÁspace »ò back-space ¼üÒ²»áÒÔÊý×ÖÐÎʽÏÔʾ³öÀ´¡£

  • È·ÈÏÄãµÄ²âÊÔ×ã¹»³¤£¬ µ«²»ÊÇÌ«³¤¡£ Èç¹û²âÊÔÌ«¶Ì£¬ ¾ÍÎÞ·¨ºöÂÔʱ¼ä´ÁµÄÎó²îÓ°Ï죬 ¶øÈç¹ûÌ«³¤£¬ ζȵı仯»áÓ°Ïì¼ÆËã»úÄÚµÄʯӢ¾§ÌåµÄƵÂÊ¡£ ¾­ÑéÖµ£º ¶àÓÚÒ»·ÖÖÓ£¬ ÉÙÓÚÒ»¸öСʱ¡£

  • ¾¡Á¿±£Ö¤»úÆ÷ËùÔÚ»·¾³µÄζȺ㶨¡£ Õâ»áͬʱӰÏìʯӢ¾§ÌåºÍ´ÅÅÌÇý¶¯Æ÷µÄËã·¨¡£ ÒªµÃµ½Îȶ¨µÄʱÖÓ£¬¿ÉÒÔ¿¼ÂÇʹÓà Îȶ¨Ê±ÖÓ×¢Èë(stabilized clock injection)¡£ÀýÈ磬ʹÓà OCXO + PLL£¬ °Ñ²âÊÔ½á¹û×¢ÈëʱÖӵ緶ø²»ÊÇÖ÷°åÉϵÄxtal¡£ ÒªÁ˽â¸ü¶à£¬ÇëÁªÏµ Poul-Henning Kamp ¡£

  • ²âÊÔÖÁÉÙÒªÔËÐÐÈý´Î¡£µ«ÊǶÔÓÚ ¡°²âÊÔǰ¡± ºÍ ¡°²âÊÔºó¡± µÄ´úÂ룬×îºÃ·Ö±ð¶¼ÔËÐжþÊ®´ÎÒÔÉÏ¡£ ¾¡¿ÉÄܽ»´íÖ´ÐвâÊÔ£¬ÕâÑù¿ÉÒÔÕì²â²âÊÔ»·¾³¶Ô²âÊÔµÄÓ°Ïì¡£ ²»Òª 1£º1 µÄ½»´í£¬Òª 3£º3 µÄ½»´í£¬ ÕâÑù¾Í¿ÉÒÔ¼ì²âÈË»ú½»»¥¶Ô²âÊÔµÄÓ°Ïì¡£

    ºÃµÄÀàÐÍ£¬±ÈÈ磺bababa{bbbaaa}*£¬ ¿ÉÒÔÔÚ 1+1 µÄÔËÐÐºó¸ø³öһЩÌáʾ£¨ÔÚ²âÊÔ³ö´íʱ¿ÉÒÔÍ£Ö¹²âÊÔ£©£¬ ÒÔ¼°ÔÚÊ×´Î 3+3 ÔËÐкóµÄ±ê×¼²î£¨Èç¹û²âÊÔʱ¼ä½Ï³¤¿ÉÒÔ¸ø³öһЩ£©£¬ ºÍ²âÊÔÔËÐеÄÇ÷ÊÆÓëÉÔºóһЩ½»»¥Êý×Ö¡£

  • ʹÓà usr/src/tools/tools/ministat À´²é¿´Êý×ÖÊÇ·ñÖØÒª¡£Äã¿ÉÒÔÂòÒ»±¾ ¡°Cartoon guide to statistics¡± ISBN: 0062731025£¬¸ß¶ÈÍÆ¼ö£¬ Èç¹ûÄãÒѾ­Íü¼Ç»òÕ߸ù±¾²»ÖªµÀ±ê×¼²îºÍ Student's T ²âÊÔ¡£

  • ²»ÒªÊ¹Óúǫ́ fsck(8) ³ý·ÇÄãÊÇÔÚ¶Ôºǫ́ fsck½øÐÐ benchmark¡£Í¬Ê±£¬ÔÚ /etc/rc.conf ÖÐ¹Ø±Õ background_fsck£¬³ý·ÇÔÚϵͳÆð¶¯ºó£¬ ÄãµÄ benchmark ÔÚ fsck ÔËÐÐ 60+ ÃëºóÈÔȻû¿ªÊ¼¡£ ÒòΪһµ©¿ªÆôÁ˺ǫ́ fsck£¬rc(8) »á°Ñ fsck »½ÐѲ¢¼ì²éÊÇ·ñÒªÔÚÎļþϵͳÉÏÔËÐÐÖ®¡£ ÀàËÆµÄ£¬³ý·ÇÄãµÄ²âÊÔ¶ÔÏó°üÀ¨ snapshots£¬ ¾ÍҪȷ¶¨ÏµÍ³ÖÐûÓÐÈκΠsnapshots¡£

  • Èç¹ûÄãµÄ benchmark ÓÐÔ¤ÆÚÖ®ÍâµÄÐÔÄܵÍÏÂÎÊÌ⣬ ¾ÍÒª¼ì²âÓÐûÓÐÀ´×Ôδ֪ϵͳ×ÊÔ´µÄ¸ßƵÂÊÖжϡ£ ÓÐһЩ°æ±¾µÄ ACPI ¾ÍÓÐ ¡°ÔËÐлìÂÒ¡± µÄÎÊÌ⣬²¢ÇÒ»á²úÉú¹ý¶àµÄÖжϡ£ ÒªÕï¶ÏÆæ¹ÖµÄ²âÊÔ½á¹û£¬¿ÉÒÔץһЩ vmstat -i µÄƬ¶ÎÈ»ºó²é¿´ÊÇ·ñÓв»Õý³£µÄÏÖÏó¡£

  • Òª½÷É÷¶Ô´ýÄں˺ÍÓû§¿Õ¼äµÄÓÅ»¯²ÎÊý£¬¶ÔÓÚµ÷ÊÔÒ²ÊÇÕâÑù¡£ ÒòΪºÜÈÝÒ׾ͻáºöÂÔһЩ¶«Î÷£¬ È»ºó²Å»áÒâʶµ½²âÊÔ²»ÄÜÓÃÀ´±È½ÏͬÑùµÄÊÂÇé¡£

  • ³ý·ÇÄãµÄ²âÊÔ¶ÔÄں˲ÎÊý WITNESS ºÍ INVARIANTS ÓÐÐËȤ£¬·ñÔò²»ÒªÔÚ¿ªÆôÁËÕâЩÄں˲ÎÊýºó½øÐÐÄãµÄ benchmark¡£ WITNESS »áµ¼Ö 400%+ µÄÐÔÄÜËðʧ¡£ ÀàËÆµÄ£¬Óû§Ì¬µÄ malloc(3) ²ÎÊýÔÚ -CURRENT °æ±¾ºÍÉú²ú°æ±¾ÖÐĬÈÏÖµ¶¼ÊDz»Í¬µÄ¡£

µÚII²¿·Ö. ½ø³Ì¼äͨÐÅ

Ŀ¼
µÚ7Õ¡¡Ì×½Ó×Ö
µÚ8Õ¡¡IPv6ÄÚ²¿

µÚ7Õ ¡¡Ì×½Ó×Ö

¹©¸å£ºG. Adam Stanislav. ·­Ò룺intron@intron.ac.

7.1 ¸ÅÊö

¡¡¡¡BSD Ì×½Ó×Ö(socket)½«½ø³Ì¼äͨÐÅÍÆµ½Ò»¸öеÄˮƽ¡£ ±Ë´ËͨÐŵĽø³Ì¿É²»ÔÙ±ØÐëÔËÐÐÔÚͬһ¼ÆËã»úÉÏ¡£ËüÃÇÈÔÈ»»¹ Äܹ»ÔËÐÐÔÚͬһ¼ÆËã»úÉÏ£¬µ«²»ÔÙ±ØÐëÄÇÑù¡£

¡¡¡¡²»½öÕâЩ½ø³Ì²»±ØÔËÐÐÔÚͬһ¼ÆËã»úÉÏ£¬ ËüÃÇÒ²²»±ØÔËÐÐÔÚͬһÖÖ²Ù×÷ϵͳÉÏ¡£ ÓÐÁË BSD Ì×½Ó×Ö£¬ÄãµÄ FreeBSD Èí¼þÄܹ»ÓëÔËÐÐÔÚ Macintosh®ÖеijÌÐò˳ÀûµÄЭͬ¹¤×÷£¬Ò²¿ÉÒÔÓëÁíÒ»¸öÔÚSun™ ¹¤×÷Õ¾Éϵ쬻òÊÇÁíÒ»¸öÔËÐÐÔÚ Windows® 2000Öеģ¬ Ö»ÒªÕâЩϵͳÓÃÒÔÌ«ÍøÐ͵ľÖÓòÍøÏàÁ¬¡£

¡¡¡¡ÄãµÄÈí¼þ»¹¿ÉÒԺܺõÄÓëÔËÐÐÔÚÁíÒ»´±´óÂ¥£¬»òÊÇÔÚÁíÒ»¸ö´ó½¡¢ ÔÚÒ»ËÒDZͧÖе쬻òÊÇÒ»¼Üº½Ìì·É»úÖеĽø³ÌЭͬ¹¤×÷¡£

¡¡¡¡ËüÒ²Äܹ»Óë²¢·ÇÊôÓÚ¼ÆËã»úÒ»²¿·Ö(ÖÁÉÙ´ÓÊõÓïµÄÑϸñÒâÒåÉÏ˵²»ÊÇ) µÄ×é¼þЭͬ¹¤×÷£¬ÕâÖÖÉ豸Ïñ´òÓ¡»ú¡¢ÊýÂëÏà»ú¡¢Ò½ÁÆÉ豸£¬ ´óÖÂÖ»ÒªÊÇÈκÎÄܹ»½øÐÐÊý×ÖͨÐŵĶ«Î÷¡£


7.2 ÁªÍøºÍ¶àÑùÐÔ

¡¡¡¡ÎÒÃÇÒѾ­°µÊ¾ÁËÁªÍøµÄ¶àÑùÐÔÎÊÌâ¡£ Ðí¶à²»Í¬µÄϵͳҪ±Ë´Ë¶Ô»°¡£ËüÃDZØÐë˵ͬһÖÖÓïÑÔ¡£Óë´Ëͬʱ£¬ ËüÃÇÒ²±ØÐëÀí½âͬһÖÖÓïÑÔ¡£

¡¡¡¡ÈËÃdz£³£ÈÏΪ֫ÌåÓïÑÔÊÇͨÓõġ£ ÊÂʵ²¢·ÇÈç´Ë¡£»ØÏëÔÚÎÒ¸Õ¸ÕÊ®¼¸Ëêʱ£¬Îҵĸ¸Ç×´øÎÒÈ¥±£¼ÓÀûÑÇ¡£ Ò»´ÎÎÒÃÇÕý×øÔÚË÷·ÇÑÇÒ»×ù¹«Ô°ÀïµÄ×À×ÓÅÔ£¬Ò»¸öС··ÉÏÀ´ÏòÎÒÃÇ ÍÆÏú¿¾ÐÓÈÊ¡£

¡¡¡¡ÄÇʱÎÒ»¹Ã»ÓÐѧϰ¶àÉÙ±£¼ÓÀûÑÇÓÎÒûÓÐ˵¡°²»¡±£¬¶øÊÇÒ¡ÁËÒ¡Í·£¬ ÄÇÊÇ¡°Í¨Óõġ±Ëµ²»µÄÖ«ÌåÓïÑÔ¡£ Ð