¥un°õ¦æ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
gcc½s;¹°Ñ¼Æªº»¡©ú¤å¥ó¬Ogcc info page¡]¦bEmacs¤º¡A«ö¤UC-h i
¡AµM«á¿ï¡¥gcc¡¦ªº¿ï¶µ¡^¡Cn¬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¡An¬O§A¦Y¹¡¤F¼µµÛ¨S¨Æ·Fµw¬O·Q¬Ý¡A¥¦´N·|§i¶D§A»¡§OµL²á¤F¡C
¦b©R¥O¦C¤W°õ¦ægcc®É¡A¥un¦b¥¦ªº§¾ªÑ«á±¥[¤W-O
nªº¿ï¶µ¡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½Xn¦h¤@ÂI¡C¡^¡A¦Aª@¯Å¨ì3¡]³Ì¨Î½s½Xn¦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¦³¥Î¡In¬O§A³ßÅw«·s½sĶgccªº¸Ü¡A¬O¦³¨º»ò¤@Ó×¥¿ªºª©¥»¥i¥H§ó¥¿³o¶µ¿ù»~¡F¤£µMªº¸Ü¡A¤@©wn½T©w¨C¦¸½sͮɳ£¦³¥[¤W-fno-strength-reduce
³á¡I
11/12/97Ķ
¦³¤@¨Ç-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¡In¾å±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¤è±¡AY¯Âºé±qx86ªº¾÷¾¹¦bÂà´«¥¦ªº«ü¥O¶°¦¨¬°¾÷¾¹½Xªº¤èªk¤W¨Ó¬Ý¡A«K·N¿×µÛ°ïÅ|©Ò¥Î¨ìªº°O¾ÐÅéªÅ¶¡n¤ñframe©Ò¥Î¨ìªºÁÙn¨Ó±o¦h¡F´«¥y¸Ü»¡¡AIcache¹ïµ{¦¡½X¦Ó¨¥¨Ã¨S¦³¹ê½è¤WªºÀ°§U¡AY¬O»Õ¤U¥Î¤F-fomit-frame-pointer
ªº¸Ü¡A¦P®É¤]¬O§i¶D½s;¹¦b¨C¦¸©I¥s¨ç¼Æ¤§«á¡A´N¥²¶·×¥¿°ïÅ|ªº«ü¼Ð¡FµM¦Ó¡A´Nframe¨ÓÁ¿¡AY©I¥sªº¦¸¼Æ¤£¦hªº¸Ü¡A«h¤¹³\°ïÅ|¼È®É°ï¿n°_¨Ó¡C
¦³Ãö³o¤è±¥DÃDªº³Ì«á¤@¬q¸Ü¤´¬O¨Ó¦Û©óLinus¡G
nª`·Nªº¬O¡A¦pªG§A·Qn±o¨ì³Ì¨Îª¬ªpªº°õ¦æ®Ä¯à¡A¥i¤d¸U§O¬Û«H§Úªº¸Ü¡CµL½×¦p¦ó¡A¤@©wn¶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×¥¿
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²¨¥¤§¡AY¬Onµû¿ï¥»¥@¬ö³Ì¬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´Nn¤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
¾Ú³ø¡Aªñ¤é¨Ó³\¦h¥¿±ªº®ø®§«ü¥X¡AY¬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
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ªº¨º»ò·QnBSD«¬º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
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¡¨
·Qn×¥¿³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×¥¿
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
³Ì±`¨£ªº°ÝÃ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
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
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
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¶Ç¦^¦Ûì©lp®É¶}©l«á©Ò³Ñ¾lªº®É¶¡¡C¥¼¨Óªºª©¥»¥i¯à·|¨Ï³o¶µ¥\¯à¹ê²{¡C¦]¦¹¡A´N¥Ø«e¦Ó¨¥¡AY¥H¬°©I¥sselect()¤§«á¡Ap®É«ü¼Ð¤´µ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¦bp®Éµ²§ô®É¡A³£¨S¦³¸ê®Æ¶Ç°e¶i¨Ó¡Ap®É¤Þ¼Æ«K·|³]¬°0¡F¦pªG±µµÛÁÙ¦³¥ô¦óªºselect()¡A¥H¦P¼Ëªºp®Éstructure¨Ó©I¥s¡A¨º»òselect()«K·|¥ß¨èµ²§ô¡C
Yn×¥¿³o¶µ°ÝÃD¡A¥un¨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¥un¤@¦¸ªºµ¥«Ý¡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
·í¤@¤äµ{¦¡¥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
POSIXªº¨t²ÎÀˬd«H¸¹ªº¦¸¼Æ¡A¤ñ°_¤@¨Çª©ªºUnix¬On¦h¨º»ò¤@ÂI¡C¦pªG¬OLinux¡A¥i¯à´N·|°õ¦æsignal handlers¤F¡X
select()
, pause()
, connect()
,accept()
, read()
on terminals, sockets, pipes or files in /proc
, write()
on terminals, sockets, pipes or the line printer, open()
on FIFOs, PTYs or serial lines,ioctl()
on terminals, fcntl()
with command F_SETLKW
, wait4()
, syslog()
, any TCP or NFS operations. ´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´Á¶¡¡AY¦³¤@«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¡CYnÅý¨t²Î©I¥s¤¤Â_¡A±o¨Ï¥Î SV_INTERRUPT
©ÎSA_INTERRUPT
ºX¸¹¡C
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
execl()
·|¥¢±Ñ¡H
¨º¬O¦]¬°§A©I¥sªº¤è¦¡¤£¹ï¡Cexecl
ªº²Ä¤@Ӥ޼ƬO§A·Qn°õ¦æªºµ{¦¡¦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×¥¿