The Linux GCC HOWTO¤¤Ä¶ª©V0.2 : ²¾´Óµ{¦¡»P½s͵{¦¡
Previous: GCCªº¦w¸Ë»PGCCªº³]©w
Next: °£¿ù»PºÊºÞ

4. ²¾´Óµ{¦¡»P½s͵{¦¡

4.1. gcc¦Û¦æ©w¸qªº²Å¸¹

¥u­n°õ¦ægcc®É¡Aªþ¥[ -v³o­Ó°Ñ¼Æ¡A´N¯à§ä¥X§A©Ò¥Îªº³oª©gcc¡A¦Û°ÊÀ°§A©w¸q¤F¤°»ò²Å¸¹¡C¨Ò¦p¡A§Úªº¾÷¾¹¬Ý°_¨Ó·|¹³³o¼Ë¡G

$ echo 'main(){printf("hello world\n");}' | gcc -E -v -
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
 /usr/lib/gcc-lib/i486-box-linux/2.7.2/cpp -lang-c -v -undef
-D__GNUC__=2 -D__GNUC_MINOR__=7 -D__ELF__ -Dunix -Di386 -Dlinux
-D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__i386
-D__linux -Asystem(unix) -Asystem(posix) -Acpu(i386)
-Amachine(i386) -D__i486__ -

°²­Y§A¥¿¦b¼gªºµ{¦¡½X·|¥Î¨ì¤@¨ÇLinux¿W¦³ªº¯S©Ê¡A¨º»ò§â¨º¨ÇµLªk²¾´Óªºµ{¦¡½X¡A¥H±ø¥ó¦¡½sĶªº«e¸m©R¥O«Ê¬A°_¨Ó¡A¥i¬O­Ó¤£¿ùªº¥D·N©O¡I¦p¤U©Ò¥Ü¡J

#ifdef __linux__
/* ... funky stuff ... */
#endif /* linux */

¥Î__linux__´N¥i¥H¹F¦¨¥Øªº¡F¬Ý¥J²Ó¤@ÂI¡A¤£¬Olinux³á¡C¾¨ºÞlinux¤]¦³©w¸q¡A²¦³º¡A³o­Ó¤´µM¤£¬OPOSIXªº¼Ð·Ç¡C

4.2. ½u¤W¨D§U»¡©ú

gcc½s;¹°Ñ¼Æªº»¡©ú¤å¥ó¬Ogcc info page¡]¦bEmacs¤º¡A«ö¤UC-h i¡AµM«á¿ï¡¥gcc¡¦ªº¿ï¶µ¡^¡C­n¬O§Ë¤£¥X¨Ó¡A¤£¬O½æ§ACD-ROMªº¤H¨S§â³o­ÓªFªFÀ£µ¹§A¡A¤£µM´N¬O§A²{¦b¥Îªº¬Oª©ªº¡C¹J¨ì³oºØ±¡ªp¡A³Ì¦nªº¤èªk¬O²¾°Ê´LÁv¨ìarchiveftp://prep.ai.mit.edu/pub/gnu©Î¬O¥¦ªºmirrors¯¸¥x¡A¥h§âgccªº­ì©lÀÉ®×§ì¦^®a¡A­«·s²i¶¹¤@µf¡C

gcc manual page¡]gcc.1¡^ ¥i¥H»¡¬O¤w¸g¹L®É¤F¡A­n¬O§A¦Y¹¡¤F¼µµÛ¨S¨Æ·Fµw¬O·Q¬Ý¡A¥¦´N·|§i¶D§A»¡§OµL²á¤F¡C

4.2.1. ºX¥¿ÄÆÄÆ~

¦b©R¥O¦C¤W°õ¦ægcc®É¡A¥u­n¦b¥¦ªº§¾ªÑ«á­±¥[¤W-Onªº¿ï¶µ¡A´N¯àÅýgcc¨Ä¨Äªº´À§A¥Í¥X³Ì¨Î½s½Xªº¾÷¾¹½X¡C³o¸Ìªºn¬O¤@­Ó¥i¦³¥iµLªº¤p¾ã¼Æ¡A¤£¦Pª©¥»ªºgcc¡Anªº·N¸q»P¨ä¥¿½Tªº¥\®Ä³£¤£¤@¼Ë¡A¤£¹L¡A¨å«¬ªº½d³ò¬O±q0¡]¤£­nÂû±C¡A§Ú¤£­n³Ì¨Î½s½X¡C¡^Åܤƨì2¡]³Ì¨Î½s½X­n¦h¤@ÂI¡C¡^¡A¦Aª@¯Å¨ì3¡]³Ì¨Î½s½X­n¦A¦h¤@ÂI¡A¦h¤@ÂI¡^¡C

gcc¦b¨ä¤º³¡·|±N³o¨Ç¼Æ¦rÂàͦ¨¤@¨t¦Cªº-f»P-mªº¿ï¶µ¡C°õ¦ægcc®É±a¤WºX¸¹-v»P-Q¡A§A´N¯à«Ü²M·¡ªº¬Ý¥X¨C¤@ºØµ¥¯Åªº-O¬O¹ïÀ³¨ì¨º¨Ç¿ï¶µ¡C¦n¤ñ»¡¡A´N-O2¨ÓÁ¿¡A§Úªºgcc§i¶D·|§Ú»¡¡G

enabled: -fdefer-pop -fcse-follow-jumps -fcse-skip-blocks
-fexpensive-optimizations
         -fthread-jumps -fpeephole -fforce-mem -ffunction-cse -finline
         -fcaller-saves -fpcc-struct-return -frerun-cse-after-loop
         -fcommon -fgnu-linker -m80387 -mhard-float -mno-soft-float
         -mno-386 -m486 -mieee-fp -mfp-ret-in-387

­n¬O§A¥Îªº³Ì¨Î½s½Xµ¥¯Å°ª©ó§Aªº½s;¹©Ò¯à¤ä´©ªº¡]e.g. -O6¡^¡A¨º»ò¥¦ªº®ÄªG´N¸ò§A¥Î§Aªº½s;¹©Ò¯à´£¨Ñªº³Ì°ªµ¥¯Åªº®ÄªG¬O¤@¼Ëªº¡C»¡¹ê¦bªº¡Aµo¦æ¥X¥hªºgccµ{¦¡½X¡A¥Î¦b½sͮɳº¬O¦p¦¹³B²z³oµ¥°ÝÃD¡A¯uªº¤£¬O¤°»ò¦nªººc·Q¡C¤é«á­Y¬O¦³§ó¶i¨Bªº³Ì¨Î½s½X¤èªk¨ãÅé¾ã¦X¨ì·sªºª©¥»¸Ì¡A¦Ó§A¡]©Î¬O§Aªºusers¡^ÁÙ¬O¸ÕµÛ³o¼Ë°µªº¸Ü¡A¥i¯à´N·|µo²{gcc·|¤¤Â_§Aªºµ{¦¡¤F¡C

±qgcc 2.7.0ª@¯Å¨ì2.7.2ªºusersÀ³¸Óª`·N¤@ÂI¡A¨Ï¥Î-O2®É·|¦³¤@­Óbug¡C§óÁV¿|ªº¬O¡A±j«×§é´î°Ñ¼Æ(strength reduction)©~µM¨S¦³¥Î¡I­n¬O§A³ßÅw­«·s½sĶgccªº¸Ü¡A¬O¦³¨º»ò¤@­Ó­×¥¿ªºª©¥»¥i¥H§ó¥¿³o¶µ¿ù»~¡F¤£µMªº¸Ü¡A¤@©w­n½T©w¨C¦¸½sͮɳ£¦³¥[¤W-fno-strength-reduce³á¡I

11/12/97Ķ

4.2.1.1. ¦³­Ó©Êªº·L³B²z¾¹

¦³¤@¨Ç-mªººX¸¹¤Q¤À¦³¥Î³B¡A¦ý¬O«oµLªkÂǥѦUºØµ¥¯Åªº-O¥´¶}¨Ó¨Ï¥Î¡C³o¤§¤¤³Ì­«­nªº¦³¬O-m386©M-m486³o¨âºØ¡A¥Î¨Ó§i¶Dgcc¸Ó§â¥¿¦b½sĶªºµ{¦¡½Xµø§@±M¬°386©Î¬O486¾÷¾¹©Ò¼gªº¡C¤£½×¬O¥Î­þ¤@ºØ-m¨Ó½s͵{¦¡½X¡A³£¥i¥H¦b©¼¦¹ªº¾÷¾¹¤W°õ¦æ¡A-m486½sĶ¥X¨Óªº½X·|¤ñ¸û¤j¡A¤£¹L®³¨Ó¦b386ªº¾÷¾¹¤W¶]¤]¤£·|¤ñ¸ûºC´N¬O¤F¡C

¥Ø«e©|µL-mpentium©Î¬O-m586ªººX¸¹¡CLinus«ØÄ³§Ú­Ì¥i¥H¥Î-m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2¨Ó±o¨ì³Ì¨Î½s½Xªº486µ{¦¡½X¡A³o¼Ë°µ¥¿¦n´N¥i¥HÁ×§Kalignment¡]Pentium¨Ã¤£»Ý­n¡^¦³¹L¤jªºgapsµo¥Í¡CMichael Meissner»¡¡G

§Úªº²Ä¤»·P§i¶D§Ú¡A-mno-strength-reduce¡]¼K¡I­n¾å±o§Ú¥i¤£¬O¦b½Í±j«×§é´î°Ñ¼Æªºbug§r¡A¨º¤w¸g¬O¥t¥~¤@­Óª§½×ªº¾Ô³õ¤F¡C¡^¤@¼Ë¤]¥i¥H¦bx86ªº¾÷¾¹¤W²£¥Í¸û§Öªºµ{¦¡½X¡A³o¬O¦]¬°x86ªº¾÷¾¹¹ï¼È¦s¾¹¦³µÛ¤£¥i¿i·ÀªºÄÈ´÷¦b¡A¦Ó¥BGCC's method of grouping registers into spill registers vs. other registers doesn't help either¡C¶Ç²Î¤W¡A±j«×§é´îªºµ²ªG·|¨Ï±o½s;¹¥h§Q¥Î¥[ªk¼È¦s¾¹¥H¥[ªk¹Bºâ¨Ó¨ú¥N­¼ªk¹Bºâ¡C¨Æ¹ê¤W¡A§Ú¦bÃhºÃ-fcaller-saves¥i¯à¤]¥u¬O­Óº|¬}¤]»¡¤£©w¡C
¦Ó§Úªº²Ä¤C·P«h¦A«×ªº§i¶D§Ú»¡¡A-fomit-frame-pointer¥i¯à·|¤]¥i¯à¤£·|¦³¥ô¦óªºÁÈÀY¡C±q³oÂI¨Ó¬Ý¡A´N¬O·N¿×µÛ¦³¥t¤@­Ó¼È¦s¾¹¥i¥H¥Î¨Ó³B²z°O¾ÐÅé¤À°tªº°ÝÃD¡C¥t¤è­±¡A­Y¯Âºé±qx86ªº¾÷¾¹¦bÂà´«¥¦ªº«ü¥O¶°¦¨¬°¾÷¾¹½Xªº¤èªk¤W¨Ó¬Ý¡A«K·N¿×µÛ°ïÅ|©Ò¥Î¨ìªº°O¾ÐÅéªÅ¶¡­n¤ñframe©Ò¥Î¨ìªºÁÙ­n¨Ó±o¦h¡F´«¥y¸Ü»¡¡AIcache¹ïµ{¦¡½X¦Ó¨¥¨Ã¨S¦³¹ê½è¤WªºÀ°§U¡A­Y¬O»Õ¤U¥Î¤F-fomit-frame-pointerªº¸Ü¡A¦P®É¤]¬O§i¶D½s;¹¦b¨C¦¸©I¥s¨ç¼Æ¤§«á¡A´N¥²¶·­×¥¿°ïÅ|ªº«ü¼Ð¡FµM¦Ó¡A´Nframe¨ÓÁ¿¡A­Y©I¥sªº¦¸¼Æ¤£¦hªº¸Ü¡A«h¤¹³\°ïÅ|¼È®É°ï¿n°_¨Ó¡C

¦³Ãö³o¤è­±¥DÃDªº³Ì«á¤@¬q¸Ü¤´¬O¨Ó¦Û©óLinus¡G

­nª`·Nªº¬O¡A¦pªG§A·Q­n±o¨ì³Ì¨Îª¬ªpªº°õ¦æ®Ä¯à¡A¥i¤d¸U§O¬Û«H§Úªº¸Ü¡CµL½×¦p¦ó¡A¤@©w­n¶i¦æ´ú¸Õ¡Cgcc½s;¹ÁÙ¦³³\¦hªº°Ñ¼Æ¥i¥Î¡A¨ä¤¤¥i¯à´N¦³¤@ºØ³Ì¯S§Oªº²Õ¦X¡A¥i¥Hµ¹§A³Ì¨Î½s½Xªºµ²ªG¡C

11/14/97Ķ 5/15/98­×¥¿

4.2.2. Internal compiler error: cc1 got fatal signal 11

Signal 11¬O«ü SIGSEGV¡A©ÎªÌ ¡¥segmentation violation¡¦¡C³q±`³o¬O«ü »¡gcc¹ï¦Û¤v©Ò¥Îªº«ü¼Ð·P¨ì§x´b¡A¦Ó¥BÁÙ¹Á¸ÕµÛ§â¸ê®Æ¼g¤J¤£Äݩ󥦪º°O¾ÐÅé¸Ì¡C©Ò¥H¡A³o¥i¯à¬O¤@­Ógccªºbug¡C µM¦Ó¡A¤jÅé¦Ó¨¥¡Agcc¬O¤@¤ä¸g¹LÄY±K´ú¸Õ¥B¥i¾a«×¨}¦nªº³nÅé¨Î§@¡C¥¦¤]¥Î¤F¤j¶q½ÆÂøªº¸ê®Æµ²ºc»PÅå¤Hªº«ü¼Ð¼Æ¶q¡C²¨¥¤§¡A­Y¬O­nµû¿ï¥»¥@¬ö³Ì¬D±§»P³Ì¤@µ·¤£ÎAªºRAM´ú¸Õµ{¦¡¡Agccµ´¹ï¥i¥H¤@ºK¦Z«a¡C°²¦p§AµLªk­«·s½Æ»s³o°¦bug---·í§A­«·s¶}©l½sͮɡA¿ù»~ªº°T®§¨Ã¨S¦³¤@ª½¥X²{¦b¦P¤@­Ó¦a¤è---¨º´X¥G¥i¥H½T©w,¬O§AªºµwÅ饻¨­¦³°ÝÃD(CPU,°O¾ÐÅé,¥D¾÷ªO©Î¬O§Ö¨ú°O¾ÐÅé).¤d¸U¤£­n¦]¬°§Aªº¹q¸£¥i¥H³q¹L¶}¾÷µ{§Çªº´ú¸Õ¡B©Î¬OWindows¥i¥H¶]±o«Ü¶¶¡B©ÎªÌ¨ä¥¦¤°»òªº¡A´N¦^¹LÀY¨Ó¤j¸v«Å¶Ç»¡³o¬Ogccªº¤@­Óbug¡F§A©Ò°µªº³o¨Ç´ú¸Õ°Ê§@¡A³q±`¨S¦³¤°»ò¹ê»Ú¤Wªº»ù­È¡A³o¬O«Ü¦X²zªºµ²½×¡C¥t¥~¡A¤]¤£­n¦]¬°½s֤ͮ߮ɡAÁ`¬O°±¯d¦b¡¥make zImage¡¦ªº¶¥¬q¡A´N­n¤j½|³o¬Ogccªºbug---·íµM¥¦·|°±¦b¨º¨à°Ú¡I°µ¡¥make zImage¡¦®É¡A»Ý­n½sĶªºÀÉ®×¥i¯à´N¶W¹L200ÀɮסF§Ú­Ì¥¿¦b¬ãÀÀ¤@­Ó´À¥Nªº¤è®×¡C

¦pªG§A¥i¥H­«Âв£¥Í³o­Óbug¡A¦Ó¥B¡]³Ì¦n¬O³o¼Ë°Õ¡I¡^¥i¥H¼g¤@­Óµu¤pªºµ{¦¡¨Ó®i¥Ü³o°¦bugªº¸Ü¡A§A´N¥i¥H§â¥¦°µ¦¨bug³ø§i¡AµM«áemailµ¹FSF¡A©ÎªÌ¬Olinux-gcc³q«H½×¾Â¡C§A¥i¥H¥h°Ñ¦Ògccªº»¡©ú¤å¥ó¡A¬Ý¬Ý¦³¤°»ò¸Ô²Óªº¸ê°T,¬O¥L­Ì©Ò»Ý­nªº¡C

4.3. ²¾´Ó¯à¤O

¾Ú³ø¡Aªñ¤é¨Ó³\¦h¥¿­±ªº®ø®§«ü¥X¡A­Y¬O¦³¬Y¥óªFªF¨ì²{¦b³£ÁÙ¨S²¾´Ó¨ìLinux¤W¥h¡A¨º»ò¥i¥HªÖ©wªº¬O¡A¥¦¤@©w¤@ÂI»ù­È¤]¨S¦³¡C:-)

¶â¡I¥¿¸g¤@ÂI¡C¤@¯ë¦Ó¨¥¡A­ì©l½X¥u»Ý­n°µ¤@¨Ç§½³¡ªº­×§ï¡A´N¥i¥H§JªALinux 100%»PPOSIX¬Û®eªº¯S½è¡C¦pªG§A°µ¤F¥ô¦óªº­×§ï¡A¦Ó±N¦¹³¡¥÷¶Ç¦^µ¹­ì§@ªÌ¡A·|¬O«Ü¦³«Ø³]©ÊªºÁ|°Ê¡C³o¼Ë¤é«á´N¥u»Ý­n¥Î¨ì¡¥make¡¦¡A´N¯à±o¨ì¤@­Ó¥i°õ¦æªºÀɮפF¡C

4.3.1. BSD±Ð®{ (¦³ bsd_ioctl¡Bdaemon »P <sgtty.h>)

½s͵{¦¡®É¡A¥i¥H°t¦X-I/usr/include/bsd»P³sµ²-lbsdªºµ{¦¡®w¡C¡]¨Ò¦p¡G¦b§AªºMakefileÀɤº¡A§â-I/usr/include/bsd¥[¨ìCFLAGS¨º¤@¦æ¡F§â-lbsd¥[¨ìLDFLAGS¨º¤@¦æ¡^¡C¦pªG§A¯uªº¨º»ò·Q­nBSD«¬ºAªº«H¸¹¦æ¬°¡A¤]¤£»Ý­n¦A¥[¤W-D__USE_BSD_SIGNAL¤F¡C¨º¬O¦]¬°·í§A¥Î¤F-I/usr/include/bsd»P§t¬A¤F¼ÐÀYÀÉ<signal.h>¤§«á¡Amake®É´N·|¦Û°Ê¥[¤J¤F¡C

4.3.2. ¥¢¸¨ªº«Ê¦L(SIGBUS, SIGEMT, SIGIOT, SIGTRAP, SIGSYS etc)

Linux»PPOSIX¬O§¹¥þ¬Û®eªº¡C¤£¹L¡A¦³¨Ç«H¸¹¨Ã¤£¬OPOSIX©w¸qªº---ISO/IEC 9945-1:1990 (IEEE Std 1003.1-1990), paragraph B.3.3.1.1 sez:

¡§¦bPOSIX.1¤¤¬Ù²¤¤FSIGBUS¡BSIGEMT¡BSIGIOT¡BSIGTRAP»PSIGSYS«H¸¹¡A¨º¬O¦]¬°¥¦­Ìªº¦æ¬°»P¹ê§@ªº¤è¦¡®§®§¬ÛÃö¡A¦Ó¥B¤]µLªk¶i¦æ¾A·íªº¤ÀÃþ¡C½T»{¹ê§@¤è¦¡«á¡A«K¥i¥Hµo°e³o¨Ç«H¸¹¡A¥i¬O¥²¶·¥H¤å¥ó»¡©ú¥¦­Ì¬O¦b¤°»ò¼ËªºÀô¹Ò©³¤Uµo°e¥X¨Óªº¡A¥H¤Î«ü¥X¥ô¦ó»P¥¦­Ìªºµo®i¬ÛÃöªº­­¨î¡C¡¨

·Q­n­×¥¿³o­Ó°ÝÃD¡A³Ì²³æ¤]¬O³Ì²Âªº¤èªk´N¬O¥ÎSIGUNUSED­«·s©w¸q³o¨Ç«H¸¹¡C¥¿½Tªº¤èªkÀ³¸Ó¬O¥H±ø¥ó¦¡ªº½sĶ#ifdef¨Ó³B²z³o¨Ç°ÝÃD¤~¹ï¡G

#ifdef SIGSYS
/* ... non-posix SIGSYS code here .... */
#endif

11/15/97Ķ 5/22/98­×¥¿

4.3.3. K & R

gcc¬O¤@­Ó»PANSI¬Û®eªº½s;¹¡F©_©Çªº¬O¡A¥Ø«e¤j¦h¼Æªºµ{¦¡½X³£¤£²Å¦XANSI©Ò©wªº¼Ð·Ç¡C¦pªG§A¼ö·RANSI¡A³ßÅw¥ÎANSI´£¨Ñªº¼Ð·Ç¨Ó¼¶¼gCµ{¦¡¡A¦ü¥G°£¤F¥[¤W-traditionalªººX¸¹¤§¥~¡A´N¨S¦³¨ä¥¦¤°»ò¥i¥H¦h½Íªº¤F¡CThere is a certain amount of finer-grained control over which varieties of brain damage to emulate;½Ð¦Û¦æ¬d¾\gcc info page¡C

­nª`·Nªº¬O¡A¾¨ºÞ§A¥Î¤F-traditional¨Ó§ïÅÜ»y¨¥ªº¯S©Ê¡A¥¦ªº®ÄªG¤]¶È«]­­©ógcc©Ò¯à°÷±µ¨üªº½d³ò¡C¨Ò¦p, -traditional·|¥´¶}-fwritable-strings¡A¨Ï±o¦r¦ê±`¼Æ²¾¦Ü¸ê®Æ°O¾ÐÅéªÅ¶¡¤º(±qµ{¦¡½X°O¾ÐÅéªÅ¶¡²¾¥X¨Ó¡A³o­Ó¦a¤è¬O¤£¯à¥ô·N¼g¤Jªº)¡C³o¼Ë°µ·|Åýµ{¦¡½Xªº°O¾ÐÅéªÅ¶¡µL§Î¤¤¼W¥[ªº¡C

4.3.4. «e¸m³B²z¾¹ªº²Å¸¹¥f¤W¨ç¼Æ­ì«¬«Å§i

³Ì±`¨£ªº°ÝÃD¬O¡A¦p²³©Ò¬Òª¾¡ALinux¤¤¦³³\¦h±`¥Îªº¨ç¼Æ³£©w¸q¦¨¥¨¶°¦s©ñ¦b¼ÐÀYÀɤº¡A¦¹®É­Y¦³¬Û¦üªº¨ç¼Æ­ì«¬«Å§i¥X²{¦bµ{¦¡½X¤º¡A«e¸m³B²z¾¹·|©Úµ´¶i¦æ»yªk¤ÀªRªº«e¸m§@·~¡C±`¨£ªº¦³atoi()»Patol()¡C

4.3.5. sprintf()

¦b¤j³¡¥÷ªºUnix¨t²Î¤W¡Asprintf(string, fmt, ...)¶Ç¦^ªº¬Ostringªº«ü¼Ð¡AµM¦Ó¡A³o¤è­±Linux¡]¿í´`ANSI¡^¶Ç¦^ªº«o¬O©ñ¤Jstring¤ºªº¦r¤¸¼Æ¥Ø.¶i¦æ²¾´Ó®É¡A¤×¨ä¬O°w¹ïSunOS¡A»Ý¦³ÄµÄ±ªº¤ß¡C

4.3.6. fcntl »P¬ÛÃöªº¨ç¼Æ¡FFD_*®a±Úªº©w¸q¨ì©³Â\¦b­þ¸Ì?

´N¦b<sys/time.h>¸ÌÀY¡C ¬°¤F¯u¥¿ªº­ì«¬«Å§i¡A·í§A¥Î¤Ffcntl¡A¥i¯à§A¤]·Q§t¬A¼ÐÀYÀÉ<unistd.h>¶i¨Ó¡C

¤@¯ë¦Ó¨¥¡A¨ç¼Æªºmanual page·|¦bSYNOPSIS³¹¸`¤º¦C¥X»Ý­nªº¼ÐÀYÀÉ¡C

4.3.7. select()ªº­p®É---µ{¦¡°õ¦æ®É·|³B©ó¦£¸L-µ¥«Ýªºª¬ºA

«Ü¤[«Ü¤[¥H«e,¡Aselect()ªº­p®É°Ñ¼Æ¥u¦³°ßŪªº©Ê¦Ó¤w¡C§Y¨Ï¨ì¤F³Ìªñ¡Amanual pages¤´µM¦³¤U­±³o¬qªºÄµ§i¡G

select()À³¸Ó¬OÂǥѭץ¿®É¶¡ªº¼Æ­È¡]¦pªG¦³ªº¸Ü¡^¡A¦A¶Ç¦^¦Û­ì©l­p®É¶}©l«á©Ò³Ñ¾lªº®É¶¡¡C¥¼¨Óªºª©¥»¥i¯à·|¨Ï³o¶µ¥\¯à¹ê²{¡C¦]¦¹¡A´N¥Ø«e¦Ó¨¥¡A­Y¥H¬°©I¥sselect()¤§«á¡A­p®É«ü¼Ð¤´µM¤£·|³Q­×¥¿¹L¡A¥i¬O¤@ºØ«D±`¤£©ú´¼ªº·Qªk³á¡I

¥¼¨Ó´N¦b§Ú­Ìªº²´«e¤F¡I¦Ü¤Ö¡A¦b³o¨à§Aµ´¹ï¥i¥H¬Ý¨ì¡C¨ç¼Æselect()¶Ç¦^ªº¡A¬O¦©°£µ¥«Ý©|¥¼¨ì¹Fªº¸ê®Æ©Ò¯Ó¶Oªº®É¶¡«á¡A¨ä³Ñ¾lªº®É¶¡¼Æ­È¡C¦pªG¦b­p®Éµ²§ô®É¡A³£¨S¦³¸ê®Æ¶Ç°e¶i¨Ó¡A­p®É¤Þ¼Æ«K·|³]¬°0¡F¦pªG±µµÛÁÙ¦³¥ô¦óªºselect()¡A¥H¦P¼Ëªº­p®Éstructure¨Ó©I¥s¡A¨º»òselect()«K·|¥ß¨èµ²§ô¡C

­Y­n­×¥¿³o¶µ°ÝÃD¡A¥u­n¨C¦¸©I¥sselect()«e¡A³£§â­p®É¼Æ­È©ñ¨ì­p®É structure¤º¡A´N¨S¦³°ÝÃD¤F¡C§â¤U­±ªºµ{¦¡½X¡A

      struct timeval timeout;
      timeout.tv_sec = 1; timeout.tv_usec = 0;
      while (some_condition)
            select(n,readfds,writefds,exceptfds,&timeout); 
§ï¦¨¡A
      struct timeval timeout;
      while (some_condition) {
            timeout.tv_sec = 1; timeout.tv_usec = 0;
            select(n,readfds,writefds,exceptfds,&timeout);
      }

³o­Ó°ÝÃD¡A¦b¦³¨Çª©¥»ªºMosaic¸Ì¬O¬Û·íµÛ¦Wªº¡A¥u­n¤@¦¸ªºµ¥«Ý¡AMosaic´N±¾¦b¨º¸Ì¤F¡CMosaicªº¿Ã¹õ¥k¤W¨¤¡A¬O¤£¬O¦³­Ó¶ê¶êªº¡B·|±ÛÂ઺¦a²y°Êµe¡C¨ºÁû²yÂà±o·U§Ö¡A´Nªí¥Ü¸ê®Æ±qºô¸ô¤W¶Ç°e¹L¨Óªº³t²v·UºC¡I

4.3.8. ²£¥Í¤¤Â_ªº¨t²Î©I¥s

4.3.8.1. ¯S¼x¡G

·í¤@¤äµ{¦¡¥HCtrl-Z¤¤¤î¡BµM«á¦A­«·s°õ¦æ®É¡X©ÎªÌ¬O¨ä¥¦¥i¥H²£¥ÍCtrl-C¤¤Â_«H¸¹ªº±¡ªp¡A¦p¤lµ{§Çªº²×µ²µ¥¡X¨t²Î´N·|©ê«è»¡"interrupted system call"©Î¬O"write: unknown error"¡A©ÎªÌ½Ñ¦p¦¹Ãþªº°T®§¡C

4.3.8.2. °ÝÃDÂI¡G

POSIXªº¨t²ÎÀˬd«H¸¹ªº¦¸¼Æ¡A¤ñ°_¤@¨Çª©ªºUnix¬O­n¦h¨º»ò¤@ÂI¡C¦pªG¬OLinux¡A¥i¯à´N·|°õ¦æsignal handlers¤F¡X

´N¨ä¥¦ªº§@·~¨t²Î¦Ó¨¥¡A§A»Ý­nªº¥i¯à´N¬O¤U­±³o¨Ç¨t²Î©I¥s¤F¡G creat(), close(), getmsg(), putmsg(), msgrcv(), msgsnd(), recv(), send(), wait(), waitpid(), wait3(), tcdrain(), sigpause(), semop() to this list.

¦b¨t²Î©I¥s´Á¶¡¡A­Y¦³¤@«H¸¹¡]¨º¤äµ{¦¡¥»¨­À³·Ç³Æ¦nhandler¦]À³¤F¡^²£¥Í¡Ahandler´N·|³Q©I¥s¡C·íhandler±N±±¨îÅvÂಾ¦^¨t²Î©I¥s®É¡A¥¦·|°»´ú¥X¥¦¤w¸g²£¥Í¤¤Â_¡A¦Ó¥B¶Ç¦^­È·|¥ß¨è³]©w¦¨-1¡A¦Óerrno³]©w¦¨EINTR¡Cµ{¦¡¨Ã¨S¦³·Q¨ì·|µo¥Í³oºØ¨Æ¡A©Ò¥H´N±¾¤F¡C

¦³¨âºØ­×¥¿ªº¤èªk¥i¥H¿ï¾Ü¡G

(1) ¹ï¨C­Ó§A¦Û¦æ¦w¸Ëªºsignal handler¡A³£¶·¦bsigactionªººX¸¹¥[¤WSA_RESTART¡C¨Ò¦p¡A§â¤U¦Cªºµ{¦¡¡A

  signal (sig_nr, my_signal_handler);
§ï¦¨¡A
  signal (sig_nr, my_signal_handler);
  { struct sigaction sa;
    sigaction (sig_nr, (struct sigaction *)0, &sa);
#ifdef SA_RESTART
    sa.sa_flags |= SA_RESTART;
#endif
#ifdef SA_INTERRUPT
    sa.sa_flags &= ~ SA_INTERRUPT;
#endif
    sigaction (sig_nr, &sa, (struct sigaction *)0);
  }

­nª`·Nªº¬O¡A·í³o³¡¥÷ªºÅܧó¤j¶qÀ³¥Î¨ì¨t²Î©I¥s¤§«á¡A©I¥sread()¡Bwrite()¡Bioctl()¡B select()¡B pause() »P connect()®É¡A§A¤´µM±o¦Û¦æÀˬdEINTR¡C¦p¤U©Ò¥Ü¡G

(2) §A¦Û¤v±o«Ü©ú½T¦aÀˬdEINTR¡G

³o¸Ì¦³¨â­Ó°w¹ïread()»Pioctl()ªº¨Ò¤l¡C

­ì©lªºµ{¦¡¤ù¬q¡A¨Ï¥Îread()¡G

int result;
while (len > 0) { 
  result = read(fd,buffer,len);
  if (result < 0) break;
  buffer += result; len -= result;
}
­×§ï¦¨,
int result;
while (len > 0) { 
  result = read(fd,buffer,len);
  if (result < 0) { if (errno != EINTR) break; }
  else { buffer += result; len -= result; }
}
­ì©lªºµ{¦¡¤ù¬q¡A¨Ï¥Îioctl()¡G

int result;
result = ioctl(fd,cmd,addr);
­×§ï¦¨¡A
int result;
do { result = ioctl(fd,cmd,addr); }
while ((result == -1) && (errno == EINTR));

ª`·N¤@ÂI¡A¦³¨Çª©¥»ªºBSD Unix¡A¨ä¤º©wªº¦æ¬°¬O­«·s°õ¦æ¨t²Î©I¥s¡C­Y­nÅý¨t²Î©I¥s¤¤Â_¡A±o¨Ï¥Î SV_INTERRUPT©ÎSA_INTERRUPTºX¸¹¡C

4.3.9. ¥i¥H¼g¤Jªº¦r¦ê

gcc¹ï¨äusersÁ`Ãh©êµÛ¼ÖÆ[ªº·Qªk¡A¬Û«H·í¥L­Ì¥´ºâÅý¬Y­Ó¦r¦ê·í§@±`¼Æ¨Ó¥Î®É---¨º¥¦´N¯uªº¥u¬O¦r¦ê±`¼Æ¦Ó¤w¡C¦]¦¹¡A³oºØ¦r¦ê±`¼Æ·|Àx¦s¦bµ{¦¡½Xªº°O¾ÐÅé°Ï¬q¤º¡C³o¶ô°Ï°ì¥i¥Hpage¨ìºÏºÐ¾÷ªºimage¤W¡AÁ×§K¯Ó±¼swapªº°O¾ÐÅéªÅ¶¡¡A¦Ó¥B¥ô¦ó¹Á¸Õ¼g¤JªºÁ|°Ê³£·|³y¦¨¤À­¶ªº¿ù»~(segmentation fault)¡C³o¥i¬O¤@ºØ¯S¦â©O¡I

¹ï¦Ñ¤@ÂIªºµ{¦¡¦Ó¨¥¡A³o¥i¯à·|²£¥Í¤@­Ó°ÝÃD¡C¨Ò¦p¡A©I¥smktemp()¡A¶Ç»¼ªº¤Þ¼Æ(arguments)¬O¦r¦ê±`¼Æ¡C mktemp()·|¹Á¸ÕµÛ¦b*¾A·íªº¦ì¸m*­«·s¼g¤J¥¦ªº¤Þ¼Æ¡C

­×¥¿ªº¤èªk¤£¥~¥G(a)¥H-fwritable-strings½sĶ¡A­¢¨Ïgcc±N¦¹±`¼Æ¸m©ñ¦b¸ê®Æ°O¾ÐÅéªÅ¶¡¤º¡F©ÎªÌ(b)±N«I¥Ç¦aÅvªº³¡¥÷­«·s§ï¼g¡A°t¸m¤@­Ó¤£¬°±`¼Æªº¦r¦ê¡A¦b©I¥s«e¡A¥ý¥Hstrcpy()±N¸ê®Æ«þ¨©¶i¥h¡C

4.3.10. ¬°¤°»ò©I¥sexecl()·|¥¢±Ñ¡H

¨º¬O¦]¬°§A©I¥sªº¤è¦¡¤£¹ï¡Cexeclªº²Ä¤@­Ó¤Þ¼Æ¬O§A·Q­n°õ¦æªºµ{¦¡¦W.²Ä¤G­Ó»P±µÄòªº¤Þ¼Æ·|Åܦ¨§A©Ò©I¥sªºµ{¦¡ªºargv°}¦C¡C°O¦í¡G¶Ç²Î¤W¡Aargv[0]¬O¥u¦³·íµ{¦¡¨S¦³±aµÛ¤Þ¼Æ°õ¦æ®É¡A¤~·|¦³³]©w­È¡C©Ò¥HÅo¡A§AÀ³¸Ó³o¼Ë¼g¡G

execl("/bin/ls","ls",NULL);
¦Ó¤£¬O¥u¦³¡A
execl("/bin/ls", NULL);

°õ¦æµ{¦¡¦Ó¤£±a¥ô¦ó¤Þ¼Æ¡A¥i¸ÑÄÀ¦¨¬O¤@ºØÁܽШç¡A¥Øªº¬O§â¦¹µ{¦¡ªº°ÊºAµ{¦¡®w¿W¥ßªº¯S©Ê¦L¥X¨Ó¡C¦Ü¤Ö¡Aa.out¬O³o¼Ëªº¡C´NELF¦Ó¨¥¡C¨Æ±¡´N¤£¬O³o¼Ë¤F.

¡]¦pªG§A·Q±oª¾¦¹µ{¦¡®wªº¸ê°T¡A¦³¤@¨Ç§ó²³æªº¤¶­±¥i¥Î¡F°Ñ¦Ò°ÊºA¸ü¤J¨º¤@³¹¸`¡A©Î¬Olddªºmanual page¡C¡

11/16/97Ķ 6/2/98­×¥¿


The Linux GCC HOWTO¤¤Ä¶ª©V0.2 : ²¾´Óµ{¦¡»P½s͵{¦¡
Previous: GCCªº¦w¸Ë»PGCCªº³]©w
Next: °£¿ù»PºÊºÞ