BBSˮľÇ廪վ¡Ã¾«»ªÇø

·¢ÐÅÈË: SuperSB (¹ÂÓ¥), ÐÅÇø: Linux        
±ê  Ìâ: [×ªÔØ]unix»·¾³¸ß¼¶±à³Ì-¸½C 
·¢ÐÅÕ¾: BBS Ë®Ä¾Ç廪վ (Wed Mar 15 14:32:37 2000) 
 
 
 
 
·¢ÐÅÈË: taosm (128+64-->cool), ÐÅÇø: unix  
±ê  Ìâ: unix»·¾³¸ß¼¶±à³Ì--¸½Â¼C Ï°Ìâ´ð°¸  
·¢ÐÅÕ¾: Î÷Ê®°ËBBS (Sat Mar 11 14:37:49 2000), ×ªÐÅ  
   
¸½Â¼C   Ï°Ìâ´ð°¸  
   
µÚÒ»Õ  
1.1 ÀûÓÃlsÃüÁîÖеÄÏÂÃæÁ½¸öÑ¡Ï-i--ÏÔʾÎļþ»òĿ¼µÄi½ÚµãÊýÄ¿(¹ØÓÚi½Úµã  
ÔÚ4.14½ÚÖлáÏêϸÌÖÂÛ)£»-d--Èç¹û²ÎÊýÊÇһĿ¼£¬Ö»ÁгöÆäÃû×Ö£¬¶ø²»ÊÇĿ¼ÖР 
µÄËùÓÐÎļþ¡£  
Ö´ÐÐÏÂÃæÃüÁîµÄ½á¹ûΪ£º  
$ ls -ldi   /etc/.   /etc/..  
                        3077 drwxr-sr-x  7 bin  2048 Aug 5 20:12 /etc/./  
   2 drwxr-xr-x 13 root   512 Aug 5 20:11 /etc/../  
$ls -ldi /.   /..  
   2 drwxr-xr-x 13 root  512 Aug 5 20:11 /./  
                   2 srwxr-xr-x 13 root  512 Aug 5 20:11 /../           {.ºÍ..µÄµÄi½ÚµãÊý¾ùΪ2  
µÄi½ÚµãÊý¾ùΪ2  
1.3 ¼ÙÈçperrorµÄptr²ÎÊýÊÇÒ»¸öÖ¸Õ룬Ôòperror¾Í¿ÉÒԸıäptrËùÖ¸´®µÄÄÚÈÝ¡£Ëù  
ÒÔÀûÓÃÏÞ¶¨´ÊconstʹµÃperror²»ÄÜÐÞ¸ÄptrËùÖ¸µÄ´®¡£¶østrerrorµÄ²ÎÊýÊÇ´íÎóºÅ  
£¬ÓÉÓÚÆäÊÇÕûÊýÀàÐͲ¢ÇÒC´«µÝµÄÊDzÎÊýÖµ£¬Òò´Ëstrerror²»ÄÜÐ޸IJÎÊýµÄÖµ£¬Ò²  
   
   
¾ÍûÓбØÒªÊ¹ÓÃconstÊôÐÔ¡£  
1.4 µ÷ÓÃfflush£¬fprintfºÍvprintfº¯Êý»á¸Ä±äerrnoµÄÖµ¡£Èç¹ûËüµÄÖµ±äÁ˵«Ã»  
Óб£´æ£¬Ôò×îÖÕÏÔʾµÄ´íÎóÐÅÏ¢ÊDz»ÕýÈ·µÄ¡£  
ÔÚ¹ýÈ¥¿ª·¢Ðí¶à³ÌÐòÖж¼¿ÉÒÔ·¢ÏÖ²»±£´æerrnoµÄÇé¿ö£¬µäÐ͵ĴòÓ¡³öµÄ´íÎóÐÅÏ¢  
ÊÇ"Not a typewriter."¡£ÔÚ5.4½ÚÖбê×¼I/O¿â¸ù¾Ý±ê×¼I/OÁ÷ÊÇ·ñÖ¸ÏòÖÕ¶ËÉ豸¶ø  
¸Ä±äÁ÷µÄ»º´æÆ÷¡£istty(11.9½Ú)ͨ³£ÓÃÀ´ÅжÏÁ÷ÊÇ·ñÖ¸ÏòÖÕ¶ËÉ豸£¬Èç¹ûÁ÷²»Ö¸  
ÏòÖÕ¶ËÉ豸£¬errno¿ÉÄÜÖÃΪENOTTY£¬´Ó¶øÒýÆð¸Ã´íÎó¡£³ÌÐòC.1±íÏÖÁËÕâ¸öÊôÐÔ¡£  
   
#include        <stdio.h>  
/*  
 * The following prints errno=25 (ENOTTY) under 4.3BSD and SVR2,  
 * when stdout is redirected to a file.  
 * Under SVR4 and 44BSD it works OK.  
 */  
int  
main()  
{  
        int                     fd;  
        extern int      errno;  
        if ( (fd = open("/no/such/file", 0)) < 0) {  
                printf("open error: ");  
                printf("errno = %d\n", errno);  
        }  
        exit(0);  
}  
³ÌÐò C.1        errnoºÍprintfµÄ½»»¥×÷Óà 
Ö´ÐÐÉÏÃæµÄ³ÌÐò£¬½á¹ûΪ£º  
$ grep BSD /etc/motd  
4.3  BSD  UNIX  #29:  Thu Mar 29  11:14:13  MST  1990  
$ a.out  
open error:   error = 2                 {¹¤×÷Õý³££¬stdoutÊÇÒ»¸öÖÕ¶Ë}  
$ a.out > temp.foo  
$ cat temp.foo  
open error:   error = 25                {´íÎó}  
1.5 2038Äê¡£  
1.6 ´óÔ¼248Ìì¡£  
   
   
µÚ¶þÕ  
2.1 ÏÂÃæÊÇ4.3+BSDÖÐʹÓõļ¼Êõ¡£ÔÚ<machine/ansi.h> ÖУ¬Óôóд×Öĸ¶¨Òå¿ÉÒÔ  
ÔÚ¶à¸öÍ·ÎļþÖгöÏֵĻù±¾Êý¾ÝÀàÐÍ¡£ÀýÈ磺  
        #ifndef _ANSI_--H_  
        #define _ANSI_H_  
   
        #define _CLOCK_T_       unsigned long  
        #define _SIZE_T_                unsigned int  
        ¡­  
        #endif                  /*_ANSI_H_*/  
        ÒÔÏÂÃæµÄ˳Ðò¿ÉÒÔÔÚÕâ6¸öÍ·ÎļþÖзֱð¶¨Òåsize_t¡£  
        #ifdef  _SIZE_T_  
        typedef _SIZE_T_        size_t;  
        #undef  _SIZE_T_  
        #endif  
        ÕâÑù£¬Êµ¼ÊÉÏÖ»Ö´ÐÐÒ»´Îtypedef¡£  
   
   
µÚÈýÕ  
3.1 ËùÓеĴÅÅÌI/O¶¼Òª¾­¹ýÄں˵Ŀ黺´æÆ÷£¬Î¨Ò»ÀýÍâµÄÊǶÔԭʼ´ÅÅÌÉ豸µÄI/  
O£¬µ«ÊÇÎÒÃDz»¿¼ÂÇÕâÖÖÇé¿ö(Bach [1986] ÖеĵÚÈýÕ½²ÊöÁËÕâÖÖ»º´æÆ÷µÄ²Ù×÷)  
¡£¼ÈÈ»read»òwriteµÄÊý¾Ý¶¼Òª±»Äں˻º´æ£¬ÄÇôÊõÓï"ÎÞ»º´æ×°ÖõÄI/O"Ö¸µÄÊÇÔÚ  
Óû§µÄ½ø³ÌÖжÔÕâÁ½¸öº¯Êý²»»á×Ô¶¯»º´æ£¬Ã¿´Îread»òwrite¾ÍÒª½øÐÐÒ»´Îϵͳµ÷  
Óᣠ 
3.3 Ã¿´Îµ÷ÓÃopenº¯Êý¾Í·ÖÅäÒ»¸öÎļþ±íÏÈç¹ûÁ½´Î´ò¿ªµÄÊÇÏàͬµÄÎļþ£¬ÔòÁ½  
¸öÎļþ±íÏîÖ¸ÏòÏàͬµÄv½Úµã¡£µ÷ÓÃdupÒýÓÃÒÑ´æÔÚµÄÎļþ±íÏî(´Ë´¦Ö¸fd1µÄÎļþ±í  
Ïî)£¬¼ûͼC.1¡£µ±F_SETFD×÷ÓÃÓÚfd1ʱ£¬Ö»Ó°Ïìfd1µÄÎļþÃèÊö·û±êÖ¾£»F_SETFL×÷  
ÓÃÓÚfd1ʱ£¬ÔòÓ°Ïìfd1¼°fd2µÄÎļþÃèÊö·û±êÖ¾¡£  
ͼC.1 openºÍdupµÄ½á¹û  
3.4 Èç¹ûfdÊÇ1£¬Ö´ÐÐdup2(fd£¬1)ºó·µ»Ø1£¬µ«ÊÇûÓйرÕÃèÊö·û1(²Î¼û3.12½Ú)¡£  
µ÷ÓÃ3´Îdup2ºó£¬3¸öÃèÊö·ûÖ¸ÏòÏàͬµÄÎļþ±íÏËùÒÔ²»ÐèÒª¹Ø±ÕÃèÊö·û¡£  
        Èç¹ûfdÊÇ3£¬µ÷ÓÃ3´Îdup2ºó£¬ÓÐ4¸öÃèÊö·ûÖ¸ÏòÏàͬµÄÎļþ±íÏËùÒÔ¾ÍÐèÒª¹Ø±Õ  
ÃèÊö·û3¡£  
3.5 shellÊÇ´Ó×óµ½ÓÒ´¦ÀíÃüÁîÐÐ,ËùÒÔ  
a.out > outfile 2 >&1  
Ê×ÏÈÉèÖñê×¼Êä³öµ½outfile£¬È»ºóÖ´ÐÐdups½«±ê×¼Êä³ö¸´ÖƵ½ÃèÊö·û2(±ê×¼´íÎó  
)ÉÏ£¬Æä½á¹ûÊǽ«±ê×¼Êä³öºÍ±ê×¼´íÎóÉèÖÃΪÏàͬµÄÎļþ£¬¼´ÃèÊö·û1ºÍ2Ö¸ÏòÏàͬ  
µÄÎļþ±íÏî¡£  
        ¶ø¶ÔÓÚÃüÁîÐР 
                a.out 2 > &1 >outfile  
        ÓÉÓÚÊ×ÏÈÖ´ÐÐdups£¬ËùÒÔÃèÊö·û2³ÉΪÖÕ¶Ë(¼ÙÉèÃüÁîÊǽ»»¥Ö´ÐеÄ)£¬±ê×¼Êä³öÖØ  
¶¨Ïòµ½outfile¡£½á¹ûÊÇÃèÊö·û1Ö¸ÏòoutfileµÄÎļþ±íÏÃèÊö·û2Ö¸ÏòÖն˵ÄÎļþ  
±íÏî¡£  
3.6 ÕâÖÖÇé¿ö֮ϣ¬ÈÔÈ»¿ÉÒÔÓÃlseekºÍreadº¯Êý¶ÁÎļþÖÐÈκÎÒ»´¦µÄÄÚÈÝ¡£µ«ÊÇ  
writeº¯ÊýÔÚдÊý¾Ý֮ǰ»á×Ô¶¯½«ÎļþÆ«ÒÆÁ¿ÉèÖÃΪÎļþ⣬ËùÒÔдÎļþʱֻÄÜ´Ó  
Îļþβ¿ªÊ¼£¬²»ÄÜÔÚÈÎÒâλÖᣠ 
   
   
µÚËÄÕ  
4.1 statº¯Êý×ÜÊÇ˳һ¸ö·ûºÅÁ¬½ÓÏòǰ£¬ËùÒÔÐ޸ĺóµÄ³ÌÐò²»»áÏÔʾÎļþÀàÐÍÊÇ"  
·ûºÅÁ¬½Ó"¡£ÀýÈ磺/binÊÇ/usr/binµÄÒ»¸ö·ûºÅÁ¬½Ó£¬µ«ÊÇstatº¯ÊýµÄ½á¹ûÖ»ÏÔʾ  
/binÊÇÒ»¸öĿ¼£¬¶ø²»ËµÃ÷ËüÊÇÒ»¸ö·ûºÅÁ¬½Ó¡£ÈôÒ»¸ö·ûºÅÁ¬½ÓÖ¸ÏòÒ»²»´æÔÚµÄÎÄ  
¼þ£¬Ôòstat³ö´í·µ»Ø¡£  
4.2 ½«ÏÂÃæµÄ¼¸ÐÐÓï¾ä¼ÓÈë<ourhdr.h>  
                #if defined ( S_IFLNK )  &&  !defined ( S_ISLNK )  
                #define  S_ISLNK ( mode )   ((( mode ) & S_IFMT ) == S_IFLNK )  
                #endif  
        ÕâÊÇÒ»¸öÎÒÃDZàдµÄÍ·ÎļþÈçºÎÆÁ±ÎijЩϵͳ²î±ðµÄʵÀý¡£  
4.3 ¹Ø±ÕÁ˸ÃÎļþµÄËùÓдæÈ¡È¨ÏÞ¡£  
                $ umask 777  
                $ data > temp.foo  
                $ ls -l temp.foo  
                ----------              l       stevens 29      Jan     14  
6:39   temp.foo  
4.4 ÏÂÃæµÄÃüÁî±íʾ¹Ø±ÕÓû§¶ÁȨÏÞµÄÇé¿ö¡£  
                $ data > foo  
                $ chmod u-r foo                                         {¹Ø±ÕÓû  
¶ÁȨÏÞ}  
                $ ls -l foo  
ÑéÖ¤ÎļþµÄȨÏÞ}  
                --w-rw-r--      l       stevens 29      Jul     31      09:00  
oo  
                $ cat foo  
       {¶ÁÎļþ}  
                cat: foo: Permission denied  
4.5 Èç¹ûÓÃopen»òcreat´´½¨ÒѾ­´æÔÚµÄÎļþ£¬Ôò¸ÃÎļþµÄ´æÈ¡È¨ÏÞ²»±ä¡£Í¨¹ý³Ì  
Ðò4.3¿ÉÒÔÑéÖ¤Õâµã¡£  
                $ rm foo bar  
ɾ³ýÎļþ}  
                $ data > foo  
´´½¨Îļþ}  
                $ data > bar  
                $ chmod a-r foo bar                                     {¹Ø±ÕËùÓ  
µÄ¶ÁȨÏÞ}  
                $ ls -l foo bar                                         {ÑéÖ¤ÆäÈ  
ÏÞ}  
                --w--w----      l       stevens 29      Jul     31      10:47  
ar  
                --w--w----      l       stevens 29      Jul     31      10:47  
oo  
                $ a.out  
ÔËÐгÌÐò4.3}  
        $ ls -l foo bar                                         {¼ì²éÎļþµÄȨÏÞº  
´óС}  
        --w--w----      l       stevens 0       Jul     31      10:47   bar  
                --w--w----      l       stevens 0       Jul     31      10:47  
oo  
¿ÉÒÔ¿´³ö´æÈ¡È¨ÏÞûÓиı䣬µ«ÊÇÎļþ³¤¶ÈËõ¶ÌÁË¡£  
4.6 Ä¿Â¼µÄ³¤¶È´ÓÀ´²»»áÊÇ0£¬ÒòΪËü×ÜÊǰüº¬ .ºÍ ..Á½Ïî¡£·ûºÅÁ¬½ÓµÄ³¤¶ÈÖ¸Æä  
·¾¶ÃûµÄ°üº¬µÄ×Ö·ûÊý£¬ÓÉÓÚ·¾¶ÃûÖÐÖÁÉÙÓÐÒ»¸ö×Ö·û£¬ËùÒÔ³¤¶ÈÒ²²»Îª0¡£  
4.8 µ±´´½¨ÐµÄcoreÎļþʱ£¬ÄÚºË¶ÔÆä´æÈ¡È¨ÏÞÓÐÒ»¸öĬÈÏÉèÖã¬ÔÚ±¾ÀýÖÐÊÇ£ºr  
w-r--r--¡£Õâһȱʡֵ¿ÉÄÜ»áÒ²Ðí²»»á±»umaskµÄÖµÐ޸ġ£Shell¶Ô´´½¨µÄÖØ¶¨ÏòµÄ  
ÐÂÎļþÒ²ÓÐÒ»¸öĬÈϵķÃÎÊȨÏÞ£¬±¾ÀýÖÐΪrw-rw-rw-¡£Õâ¸öÖµ×ÜÊDZ»µ±Ç°µÄumas  
kÐ޸ģ¬ÔÚ±¾ÀýÖÐumaskΪ02¡£  
4.9 ²»ÄÜʹÓÃduµÄÔ­ÒòÊÇËüÐèÒªÎļþÃû»òĿ¼Ãû×÷Ϊ²ÎÊý£¬ÀýÈ磺  
                du tempfile  
                du .  
        Ö»Óе±unlinkº¯Êý·µ»ØÊ±²ÅÊÍ·ÅtempfileµÄĿ¼ÏduÃüÁîûÓмÆËãÈÔÈ»±»temp  
fileÕ¼ÓõĿռ䡣ÔÚ±¾ÀýÖÐÖ»ÄÜʹÓÃdfÃüÁî²ì¿´ÎļþϵͳÖÐʵ¼Ê¿ÉÓõÄ×ÔÓɿռ䡣  
   
4.10 Èç¹û±»unlinkµÄÁ´½Ó²»ÊǸÃÎļþµÄ×îºóÒ»¸öÁ´½Ó£¬¸ÃÎļþ²»»áɾ³ý¡£´Ëʱ£¬  
unlinkº¯Êý¸üÐÂÎļþµÄ״̬¸Ä±äʱ¼ä¡£Èç¹ûÊÇ×îºóÒ»¸öÁ´½Ó£¬¸ÃÎļþ½«±»ÎïÀíɾ³ý  
¡£ÕâʱÔÙÈ¥¸üÐÂÎļþµÄ״̬¸Ä±äʱ¼ä¾ÍûÓÐÒâÒ壬ÒòΪ°üº¬ÎļþËùÓÐÐÅÏ¢µÄi½Úµã  
½«»áËæ×ÅÎļþµÄɾ³ý¶ø±»ÊÍ·Å¡£  
4.11 ÓÃopendir´ò¿ªÒ»¸öĿ¼ºó£¬Ñ­»·µ÷Óú¯Êýdopath¡£¼ÙÉèopendirʹÓÃÒ»¸öÎÄ  
¼þÃèÊö·û£¬²¢ÇÒÖ»Óд¦ÀíÍêĿ¼ºóµ÷ÓÃclosedir²ÅÊÍ·ÅÃèÊö·û£¬Õâ¾ÍÒâζ×Åÿ´Î´ò  
¿ªÄ¿Â¼¾ÍÒª½µÒ»¼¶Ê¹ÓÃÁíÍâÒ»¸öÃèÊö·û¡£ËùÒÔϵͳ¿É´ò¿ªÎļþÊý¾ÍÏÞÖÆÁËÎļþϵͳ  
ÖÐÊ÷µÄÉî¶È¡£SVR4ÖеÄftwÔÊÐíµ÷ÓÃÕßÖ¸¶¨Ê¹ÓõÄÃèÊö·ûÊý£¬ÕâÒþº¬×ŸÃʵÏÖ¿ÉÒÔ  
¹Ø±ÕÃèÊö·û²¢ÇÒÖØÓÃËüÃÇ¡£  
4.13 chrootº¯ÊýÓÃÓÚ¸¨ÖúInternetÎļþ´«Êä³ÌÐò(FTP)ÖеݲȫÐÔ¡£ÏµÍ³ÖÐûÓÐÕÊ  
ºÅµÄÓû§(Ò²³ÆÎªÄäÃûFTP)·ÅÔÚÒ»¸öµ¥¶ÀµÄĿ¼Ï£¬ÀûÓÃchroot½«´ËĿ¼µ±×÷еĠ 
¸ùĿ¼¾Í¿ÉÒÔ×èÖ¹Óû§·ÃÎÊ´ËĿ¼ÒÔÍâµÄÎļþ¡£  
        chrootÒ²ÓÃÓÚÔÚÁíһ̨»úÆ÷ÉϹ¹ÔìÒ»Îļþϵͳ²ã´Î½á¹¹µÄÒ»¸ö¸±±¾£¬È»ºóÐ޸Ĵˠ 
¸±±¾£¬µ«²»¸ü¸ÄÔ­À´µÄÎļþϵͳ¡£Õâ¿ÉÓÃÔ¤²âÊÇÐÂÈí¼þ°ü×°µÈ³¡ºÏ¡£ChrootÖ»ÄÜÓР 
³¬¼¶Óû§Ê¹Óã¬Ò»µ©¸ü¸ÄÁËÒ»¸ö½ø³ÌµÄroot£¬¸Ã½ø³Ì¼°Æäºó´ú½ø³Ì¾ÍÔÙÒ²²»Äָܻ´  
ÖÁÔ­ÏȵÄroot¡£  
4.14 Ê×Ïȵ÷ÓÃstatº¯ÊýÈ¡µÃÎļþµÄÈý¸öʱ¼äÖµ£¬È»ºóµ÷ÓÃutimeÉèÖÃÆÚÍûµÄÖµ¡£ÎÒ  
ÃDz»Ï£ÍûÔÚµ÷ÓÃutime¸Ä±äµÄÖµ¾ÍÊÇstatÖÐÏàÓ¦µÄÖµ¡£  
4.15 finger(1)¶ÔÓÊÏäµ÷ÓÃstatº¯Êý£¬×î½üÒ»´ÎµÄÐÞ¸Äʱ¼äÊÇÉÏÒ»´Î½ÓÊÕÓʼþµÄʱ  
¼ä£¬×î½ü·ÃÎÊʱ¼äÊÇÉÏÒ»´Î¶ÁÓʼþµÄʱ¼ä¡£  
4.16 ¶ÔcpioÀ´Ëµ£¬¼È¿ÉÒԸıäÎļþµÄ·ÃÎÊʱ¼ä(st_atime)ºÍÐÞ¸Äʱ¼ä(st_mtime)  
Ò²¿ÉÒÔ¶¼²»¸Ä±ä¡£cpioµÄ-aÑ¡Ïî¿ÉÒÔÔÚ¶ÁÎļþºóÖØÐÂÉèÖÃÎļþµÄ·ÃÎÊʱ¼äΪ¶ÁÎļþ  
ǰµÄʱ¼ä£¬ËùÒÔcpio¿ÉÒÔ²»¸Ä±äÎļþµÄ·ÃÎÊʱ¼ä¡£ÁíÒ»·½Ã棬-mÑ¡ÏÎļþµÄÐ޸Ġ 
ʱ¼ä±£´æÎªÔ­À´µÄÐÞ¸Äʱ¼ä¡£  
¶ÔtarÀ´Ëµ£¬ÔÚ³éÈ¡Îļþʱ£¬Æäȱʡ·½Ê½ÊǸ´Ô­¹éµµÊ±µÄÐÞ¸Äʱ¼ä£¬µ«ÊÇ-mÑ¡ÏîÔò  
½«ÐÞ¸Äʱ¼äÉèÖÃΪ³éÈ¡ÎļþʱµÄʱ¼ä¡£ÎÞÂÛtarÔÚºÎÖÖÇé¿ö£¬ÎļþµÄ·ÃÎÊʱ¼ä¾ùÊÇ  
³éÈ¡ÎļþʱµÄʱ¼ä¡£  
        ÓÉÓÚ²»ÄÜÐÞ¸Ä״̬¸Ä±äʱ¼ä(utimeÒ²Ö»Äܸıä·ÃÎÊʱ¼äºÍÐÞ¸Äʱ¼ä)£¬ËùÒÔûÓн«  
Æä±£´æÔÚÎĵµÉÏ¡£  
4.17 read¸Ä±äÁËÎļþ·ÃÎÊʱ¼ä£¬ÎªÁËÏû³ýÕâÒ»Ó°Ï죬ÓÐЩ°æ±¾µÄfile(1)µ÷ÓÃuti  
me»Ö¸´ÎļþµÄ·ÃÎÊʱ¼ä£¬µ«ÊÇÕâÑù×ö»áÐÞ¸ÄÎļþµÄ״̬¸Ä±äʱ¼ä¡£  
4.18 Äں˶ÔĿ¼µÄÉî¶ÈûÓÐÄÚÔÚµÄÏÞÖÆ£¬µ«ÊÇÈç¹û·¾¶ÃûµÄ³¤¶È³¬³öÁËPATH_MAX  
ÓÐÐí¶àÃüÁî»áʧ°Ü¡£³ÌÐòC.2´´½¨ÁËÒ»¸öÉî¶ÈΪ100µÄĿ¼Ê÷£¬Ã¿Ò»¼¶Ä¿Â¼ÃûÓÐ45¸ö  
×Ö·û¡£ÀûÓÃgetcwd¿ÉÒԵõ½µÚ100¼¶Ä¿Â¼µÄ¾ø¶Ô·¾¶Ãû(ÐèÒª¶à´Îµ÷ÓÃreallocÉêÇë  
Ò»¸ö×ã¹»´óµÄ»º´æ)¡£  
#include        <sys/types.h>  
#include        <sys/stat.h>  
#include        <fcntl.h>  
#include        "ourhdr.h"  
#define DEPTH   100                     /* directory depth */  
#define MYHOME  "/home/stevens"  
#define NAME    "alonglonglonglonglonglonglonglonglonglongname"  
int  
main(void)  
{  
        int             i, size;  
        char    *path;  
        if (chdir(MYHOME) < 0)  
                err_sys("chdir error");  
        for (i = 0; i < DEPTH; i++) {  
                if (mkdir(NAME, DIR_MODE) < 0)  
                        err_sys("mkdir failed, i = %d", i);  
                if (chdir(NAME) < 0)  
                        err_sys("chdir failed, i = %d", i);  
        }  
        if (creat("afile", FILE_MODE) < 0)  
                err_sys("creat error");  
        /*  
         * The deep directory is created, with a file at the leaf.  
         * Now let's try and obtain its pathname.  
         */  
        path = path_alloc(&size);  
        for ( ; ; ) {  
                if (getcwd(path, size) != NULL)  
                        break;  
                else {  
                        err_ret("getcwd failed, size = %d", size);  
                        size += 100;  
                        if ( (path = realloc(path, size)) == NULL)  
                                err_sys("realloc error");  
                }  
        }  
        printf("length = %d\n%s\n", strlen(path), path);  
        exit(0);  
}  
³ÌÐòC.2  ´´½¨Éî¶ÈĿ¼  
ÔËÐкóµÃµ½£º  
                $ a.out  
                getcwd failed, size = 1025: Result too large  
                getcwd failed, size = 1125: Result too large  
                ¡­                                              { 33ÐÐ}  
                getcwd failed, size = 4525: Result too large  
                length = 4613  
                {ÏÔʾ4613×ֽڵķ¾¶Ãû}  
        µ«ÊÇÓÉÓÚÎļþÃûÌ«³¤ÁË£¬²»ÄÜÓÃtar»òcpio¶Ô¸ÃĿ¼½¨Á¢µµ°¸Îļþ£¬¶øÇÒÒ²²»ÄÜÓà 
rm -rÃüÁîɾ³ý¸ÃĿ¼¡££¨ÎÒÃÇÔõÑù²ÅÄÜɾ³ý¸ÃĿ¼Ê÷£¿£©  
4.19 /devĿ¼¹Ø±ÕÁËÒ»°ãÓû§µÄдȨÏÞ£¬ËùÒÔÓû§²»ÄÜɾ³ýĿ¼ÖеÄÎļþ£¬¼´un  
linkʧ°Ü¡£  
   
   
µÚÎåÕ  
5.2 fgetsº¯Êý¶ÁÈëÊý¾Ý£¬Ö±µ½ÐнáÊø»ò»º³åÇøÂú(µ±È»»áÁô³öÒ»¸ö×Ö½Ú´æ·Å'\0')  
¡£Í¬Ñù£¬fputsÖ»¸ºÔ𽫻º³åÇøµÄÄÚÈÝÊä³ö£¬¶ø²¢²»¿¼ÂÇ»º³åÇøÖÐÊÇ·ñ°üº¬»»Ðзû  
¡£ËùÒÔ£¬Èç¹û½«MAXLINEÉèµÃºÜС£¬ÕâÁ½¸öº¯ÊýÈÔÈ»»áÕý³£¹¤×÷£¬Ö»²»¹ý±»Ö´ÐеĠ 
´ÎÊýÒª±ÈMAXLINEÖµ½Ï´óµÄʱºò¶à¡£  
5.3 µ±printfûÓÐÊä³öÈκÎ×Ö·ûʱ£¬È磺printf("") £¬·µ»Ø0¡£  
5.4 ÕâÊÇÒ»¸ö±È½Ï³£¼ûµÄ´íÎó¡£getcÒÔ¼°getcharµÄ·µ»ØÖµÊÇÕûÐÍ£¬¶ø²»ÊÇ×Ö·ûÐÍ  
¡£ÓÉÓÚEOF¾­³£¶¨ÒåΪ-1£¬ÄÇôÈç¹ûϵͳʹÓõÄÊÇÓзûºÅµÄ×Ö·ûÀàÐÍ£¬³ÌÐò»¹¿ÉÒÔ  
Õý³£¹¤×÷¡£µ«Èç¹ûʹÓõÄÊÇÎÞ·ûºÅ×Ö·ûÀàÐÍ£¬ÄÇô·µ»ØµÄEOF±»±£´æµ½×Ö·ûcºó½«²»  
ÔÙÊÇ-1£¬ËùÒÔ£¬³ÌÐò»á½øÈëËÀÑ­»·¡£  
5.5 5¸ö×Ö·û³¤µÄǰ׺¡¢4¸ö×Ö·û³¤µÄ½ø³ÌÄÚΨһ±êʶÔÙ¼Ó5¸ö×Ö·û³¤µÄϵͳÄÚΨһ  
±êʶ(½ø³ÌID)¸ÕºÃ×é³É14λµÄUNIX´«Í³Îļþ³¤¶ÈÏÞÖÆ¡£  
5.6 Ê¹Ó÷½·¨Îª£ºÏȵ÷ÓÃfflushºóµ÷ÓÃfsync£¬fsyncËùʹÓõIJÎÊýÓÉfilenoº¯Êý»ñ  
µÃ¡£Èç¹û²»µ÷ÓÃfflush£¬ËùÓеÄÊý¾ÝÈÔÈ»ÔÚÄڴ滺³åÇøÖУ¬´Ëʱµ÷ÓÃfsync½«Ã»ÓР 
ÈκÎЧ¹û¡£  
5.7 µ±³ÌÐò½»»¥ÔËÐÐʱ£¬±ê×¼ÊäÈëÊä³öÉ豸¾ùΪÐлº³å·½Ê½¡£Ã¿´Îµ÷ÓÃfgetsʱ±ê  
×¼Êä³öÉ豸½«×Ô¶¯Ë¢Çå¡£  
   
   
µÚÁùÕ  
6.1 ÔÚSVR4ϵͳÖУ¬Óû§ÊÖ²áÖн²ÊöÁË»ñÈ¡ÒõÓ°ÃÜÂëÎļþµÄº¯Êý¡£ÎÒÃDz»ÄÜʹÓÃ6  
.2½ÚËùÊöº¯Êý·µ»ØµÄpw_passwd±äÁ¿À´±È½Ï¼ÓÃܵĿÚÁî¡£ÕýÈ·µÄ·½·¨ÊÇʹÓÃÒõÓ°ÃÜ  
ÂëÎļþÖжÔÓ¦Óû§µÄ¼ÓÃÜ¿ÚÁîÀ´½øÐбȽϡ£  
        ÔÚ4.3+ BSDϵͳÖУ¬ÃÜÂëÎļþµÄÒõÓ°ÊÇ×Ô¶¯½¨Á¢µÄ¡£½öµ±µ÷ÓÃÕßµÄÓû§IDΪ0ʱ£¬  
getpwnam»ògetpwuidº¯Êý·µ»ØµÄpassed½á¹¹ÖеÄpw_passwd×ֶβŰüº¬ÓмÓÃܵĿڠ 
Áî¡£  
6.2 ÔÚSVR4ϵͳÖУ¬³ÌÐòC.3½«Êä³ö¼ÓÃܵĿÚÁî¡£µ±È»£¬³ý·ÇÓг¬¼¶Óû§È¨ÏÞ£¬·ñ  
Ôòµ÷ÓÃgetspnam½«·µ»ØEACCESS´íÎó¡£  
#include        <sys/types.h>  
#include        <shadow.h>  
#include        "ourhdr.h"  
int  
main(void)              /* SVR4 version */  
{  
        struct spwd     *ptr;  
        if ( (ptr = getspnam("stevens")) == NULL)  
                err_sys("getspnam error");  
        printf("sp_pwdp = %s\n",  
                                ptr->sp_pwdp == NULL || ptr->sp_pwdp[0] == 0 ?  
                                "(null)" : ptr->sp_pwdp);  
        exit(0);  
}  
³ÌÐòC.3  ÔÚSVR4ϵͳÖÐÊä³ö¼ÓÃܵĿÚÁî  
        ÔÚ4.3+ BSDϵͳÖУ¬¾ßÓг¬¼¶Óû§È¨ÏÞʱ£¬³ÌÐòC.4½«Êä³ö¼ÓÃܵĿÚÁî¡£·ñÔòpw_  
passedµÄ·µ»ØÖµÎªÐǺÅ(*)¡£  
#include        <sys/types.h>  
#include        <pwd.h>  
#include        "ourhdr.h"  
int  
main(void)              /* 44BSD version */  
{  
        struct passwd   *ptr;  
        if ( (ptr = getpwnam("stevens")) == NULL)  
                err_sys("getpwnam error");  
        printf("pw_passwd = %s\n",  
                                ptr->pw_passwd == NULL || ptr->pw_passwd[0] == 0  
?  
                                "(null)" : ptr->pw_passwd);  
        exit(0);  
}  
³ÌÐòC.4  ÔÚ4.3+ BSDϵͳÖÐÊä³ö¼ÓÃܵĿÚÁî  
6.4  
#include        <time.h>  
#include        "ourhdr.h"  
int  
main(void)  
{  
        time_t          caltime;  
        struct tm       *tm;  
        char            line[MAXLINE];  
        if ( (caltime = time(NULL)) == -1)  
                err_sys("time error");  
        if ( (tm = localtime(&caltime)) == NULL)  
                err_sys("localtime error");  
        if (strftime(line, MAXLINE, "%a %b %d %X %Z %Y\n", tm) == 0)  
                err_sys("strftime error");  
        fputs(line, stdout);  
        exit(0);  
}  
³ÌÐòC.5  ÒÔdate(1)µÄ¸ñʽÊä³öÈÕÆÚºÍʱ¼ä  
³ÌÐòC.5µÄÔËÐнá¹ûÈçÏ£º  
        $ echo $TZ  
MST7  
$ a.out  
Wed Jan 15 06:48:57 MST 1992  
$ TZ=EST5EDT a.out                      U.S.East Coast  
Wed Jan 15 08:49:06 EST 1992  
$ TZ=JST-9 a.out                                Japan  
Wed Jan 15 22:49:12 JST 1992  
   
   
µÚÆßÕ  
7.1 Ô­ÒòÔÚÓÚprintfµÄ·µ»ØÖµ(Êä³öµÄ×Ö·ûÊý)±ä³ÉÁËmainº¯ÊýµÄ·µ»ØÂë¡£µ±È»£¬²¢  
²»ÊÇËùÓеÄϵͳ¶¼»á³öÏÖ¸ÃÇé¿ö¡£  
7.2 µ±³ÌÐò´¦ÓÚ½»»¥ÔËÐз½Ê½Ê±£¬±ê×¼Êä³öÉ豸ͨ³£´¦ÓÚÐлº³å·½Ê½£¬ËùÒÔµ±¼üÈë  
ÐÂÐзûʱ£¬ÉϴεĽá¹û²Å±»ÕæÕýÊä³ö¡£Èç¹û±ê×¼Êä³öÉ豸±»¶¨Ïòµ½Ò»¸öÎļþ¶ø´¦ÓÚ  
ÍêÈ«»º³å·½Ê½£¬Ôòµ±±ê×¼I/OÇåÀí²Ù×÷Ö´ÐÐʱ£¬½á¹û²ÅÕæÕý±»Êä³ö¡£  
7.3 ÓÉÓÚagrcºÍargv²»ÏóenvironÒ»Ñù±£´æÔÚÈ«¾Ö±äÁ¿ÖУ¬ËùÒÔÔÚ´ó¶àÊýUnixϵͳ  
ÖÐûÓÐÆäËü°ì·¨¡£  
7.4 µ±C³ÌÐò¸´ÒýÓÃÒ»¸ö¿ÕÖ¸Õë³ö´íʱ£¬Ö´ÐиóÌÐòµÄ½ø³Ì½«ÖÕÖ¹£¬ÓÚÊÇ¿ÉÒÔÀûÓà 
ÕâÖÖ·½·¨ÖÕÖ¹½ø³Ì¡£  
7.5 ¶¨ÒåÈçÏ£º  
                typedef void    Exitfunc ( void ) ;  
                int  atexit ( Exitfunc *func ) ;  
7.6 calloc½«·ÖÅäµÄÄÚ´æ¿Õ¼ä³õʼ»¯Îª0¡£µ«ÊÇANSI C²¢²»±£Ö¤0ÖµÓ븡µã0»ò¿ÕÖ¸  
ÕëµÄÖµÏàͬ¡£  
7.7 Ö»ÓÐͨ¹ýexecº¯ÊýÖ´ÐÐÒ»¸ö³ÌÐòʱ£¬²Å»á·ÖÅä¶ÑºÍ¶ÑÕ»¡£  
7.8 ¿ÉÖ´ÐÐÎļþ°üº¬ÁËÓÃÓÚµ÷ÊÔcoreÎļþµÄ·ûºÅ±íÐÅÏ¢£¬ÓÃstrip(1)¿ÉÒÔɾ³ýÕâЩ  
ÐÅÏ¢£¬¶ÔÁ½¸öa.outÎļþÖ´ÐÐÕâÌõÃüÁËüÃǵĴóС¼õΪ98304ºÍ16384¡£  
7.9 Ã»ÓÐʹÓù²Ïí¿âʱ£¬¿ÉÖ´ÐÐÎļþµÄ´ó²¿·Ö¶¼±»±ê×¼I/O¿âËùÕ¼Óᣠ 
7.10 Õâ¶Î´úÂë²»ÕýÈ·¡£ÒòΪÔÚifÓï¾äÖж¨ÒåÁË×Ô¶¯±äÁ¿val£¬ËùÒÔµ±ifÖеĸ´ºÏÓï  
¾ä½áÊøÊ±£¬¸Ã±äÁ¿¾Í²»´æÔÚÁË£¬µ«ÊÇÔÚifÓï¾äÖ®ÍâÓÖÓÃÖ¸ÕëÒýÓÃÒѾ­²»´æÔÚµÄ×Ô¶¯  
±äÁ¿val¡£  
µÚÆßÕ  
7.1 Ô­ÒòÔÚÓÚprintfµÄ·µ»ØÖµ(Êä³öµÄ×Ö·ûÊý)±ä³ÉÁËmainº¯ÊýµÄ·µ»ØÂë¡£µ±È»£¬²¢  
²»ÊÇËùÓеÄϵͳ¶¼»á³öÏÖ¸ÃÇé¿ö¡£  
7.2 µ±³ÌÐò´¦ÓÚ½»»¥ÔËÐз½Ê½Ê±£¬±ê×¼Êä³öÉ豸ͨ³£´¦ÓÚÐлº³å·½Ê½£¬ËùÒÔµ±¼üÈë  
ÐÂÐзûʱ£¬ÉϴεĽá¹û²Å±»ÕæÕýÊä³ö¡£Èç¹û±ê×¼Êä³öÉ豸±»¶¨Ïòµ½Ò»¸öÎļþ¶ø´¦ÓÚ  
ÍêÈ«»º³å·½Ê½£¬Ôòµ±±ê×¼I/OÇåÀí²Ù×÷Ö´ÐÐʱ£¬½á¹û²ÅÕæÕý±»Êä³ö¡£  
7.3 ÓÉÓÚagrcºÍargv²»ÏóenvironÒ»Ñù±£´æÔÚÈ«¾Ö±äÁ¿ÖУ¬ËùÒÔÔÚ´ó¶àÊýUnixϵͳ  
ÖÐûÓÐÆäËü°ì·¨¡£  
7.4 µ±C³ÌÐò¸´ÒýÓÃÒ»¸ö¿ÕÖ¸Õë³ö´íʱ£¬Ö´ÐиóÌÐòµÄ½ø³Ì½«ÖÕÖ¹£¬ÓÚÊÇ¿ÉÒÔÀûÓà 
ÕâÖÖ·½·¨ÖÕÖ¹½ø³Ì¡£  
7.5 ¶¨ÒåÈçÏ£º  
                typedef void    Exitfunc ( void ) ;  
                int  atexit ( Exitfunc *func ) ;  
7.6 calloc½«·ÖÅäµÄÄÚ´æ¿Õ¼ä³õʼ»¯Îª0¡£µ«ÊÇANSI C²¢²»±£Ö¤0ÖµÓ븡µã0»ò¿ÕÖ¸  
ÕëµÄÖµÏàͬ¡£  
7.7 Ö»ÓÐͨ¹ýexecº¯ÊýÖ´ÐÐÒ»¸ö³ÌÐòʱ£¬²Å»á·ÖÅä¶ÑºÍ¶ÑÕ»¡£  
7.8 ¿ÉÖ´ÐÐÎļþ°üº¬ÁËÓÃÓÚµ÷ÊÔcoreÎļþµÄ·ûºÅ±íÐÅÏ¢£¬ÓÃstrip(1)¿ÉÒÔɾ³ýÕâЩ  
ÐÅÏ¢£¬¶ÔÁ½¸öa.outÎļþÖ´ÐÐÕâÌõÃüÁËüÃǵĴóС¼õΪ98304ºÍ16384¡£  
7.9 Ã»ÓÐʹÓù²Ïí¿âʱ£¬¿ÉÖ´ÐÐÎļþµÄ´ó²¿·Ö¶¼±»±ê×¼I/O¿âËùÕ¼Óᣠ 
7.10 Õâ¶Î´úÂë²»ÕýÈ·¡£ÒòΪÔÚifÓï¾äÖж¨ÒåÁË×Ô¶¯±äÁ¿val£¬ËùÒÔµ±ifÖеĸ´ºÏÓï  
¾ä½áÊøÊ±£¬¸Ã±äÁ¿¾Í²»´æÔÚÁË£¬µ«ÊÇÔÚifÓï¾äÖ®ÍâÓÖÓÃÖ¸ÕëÒýÓÃÒѾ­²»´æÔÚµÄ×Ô¶¯  
±äÁ¿val¡£  
   
   
µÚ°ËÕ  
8.1 ÓÃÏÂÃæ¼¸ÐдúÌæ³ÌÐò8.2Öе÷ÓÃprintfµÄÓï¾ä¡£  
        i = printf ("pid = %d, glob = %d, var = %d\n", getpid( ), glob, var);  
        sprintf (buf, "%d\n", i);  
                write (STDOUT_FILENO, buf, strlen(buf));  
        ×¢ÒâÒª¶¨Òå±äÁ¿iºÍbuf¡£  
        ÕâÀï¼ÙÉè×Ó½ø³Ìµ÷ÓÃexitʱֻ¹Ø±Õ±ê×¼I/OÁ÷£¬²¢²»¹Ø±ÕÓë±ê×¼Êä³öÏà¹ØµÄÎļþÃè  
Êö·ûSTDOUT_FILENO¡£ÓÐЩ°æ±¾µÄ±ê×¼I/O¿â»á¹Ø±ÕÓë±ê×¼Êä³öÏà¹ØµÄÎļþÃèÊö·û´Ó  
¶øÒýÆðдʧ°Ü£¬ÕâÖÖÇé¿ö¾Íµ÷ÓÃdup½«±ê×¼Êä³ö¸´ÖƵ½ÁíÒ»¸öÃèÊö·û£¬writeÔòʹÓà 
и´ÖƵÄÎļþÃèÊö·û¡£  
8.2 ÎÒÃÇ¿ÉÒÔͨ¹ý³ÌÐòC.6À´ËµÃ÷Õâ¸öÎÊÌâ¡£  
#include        <sys/types.h>  
#include        "ourhdr.h"  
static void     f1(void), f2(void);  
int  
main(void)  
{  
        f1();  
        f2();  
        _exit(0);  
}  
static void  
f1(void)  
{  
        pid_t   pid;  
        if ( (pid = vfork()) < 0)  
                err_sys("vfork error");  
        /* child and parent both return */  
}  
static void  
f2(void)  
{  
        char    buf[1000];              /* automatic variables */  
        int             i;  
        for (i = 0; i < sizeof(buf); i++)  
                buf[i] = 0;  
}  
³ÌÐòC.6  ´íÎóʹÓÃvforkµÄÀý×Ó  
ͼC.2   µ÷ÓÃvforkʱµÄÕ»Ö¡  
µ±º¯Êýf1µ÷ÓÃvforkʱ£¬¸¸½ø³ÌµÄ¶ÑÕ»Ö¸Õë¾ÍÖ¸Ïòf1µÄÕ»Ö¡£¬¼ûͼC.2¡£vforkʹµÃ  
×Ó½ø³ÌÏÈÖ´ÐÐÈ»ºó´Óf1·µ»Ø£¬½Ó×Å×Ó½ø³Ìµ÷ÓÃf2²¢ÇÒ¸²¸ÇÁËf1µÄ¶ÑÕ»Çø¼ä£¬ÔÚf2ÖР 
×Ó½ø³Ì½«×Ô¶¯±äÁ¿bufµÄÖµÖÃΪ0£¬¼´½«¶ÑÕ»ÖеÄ1000¸ö×Ö½ÚµÄÖµ¶¼ÖÃΪ0¡£´Óf2·µ  
»Øºó¸¸½ø³Ì¼ÌÐøÖ´Ðе÷ÓÃ_exit£¬Õâʱ¶ÑÕ»ÖÐmainÒÔϵÄÄÚÈÝÒѾ­±»f2ÐÞ¸ÄÁË£¬µ«  
ÊǸ¸½ø³ÌÈÔÈ»ÒÔΪµ÷ÓÃÁËvforkºó´Óf1·µ»Ø¡£·µ»ØÐÅÏ¢ËäÈ»±£´æÔÚ¶ÑÕ»ÖУ¬µ«Êǿɠ 
ÄÜÒѾ­±»×Ó½ø³ÌÐÞ¸ÄÁË¡£¶ÔÕâ¸öÀý×Ó£¬¸¸½ø³Ì¼ÌÐøÖ´ÐеĽá¹ûÒªÒÀÀµÓÚʵ¼ÊµÄUni  
xϵͳ¡£(È磺·µ»ØÐÅÏ¢±£´æÔÚ¶ÑÕ»µÄ¾ßÌåλÖã¬Ð޸Ķ¯Ì¬±äÁ¿Ê±¸²¸ÇÁËÄÄЩÐÅÏ¢µÈ  
µÈ¡£)ͨ³£µÄ½á¹ûÊÇÒ»¸öcoreÎļþ¡£  
8.3 ³ÌÐò8.7ÖÐÎÒÃÇÏÈÈø¸½ø³ÌÊä³ö£¬µ«Êǵ±¸¸½ø³ÌÊä³öÍê±Ï×Ó½ø³ÌÒªÊä³öʱ£¬ÎÒ  
ÃÇÒªÈø¸½ø³ÌÖÕÖ¹¡£ÊÇ·ñ¸¸½ø³ÌÏÈÖÕÖ¹»òÊÇ×Ó½ø³ÌÏÈÖ´ÐÐÊä³öÒªÒÀÀµÓÚÄں˶ÔÁ½¸ö  
½ø³ÌµÄµ÷¶È¡£shellÔÚ¸¸½ø³ÌÖÕÖ¹ºó»á¿ªÊ¼Ö´ÐÐÆäËü³ÌÐò£¬ÕâÑùÒ²ÐíÈÔ»áÓ°Ïì×Ó½ø  
³Ì¡£Òª±ÜÃâÕâÖÖÇé¿ö¾ÍÊÇÔÚ×Ó½ø³ÌÍê³ÉÊä³öºó²ÅÖÕÖ¹¸¸½ø³Ì¡£ÓÃÏÂÃæµÄÓï¾äÌæ»»³Ì  
ÐòÖÐforkºóÃæµÄ´úÂë¡£ÓÉÓÚÖ»ÓÐÖÕÖ¹¸¸½ø³Ì²ÅÄÜ¿ªÊ¼ÏÂÒ»¸ö³ÌÐò£¬ËùÒÔ²»»á³öÏÖÉÏ  
ÃæµÄÇé¿ö¡£  
                else if ( pid == 0 ) {  
                        WAIT_PARENT( ) ;  
       /*parent goes first */  
                        charatatime ( "output form child\n" ) ;  
                        TELL_PARENT ( getppid( )) ;  
* tell parent we're done */  
                } else {  
                        charatatime ( "output from parent\n" ) ;  
                        TELL_CHILD ( pid ) ;  
* tell child we're done */  
                        WAIT_CHILD ( ) ;  
       /* wait for child to finish */  
   
8.4 ¶Ôargv[2]´òÓ¡µÄÊÇÏàͬµÄÖµ£¨/home/stevens/bin/testinterp£©¡£Ô­ÒòÊÇex  
eclpÔÚ½áÊøÊ±µ÷ÓÃÁËexecve£¬²¢ÇÒÓëÖ±½Óµ÷ÓÃexeclµÄ·¾¶ÃûÏàͬ¡£  
8.5²»Ìṩ·µ»Ø±£´æµÄÓû§IDµÄº¯Êý£¬ÎÒÃDZØÐëÔÚ½ø³Ì¿ªÊ¼Ê±±£´æÓÐЧµÄÓû§ID¡£  
   
8.6 ³ÌÐòC.7´´½¨ÁËÒ»¸özombie¡£  
#include        "ourhdr.h"  
int  
main(void)  
{  
        pid_t   pid;  
        if ( (pid = fork()) < 0)  
                err_sys("fork error");  
        else if (pid == 0)              /* child */  
                exit(0);  
        /* parent */  
        sleep(4);  
        system("ps");  
        exit(0);  
}  
³ÌÐòC.7  ´´½¨Ò»¸özombie²¢ÓÃps²é¿´Æä״̬  
        Ö´ÐгÌÐò½á¹ûÈçÏ£¨ps£¨1£©ÓÃ"Z"±íʾZombie£©£º  
                $ a.out  
                 PID TT STAT    TIME COMMAND  
                5940 p3 S       0:00 a.out  
                5941 p3 Z       0:00 <defunct>                  the zombie  
                5942 p3 S       0:00 sh -c ps  
                5943 p3 R       0:00 ps  
   
   
   
µÚ¾ÅÕ  
9.1 ÒòΪinitÊÇlogin shellµÄ¸¸½ø³Ì£¬µ±login shellÖÕֹʱËüÊÕµ½SIGCHLDÐźŠ 
Á¿£¬ËùÒÔinit½ø³ÌÖªµÀʲôʱºòÖÕ¶ËÓû§×¢Ïú¡£  
        ÍøÂçloginûÓаüº¬init£¬ÏàÓ¦µÄlogoutÏîÊÇÓÉÒ»¸ö´¦Àílogin²¢¼à²âlogoutµÄ½ø  
³ÌдµÄ¡£(±¾ÀýÖÐΪtelnetd)  
   
   
µÚʮՠ 
10.1 µ±³ÌÐòµÚÒ»´Î½Óµ½ÎÒÃÇ·¢Ë͸øËüµÄÐźÅÁ¿¾ÍÖÕÖ¹ÁË¡£ÒòΪһ²¶×½µ½ÐźÅÁ¿pa  
useº¯Êý¾Í·µ»Ø¡£  
10.2 ³ÌÐòC.8ʵÏÖÁËraiseº¯Êý¡£  
#include        <sys/types.h>  
#include        <signal.h>  
#include        <unistd.h>  
int  
raise(int signo)  
{  
        return( kill(getpid(), signo) );  
}  
³ÌÐòC.8  raiseº¯ÊýµÄʵÏÖ  
10.3 ¼ûͼC.3¡£  
ͼC.3 longjumpǰºóµÄ¶Ñջ״̬  
        ´Ósig_alrmͨ¹ýlongjmp·µ»Ømain£¬ÓÐЧµØ±ÜÃâÁ˼ÌÐøÖ´ÐÐsig_int¡£  
10.4 Èç¹û½ø³ÌÔÚµ÷ÓÃalarmºÍsetjmpÖ®¼ä±»ÄÚºË×èÈûÁË£¬alarmʱ¼ä×ßÍêÖ®ºó¾Íµ÷  
ÓÃÐźÅÁ¿´¦Àí³ÌÐò£¬È»ºóµ÷ÓÃlongjmp¡£µ«ÊÇÓÉÓÚûÓе÷ÓÃsetjmp£¬ËùÒÔûÓÐÉèÖà 
env_alrm»º´æÇø¡£Èç¹ûlongjmpµÄÌø×ª»º´æÇøÃ»Óб»setjmp³õʼ»¯£¬Ôò˵Ã÷ûÓж¨  
ÒålongjmpµÄ²Ù×÷¡£  
10.5 ²Î¼û" Implementing Software Timers " by Don Libers ( C user Journa  
l, Vol. 8, no. 11, Nov. 1990 )ÖеÄÀý×Ó¡£  
10.7 Èç¹û½ö½öµ÷ÓÃ_exit£¬Ôò½ø³ÌÖÕֹ״̬¾Í²»Äܱíʾ¸Ã½ø³ÌÊÇÓÉÓÚSIGABRTÐźŠ 
Á¿¶øÖÕÖ¹µÄ¡£  
10.8 Èç¹ûÐźÅÁ¿ÊÇÓÉÆäËüÓû§µÄ½ø³Ì·¢³öµÄ£¬½ø³Ì±ØÐëÉèÖÃÓû§µÄIDΪ¸ù»òÕßÊÇ  
½ÓÊÕ½ø³ÌµÄÓµÓÐÕߣ¬·ñÔòkill²»ÄÜÖ´ÐС£ËùÒÔʵ¼ÊµÄÓû§IDΪÐźÅÁ¿µÄ½ÓÊÕÕßÌṩ  
Á˸ü¶àµÄÐÅÏ¢¡£  
10.10 ¶ÔÓÚ±¾ÊéÖÐËùÓõÄϵͳ£¬´óԼÿ60-90·ÖÖÓÔö¼ÓÒ»Ã룬Õâ¸öÎó²îÊÇÒòΪÿ´Î  
µ÷ÓÃsleep¶¼Òªµ÷¶ÈÒ»½«À´µÄʱ¼äʼþ£¬µ«ÊÇÓÉÓÚCPUµ÷¶È£¬ÓÐʱÎÒÃDz¢Ã»ÓÐÔÚʼþ  
·¢Éúʱ±»½ÐÐÑ¡£ÁíÍâÒ»¸öÔ­ÒòÊÇ¿ªÊ¼ÔËÐнø³ÌºÍµ÷ÓÃsleep¶¼ÐèÒªÒ»¶¨µÄʱ¼ä¡£  
        BSDÖеÄcronÿ·ÖÖÓ¶¼ÒªÈ¡µ±Ç°Ê±¼ä£¬ËüÊ×ÏÈÉèÖÃÒ»¸öÐÝÃßÖÜÆÚ£¬È»ºóÔÚÏÂÒ»·ÖÖÓ  
¿ªÊ¼Ê±»½ÐÑ¡£´ó¶àÊýµ÷ÓÃÊÇsleep(60)£¬Å¼¶ûÓÐÒ»¸ösleep(59)ÓÃÓÚÔÚÏÂÒ»·ÖÖÓͬ²½  
¡£µ«ÊÇÈôÔÚ½ø³ÌÖл¨·ÑÁËÐí¶àʱ¼äÖ´ÐÐÃüÁî»òÕßϵͳµÄ¸ºÔØÖص÷¶ÈÂý£¬ÕâʱÐÝÃßÖµ  
¿ÉÄÜԶСÓÚ60¡£  
10.11 ÔÚSVR4ÖУ¬´ÓÀ´Ã»Óе÷ÓùýSIGXFSZµÄÐźÅÁ¿´¦Àí³ÌÐò£¬Ò»µ©ÎļþµÄ´óС´ï  
µ½1024ʱ£¬write¾Í·µ»Ø24¡£  
        ÔÚ4.3+BSDÖУ¬Îļþ´óС´ïµ½1500×Ö½Úʱµ÷ÓøÃÐźŴ¦Àí³ÌÐò£¬write·µ»Ø-1²¢ÇÒ  
errnoÉèÖÃΪEFBIG¡£  
        SunOS4.1.2µÄÇé¿öÓëSVR4ÀàËÆ£¬µ«Êǵ÷ÓÃÁ˸ÃÐźÅÁ¿´¦Àí³ÌÐò¡£  
        System VÔÚÎļþ´óС´ïµ½Èí×ÊÔ´ÏÞÖÆÊ±ÎÞ´í·µ»ØÒ»¸ö½ÏСµÄÊý£¬¶øBSDÅжÏÎļþ³¬  
³öÏÞÖÆÊ±´íÎ󷵻أ¬Ã»ÓÐдÈκÎÊý¾Ý¡£  
   
10.12 ½á¹ûÒÀÀµÓÚ±ê×¼I/O¿âµÄʵÏÖ--fwriteÈçºÎ´¦ÀíÒ»¸ö±»ÖжϵÄд¡£  
   
µÚʮһÕ  
11.1 ×¢ÒâÓÉÓÚÖÕ¶ËÊÇ·ÇÕý¹æÄ£Ê½£¬ËùÒÔÒªÓû»Ðзû¶ø²»ÊǻسµÖÕÖ¹resetÃüÁî¡£  
11.2 ËüΪ128¸ö×Ö·û½¨ÁËÒ»ÕÅ±í£¬¸ù¾ÝÓû§µÄÒªÇóÉèÖÃÆæÅ¼Ð£Ñéλ¡£È»ºóʹÓÃ8λ  
I/O´¦ÀíÆæÅ¼Î»µÄ²úÉú¡£  
11.3 ÔÚSVR4ÖÐÔËÐÐstty -a£¬²¢ÇÒ½«±ê×¼ÊäÈëÖØ¶¨Ïòµ½ÔËÐÐviµÄÖÕ¶Ë£¬½á¹ûÏÔʾv  
iÉèÖÃMINΪ1¡¢TIMEΪ1¡£readsµÈ´ýÖÁÉÙÇÃÈëÒ»¸ö×Ö·û£¬µ«ÊǸÃ×Ö·ûÊäÈëºó£¬Ö»¶Ô  
ºó¼ÌµÄ×Ö·ûµÈ´ýÊ®·ÖÖ®Ò»Ãë¼´·µ»Ø¡£  
11.4 ÔÚSVR4ÖÐʹÓÃÀ©Õ¹µÄͨÓÃÖն˽ӿڡ£²Î¼ûAT&T[1991]ÊÖ²áÖеÄtemiox(7)¡£ÔÚ  
4.3+BSDÖÐʹÓÃc_cflag×ֶεÄCCTS_OFLOWºÍCRTS_IFLOW±êÖ¾£¬²Î¼ûͼ11.3¡£  
   
   
µÚÊ®¶þÕ  
12.1 ³ÌÐòÔËÐÐÕý³££¬²»»á·¢ÉúENOLCKµÄ´íÎó¡£µÚÒ»´ÎÑ­»·µ÷ÓÃwritew_lock¡¢wri  
teºÍun_lock¡£µ÷ÓÃun_lockºóÖ»±£ÁôÁ˵ÚÒ»¸ö×Ö½ÚµÄËø£¬µÚ¶þ´ÎÑ­»·Ê±£¬µ÷ÓÃwri  
tew_lockʹµÃÐÂËøÓëµÚÒ»¸ö×Ö½ÚµÄËøºÏ²¢£¬Í¼C.4Êǵڶþ´ÎÑ­»·µÄ½á¹û¡£  
ͼC.4 µÚ¶þ´ÎÑ­»·ºóËøµÄ״̬  
        Ã¿Ñ­»·Ò»´Î¾ÍÀ©Õ¹Ò»¸ö×Ö½ÚµÄËø£¬Äں˽«ÕâÐ©ËøºÏ²¢ºó¾ÍÖ»±£³ÖÁËÒ»¸öËø£¬Òò´Ë  
·ûºÏËø½á¹¹µÄ¶¨Òå¡£  
12.2 ÔÚSVR4¡¢4.3+BSDÖÐ,fd_setÊÇÖ»°üº¬Ò»¸ö³ÉÔ±µÄ½á¹¹£¬¸Ã³ÉԱΪһ¸ö³¤ÕûÐÍ  
Êý×é¡£Êý×éÖÐÿһλ¶ÔÓ¦ÓÚÒ»¸öÃèÊö·û¡£ËĸöFD_ºêͨ¹ý¿ª¹Ø»ò²âÊÔÖ¸¶¨µÄλÀ´²Ù  
×ÝÕâ¸öÊý×é¡£½«Ö®¶¨ÒåΪһ¸ö°üº¬Êý×éµÄ½á¹¹¶ø²»½ö½öÊÇÒ»¸öÊý×éµÄÔ­ÒòÊÇ£ºÍ¨¹ý  
CÓïÑԵĸ³ÖµÓï¾ä£¬¿ÉÒÔʹfd_setÀàÐͱäÁ¿Ï໥¸³Öµ¡£  
12.3 ÔÚSVR4¡¢4.3+BSDÖÐÔÊÐíÓû§°üº¬Í·Îļþ<sys/types.h> Ç°¶¨Òå³£ÊýFD_SETS  
IZE¡£ÀýÈçÏÂÃæµÄ´úÂë¿ÉÒÔʹfd_setÊý¾ÝÀàÐͰüº¬2048¸öÃèÊö·û¡£  
                #define FD_SETSIZE      2048  
                #include                <sys/types.h>  
12.4 ÏÂÃæµÄ±íÁгöÁ˹¦ÄÜÀàËÆµÄº¯Êý¡£  
                FD_ZERO         sigemptyset  
                FD_SET          sigaddset  
                FD_CLR          sigdelset  
                FD_ISSET                sigismember  
        Ã»ÓÐÓësigfillset¶ÔÓ¦µÄFD_XXXº¯Êý¡£¶ÔÐźÅÁ¿À´Ëµ£¬Ö¸ÏòÐźÅÁ¿¼¯ºÏµÄÖ¸ÕëÊÇ  
µÚÒ»¸ö²ÎÊý£¬ÐźÅÁ¿ÊýÊǵڶþ¸ö²ÎÊý£»¶ÔÓÚÃèÊö·ûÀ´Ëµ£¬ÃèÊö·ûÊýÊǵÚÒ»¸ö²ÎÊý£¬  
Ö¸ÏòÃèÊö·û¼¯ºÏµÄÖ¸ÕëÊǵڶþ¸ö²ÎÊý¡£  
12.5 ×î¶àÎåÖÖÐÅÏ¢£ºÊý¾Ý£¬Êý¾Ý³¤¶È£¬¿ØÖÆÐÅÏ¢£¬¿ØÖÆÐÅÏ¢µÄ³¤¶ÈºÍ±êÖ¾¡£  
12.6 ÀûÓÃselectʵÏֵijÌÐò¼ûC.9£¬ÀûÓÃpollʵÏֵijÌÐò¼ûC.10¡£  
#include        <sys/types.h>  
#include        <sys/time.h>  
#include        <stddef.h>  
#include        "ourhdr.h"  
void  
sleep_us(unsigned int nusecs)  
{  
        struct timeval  tval;  
        tval.tv_sec = nusecs / 1000000;  
        tval.tv_usec = nusecs % 1000000;  
        select(0, NULL, NULL, NULL, &tval);  
}  
³ÌÐòC.9 ÓÃselectʵÏÖsleep_usº¯Êý  
#include        <sys/types.h>  
#include        <poll.h>  
#include        <stropts.h>  
#include        "ourhdr.h"  
void  
sleep_us(unsigned int nusecs)  
{  
        struct pollfd   dummy;  
        int                             timeout;  
        if ( (timeout = nusecs / 1000) <= 0)  
                timeout = 1;  
        poll(&dummy, 0, timeout);  
}  
³ÌÐòC.10 ÓÃpollʵÏÖsleep_usº¯Êý  
        BSDÖеÄusleep(3)ʹÓÃsetitimerÉèÖüä¸ô¼ÆÊ±Æ÷£¬²¢ÇÒÖ´ÐÐ8¸öϵͳµ÷Óá£Ëü¿É  
ÒÔÕýÈ·µÄºÍµ÷Óýø³ÌÉèÖÃµÄÆäËü¼ÆÊ±Æ÷½»»¥×÷Ó㬶øÇÒ¼´Ê¹²¶×½µ½ÐźÅÁ¿Ò²²»»á±»  
Öжϡ£  
12.7 ²»ÐС£ÎÒÃÇ¿ÉÒÔʹTELL_WAIT´´½¨Ò»¸öÁÙʱÎļþ£¬ÆäÖÐÒ»¸ö×Ö½ÚÓÃ×÷Ϊ¸¸½ø³Ì  
µÄËø£¬ÁíÒ»¸ö×Ö½ÚÓÃ×÷Ϊ×Ó½ø³ÌµÄËø¡£WAIT-CHILDʹµÃ¸¸½ø³ÌµÈ´ý×Ó½ø³ÌµÄËø£¬T  
ELL_PARENTʹµÃ×Ó½ø³ÌÊÍ·Å×Ó½ø³ÌµÄËø¡£µ«ÊÇÎÊÌâÔÚÓÚµ÷ÓÃforkºó£¬×Ó½ø³ÌÊÍ·ÅÁË  
ËùÓеÄËøµ¼ÖÂ×Ó½ø³Ì²»ÄܾßÓÐÈκÎËü×Ô¼ºµÄËø¶ø¿ªÊ¼Ö´ÐС£  
12.8 ÓÃselectµÄ·½·¨¼û³ÌÐòC.11£¬Ê¹ÓÃpollµÄÇé¿öÀàËÆ¡£  
#include        <sys/types.h>  
#include        <sys/time.h>  
#include        "ourhdr.h"  
int  
main(void)  
{  
        int                             i, n, fd[2];  
        fd_set                  writeset;  
        struct timeval  tv;  
        if (pipe(fd) < 0)  
                err_sys("pipe error");  
        FD_ZERO(&writeset);  
        for (n = 0; ; n++) { /* write 1 byte at a time until pipe is full */  
                FD_SET(fd[1], &writeset);  
                tv.tv_sec = tv.tv_usec = 0;             /* don't wait at all */  
                if ( (i = select(fd[1]+1, NULL, &writeset, NULL, &tv)) < 0)  
                        err_sys("select error");  
                else if (i == 0)  
                        break;  
                if (write(fd[1], "a", 1) != 1)  
                        err_sys("write error");  
        }  
        printf("pipe capacity = %d\n", n);  
        exit(0);  
}  
³ÌÐòC.11 ÓÃselect¼ÆËã¹ÜµÀµÄÐÔÄÜ  
        ÔÚSVR4ºÍSunOS 4.1.1ÖÐʹÓÃselectºÍpoll¼ÆËã³öµÄ½á¹ûµÈÓÚͼ2.6µÄÖµ¡£ÔÚ4.3B  
SDÖÐʹÓÃselect¼ÆËãµÄ½á¹ûΪ3073¡£  
12.9 ÔÚSVR4¡¢4.3+BSDºÍSunOS 4.1.2ÖУ¬³ÌÐò12.14ȷʵÐÞ¸ÄÁËÊäÈëÎļþµÄ×î½üÒ»  
´Î·ÃÎÊʱ¼ä¡£  
   
   
µÚÊ®ÈýÕ  
13.1 Èç¹û½ø³Ìµ÷ÓÃchroot¾Í²»ÄÜ´ò¿ª/dev/log£¬½â¾öµÄ°ì·¨ÊÇÔÚchroot֮ǰµ÷Óà 
Ñ¡ÏîΪLOG_NDELAYµÄopenlog¡£ÕâÑù¼´Ê¹µ÷ÓÃÁËchrootÖ®ºó£¬ÈÔÈ»¿ÉÒÔ´ò¿ªÌض¨µÄ  
É豸Îļþ£¨UNIXÓëÊý¾Ý°üÌ×½Ó¿Ú£©²¢Éú³ÉÒ»¸öÓÐЧµÄÃèÊö·û¡£  
13.3 ³ÌÐòC.12ÊÇÒ»ÖÖ½â¾ö·½°¸¡£  
#include        "ourhdr.h"  
int  
main(void)  
{  
        char    *ptr, buff[MAXLINE];  
        daemon_init();  
        close(0);  
        close(1);  
        close(2);  
        ptr = getlogin();  
        sprintf(buff, "login name: %s\n",  
                                        (ptr == NULL) ? "(empty)" : ptr);  
        write(3, buff, strlen(buff));  
        exit(0);  
}  
³ÌÐòC.12 µ÷ÓÃdaemon_init»ñµÃ×¢²áÃû  
½á¹ûÒÀÀµÓÚ²»Í¬µÄϵͳʵÏÖºÍÊÇ·ñ¹Ø±ÕÎļþÃèÊö·û1¡¢2ºÍ3¡£¹Ø±ÕÃèÊö·ûÓ°Ïì½á¹û  
µÄÔ­ÒòÊÇ£ºµ±³ÌÐò¿ªÊ¼Ö´ÐÐʱÓë¿ØÖÆÖÕ¶ËÁ¬½Ó£¬µ÷ÓÃdeamon_initºó¹Ø±Õ3¸öÃèÊö·û  
¾ÍÒâζ×ÅgetloginûÓпØÖÆÖÕ¶Ë£¬ËùÒÔ²»ÄÜÔÚutmpÎļþÖп´µ½µÇ¼Ïî¡£  
µ«ÊÇÔÚ4.3+BSDÖУ¬µÇ¼ÃûÊÇÓɽø³Ì±íά»¤µÄ£¬²¢ÇÒ¿ÉÒÔͨ¹ýfork¸´ÖÆ¡£Ò²¾ÍÊÇ˵  
³ý·ÇÆä¸¸½ø³ÌûÓеǼÃû(Èçϵͳ×ÔÒýµ¼Ê±µ÷ÓÃinit)£¬·ñÔò½ø³Ì×ÜÄÜ»ñµÃÆäµÇ¼Ãû  
¡£  
   
   
µÚÊ®ËÄÕ  
14.1 Èç¹ûд¹ÜµÀ¶Ë×ÜÊDz»¹Ø±Õ£¬Ôò¶ÁÕ߾;ö²»»á¿´µ½ÎļþµÄ½áÊø·û¡£Ò³Ãæµ÷¶È³Ì  
Ðò¾Í»áÒ»Ö±×èÈûÔÚ¶Á±ê×¼ÊäÈë¡£  
14.2 ¸¸½ø³ÌÏò¹ÜµÀдÍê×îºóÒ»ÐÐÒÔºó¾ÍÖÕÖ¹ÁË£¬È»ºó¶ÁÕß¶Áµ½¹ÜµÀµÄ½áβʱ×Ô¶¯  
¹Ø±Õ¹ÜµÀ¡£µ«ÊÇÓÉÓÚ×Ó½ø³Ì(Ò³Ãæµ÷¶È³ÌÐò)ÒªµÈ´ýÊä³öµÄÒ³£¬ËùÒÔ¸¸½ø³Ì¿ÉÄܱÈ×Ó  
                        err_sys ( "setvbuf error" ) ;  
        whileÖеÄreadºÍwriteÓÃÏÂÃæµÄÓï¾ä´úÌæ¡£  
if (fputs ( line, fpout ) == EOF )  
        err_sys ( "fputs error to pipe" ) ;  
if ( fgets ( line, MAXLINE, FPIN ) == NULL ) {  
        err_msg ( "child close pipe" ) ;  
        break ;  
}  
14.6 ËäÈ»systemº¯Êýµ÷ÓÃÁËwait£¬µ«ÊÇÖÕÖ¹µÄµÚÒ»¸ö×Ó½ø³ÌÊÇÓÉpopen²úÉúµÄ£¬Ëù  
ÒÔËü½«Ôٴε÷ÓÃwait²¢Ò»Ö±×èÈûµ½sleepÍê³É£¬È»ºósystem·µ»Ø¡£µ±pcloseµ÷ÓÃwa  
itʱ£¬ÓÉÓÚûÓÐ×Ó½ø³Ì¿ÉµÈ´ýËùÒÔ·µ»Ø³ö´í£¬µ¼ÖÂpcloseÒ²·µ»Ø³ö´í¡£  
14.7 select±íÃ÷ÃèÊö·ûÊǿɶÁµÄ¡£µ÷ÓÃread¶ÁÍêËùÓеÄÊý¾Ýºó·µ»Ø0¾Í±íÃ÷µ½ÁËÎÄ  
¼þβ¡£¶ÔÓÚpoll(¼ÙÉè¹ÜµÀÊÇÒ»¸öÁ÷É豸)À´Ëµ£¬Èô·µ»ØPOLLHUPÒ²ÐíÈÔÓÐÊý¾Ý¿ÉÒÔ  
¶Á¡£µ«ÊÇÒ»µ©¶ÁÍêÁËËùÓеÄÊý¾Ýread¾Í·µ»Ø0£¬¼´±íÃ÷µ½ÁËÎļþβ¡£poll¶ÁÍêÁËËù  
ÓеÄÊý¾Ýºó²¢²»·µ»ØPOLLIN¡£  
        ¶ÔÓÚ±»¶ÁÕ߹رյÄÖ¸Ïò¹ÜµÀµÄÊä³öÃèÊö·ûÀ´Ëµ£¬select±íÃ÷ÃèÊö·ûÊÇ¿ÉдµÄ£¬µ÷  
ÓÃwriteʱ²úÉúSIGPIPEÐźÅÁ¿£¬Èç¹ûÎÒÃǺöÂÔ¸ÃÐźÅÁ¿»ò´ÓÐźÅÁ¿´¦Àí³ÌÐòÖзµ»Ø  
ʱwrite¾Í·µ»ØEPIPE´íÎó¡£¶ø¶ÔÓÚpoll£¬Èç¹û¹ÜµÀÊÇÒ»¸öÁ÷É豸£¬poll¾Í¶Ô¸ÃÃèÊö  
·û·µ»ØPOLLHUP¡£  
14.8 ×Ó½ø³ÌÏò±ê×¼³ö´íдµÄÄÚÈÝͬÑùÒ²ÔÚ¸¸½ø³ÌµÄ±ê×¼³ö´íÖгö´í¡£Ö»ÒªÔÚcmds  
tring°üº¬Öض¨Ïò2 > &1ÃüÁ¾Í¿ÉÒÔ½«±ê×¼³ö´í·¢Ë͸ø¸¸½ø³Ì¡£  
14.9 popenÉú³ÉÒ»¸ö×Ó½ø³Ì£¬×Ó½ø³Ìͨ¹ýexecÖ´ÐÐBourne shell¡£È»ºóShellÔÙµ÷  
ÓÃfork£¬×îºóÓÉshellµÄ×Ó½ø³ÌÖ´ÐÐÃüÁî´®¡£µ±cmdstringÖÕֹʱshellÇ¡ºÃÔڵȴý  
¸Ãʼþ£¬È»ºóshellÍ˳ö£¬¶øÕâһʼþÓÖÊÇpcloseÖÐwaitpidËùµÈ´ýµÄ¡£  
14.10 ½â¾öµÄ°ì·¨ÊÇ´ò¿ªFIFOÁ½´Î£¬Ò»´Î¶ÁÒ»´Îд¡£Ò»°ãÎÒÃDz»»á¶Ô´ò¿ªµÄÃèÊö·û  
½øÐÐд£¬ÎÒÃǾø²»»áʹÓÃΪд¶ø´ò¿ªµÄÃèÊö·û£¬µ«ÊÇʹ¸ÃÃèÊö·û´ò¿ª¾Í¿ÉÔÚ¿Í»§Êý  
´Ó1±äΪ0ʱ£¬×èÖ¹²úÉúÎļþÖÕÖ¹¡£´ò¿ªFIFOÁ½´ÎÐèҪעÒâÏÂÁвÙ×÷·½Ê½£ºµÚÒ»´ÎÒÔ  
·Ç×èÈû¡¢Ö»¶Á·½Ê½open£¬µÚ¶þ´ÎÒÔ×èÈû¡¢Ö»Ð´·½Ê½open¡£(Èç¹ûÓ÷Ç×èÈû¡¢Ö»Ð´·½  
ʽ´ò¿ª½«·µ»Ø´íÎó¡£)È»ºó¹Ø±Õ¶ÁÃèÊö·ûµÄ·Ç×èÈûÊôÐÔ¡£²Î¼û³ÌÐòC.13¡£  
#include        <sys/types.h>  
#include        <sys/stat.h>  
#include        <fcntl.h>  
#include        "ourhdr.h"  
#define FIFO    "temp.fifo"  
int  
main(void)  
{  
        int             fdread, fdwrite;  
        unlink(FIFO);  
        if (mkfifo(FIFO, FILE_MODE) < 0)  
                err_sys("mkfifo error");  
        if ( (fdread = open(FIFO, O_RDONLY | O_NONBLOCK)) < 0)  
                err_sys("open error for reading");  
        if ( (fdwrite = open(FIFO, O_WRONLY)) < 0)  
                err_sys("open error for writing");  
        clr_fl(fdread, O_NONBLOCK);  
        exit(0);  
}  
³ÌÐòC.13 ÒÔ·Ç×èÈû·½Ê½´ò¿ªFIFO½øÐжÁд²Ù×÷  
14.11 ËæÒâ¶ÁÈ¡ÏÖÐеĶÓÁÐÖеÄÏûÏ¢»á¸ÉÈſͻ§/·þÎñÆ÷ЭÒ飬µ¼Ö¶ªÊ§¿Í»§µÄÇë  
Çó»òÕß·þÎñÆ÷µÄÏìÓ¦¡£ÓÉÓÚ¶ÓÁÐÔÊÐíËùÓеÄÓû§¶Á£¬ËùÒÔ½ø³ÌÖ»ÒªÖªµÀ¶ÓÁеıêʶ  
·û¾Í¿ÉÒÔ¶Á¶ÓÁС£  
14.13 ÓÉÓÚ·þÎñÆ÷ºÍ¿Í»§¶¼¿ÉÄܽ«¶ÎÁ¬½Óµ½²»Í¬µÄµØÖ·£¬ËùÒÔÔÚ¹²ÏíµÄÄÚ´æ¶ÎÖв»  
´æ·Åʵ¼ÊÎïÀíµØÖ·¡£Ïà·´£¬µ±ÔÚ¹²ÏíµÄÄÚ´æ¶ÎÖн¨Á¢Á´±íʱ£¬Ö¸ÕëµÄÖµÉèÖÃΪ¹²Ïí  
ÄÚ´æ¶ÎÄ򵀮«ÒÆ¡£Æ«ÒÆÁ¿ÎªËùָĿ±êµÄʵ¼ÊµØÖ·¼õÈ¥¹²ÏíÄÚ´æ¶ÎµÄÆðʼµØÖ·¡£  
£  
14.14 Í¼C.5ÏÔʾÁËÏà¹ØµÄʼþ¡£  
   
   
µÚÊ®ÎåÕ  
15.3 ËµÃ÷Ö¸¶¨Á˱êʶ·û¼¯ºÏµÄÊôÐÔ£¨ÀýÈçÊý¾ÝÀàÐÍ£©£¬Èç¹û˵Ã÷µÄͬʱ·ÖÅäÁË´æ  
´¢µ¥Ôª¾ÍÊǶ¨Òå¡£  
 ÔÚÍ·Îļþ<open.h>ÖÐÓÃextern˵Ã÷ÁËÈý¸öÈ«¾Ö±äÁ¿£¬Õâʱ²¢Ã»ÓÐΪËüÃÇ·ÖÅä´æ´¢  
µ¥Ôª£¬ÔÚÎļþ<main.c>Öж¨ÒåÁËÈý¸öÈ«¾Ö±äÁ¿£¬ÓÐʱ»áÔÚ¶¨Òåʱ¾Í³õʼ»¯È«¾Ö±äÁ¿  
£¬µ«Í¨³£Ê¹ÓÃCµÄȱʡֵ¡£  
15.5 selectºÍpoll¶¼·µ»Ø¾ÍÐ÷µÄÃèÊö·û¸öÊý¡£µ±½«ÕâЩ¾ÍÐ÷ÃèÊö·û¶¼´¦ÀíÍêºó£¬  
²Ù×÷clientÊý×éµÄÑ­»·¾Í¿ÉÒÔ½áÊø¡£  
   
   
µÚÊ®ÁùÕ  
16.1 _db_dodeleteÖб£ÊصÄÉÏËø²Ù×÷ÊÇΪÁ˱ÜÃâºÍdb_nextrec·¢Éú¾ºÌ¬Ìõ¼þ¡£Èç  
¹ûûÓÐʹÓÃÐ´Ëø±£»¤_db_writedatµ÷Óã¬ÔòÓпÉÄÜÔÚ_db_nextrec¶Áij¸ö¼Ç¼ʱ²Á  
È¥¸Ã¼Ç¼£ºdb_nextrecÊ×ÏȶÁÈëÒ»¸öË÷Òý¼Ç¼£¬·¢ÏָüǼ·Ç¿Õ£¬Ôò½Ó×ŶÁÈë¼Ç¼  
ÄÚÈÝ£¬µ«ÊÇÔÚËüµ÷ÓÃ_db_readidxºó_db_readdatǰ£¬¸Ã¼Ç¼ȴ¸ø_db_dodeleteɾ³ý  
ÁË¡£  
16.2 ¼Ù¶¨db_nextrecµ÷ÓÃÁË_db_readidx£¬Ëü½«¼Ç¼µÄ¹Ø¼ü×Ö¶ÁÈëË÷Òý»º´æ½øÐд¦  
Àí¡£µ«¸Ã´¦Àí¹ý³Ì±»Äں˵÷¶È½ø³Ì´ò¶Ï£¬ÁíÒ»¸öÖ´ÐеĽø³Ì¸ÕºÃµ÷ÓÃdb_deleteɾ  
³ýÁËÕâÒ»Ìõ¼Ç¼£¬Ê¹µÃË÷ÒýÎļþºÍ¼Ç¼ÎļþÖжÔÓ¦µÄÄÚÈݶ¼±»Çå¿Õ¡£µ±µÚÒ»¸ö½ø³Ì  
»Ö¸´Ö´Ðв¢µ÷ÓÃ_db_readdat(ÔÚdb_nextrecº¯ÊýÌåÖÐ)ʱ£¬·µ»ØµÄÊǿռǼ¡£ËùÒÔ  
db_nextrecÖеĶÁËøÊ¹µÃ¶ÁÈë¼Ç¼Ë÷ÒýµÄ¹ý³ÌºÍ¶ÁÈë¼Ç¼ÄÚÈݵĹý³ÌÊÇÒ»¸öÔ­×Ó²Ù  
×÷(ÖÁÉÙ¶ÔÆäËü²Ù×÷ͬһÊý¾Ý¿âµÄ²¢·¢½ø³ÌÖеÄд²Ù×÷¶øÑÔ)¡£  
16.3 Ç¿ÖƵÄËø¶¨¶ÔÆäËüµÄ¶ÁÕߺÍдÕß²úÉúÁËÓ°Ïì--ÆäËüµÄ¶ÁºÍд²Ù×÷¶¼±»×èÈû£¬  
Ö±µ½_db_writeidxºÍ_db_writedatÉèÖõÄËø±»½â³ý¡£  
   
   
µÚÊ®ÆßÕ  
17.1 psif±ØÐë¶ÁÈ¡ÎļþµÄǰÁ½¸ö×Ö½Ú²¢ÇÒÓë%!½øÐбȽϡ£Èç¹ûÎļþÊÇ¿ÉÒÔËæ»ú¶¨  
λµÄ£¬Ôò¿ÉÒÔrewindÎļþ£¬²¢µ÷ÓÃlprps»òtextps¡£Èç¹ûÎļþ²»¿ÉËæ»ú¶¨Î»£¬ÔòÖ»  
Äܽ«¸ÃÁ½¸ö×Ö½ÚÖØÐ·Żرê×¼ÊäÈëÉ豸¡£´Ëʱһ¸ö¿ÉÐеİ취ÊÇ£º½¨Á¢Ò»¸ö¹ÜµÀ²¢  
forkÒ»¸ö×Ó½ø³Ì¡£È»ºó¸¸½ø³Ì½«Æä±ê×¼ÊäÈëÉ豸ÉèÖÃΪ¹ÜµÀ£¬²¢Ö´ÐÐtextps»òlpr  
ps¡£È»ºó×Ó½ø³Ì½«Ëü¶Áµ½µÄÁ½¸ö×Ö½ÚдÈë¹ÜµÀ£¬ÔÙ½Ó׎«ÎļþµÄÆäËü²¿·ÖÊä³ö¡£  
   
   
µÚÊ®°ËÕ  
18.2 Í¨³£getoptÖ»ÓÃÀ´´¦Àíµ¥¸ö²ÎÊýÁÐ±í¡£ÔÚgetoptº¯ÊýµÄ³õʼ»¯Êý¾Ý¶Î£¬È«¾Ö  
±äÁ¿optind±»³õʼ»¯Îª1¡£µ«ÊÇÔÚÎÒÃǵķþÎñÆ÷ÖУ¬ÎÒÃǵ÷ÓÃgetoptÀ´´¦Àí¶à¸ö²Î  
ÊýÁбí--ÿ¸öclientÒ»¸ö£¬ËùÒÔÎÒÃDZØÐëÔÚΪÿ¸öclientÊ״ε÷ÓÃgetoptǰ¾ùÖØÐ  
³õʼ»¯optind¡£  
18.3 ÎÒÃÇʹÓÃÁËClient½á¹¹Î¬»¤ÏµÍ³ÎļþµÄÆ«ÒÆÖµ¡£Èç¹ûÔÚ±£´æÁËÆ«ÒÆÖµºó¡¢ÔÙ  
´ÎʹÓÃ֮ǰÐÞ¸ÄÁ˸ÃÎļþ£¬ÔòÓпÉÄÜÉϴα£´æµÄÆ«ÒÆÖµ²»ÔÙÖ¸ÏòËûÒÔǰָÏòµÄÐС£  
ËäÈ»·þÎñÆ÷¿ÉÒÔ¼ì²âµ½ÎļþÊÇ·ñ±»ÐÞ¸ÄÁË(ÈçºÎ¼ì²â£¿)£¬µ«ÊÇÎÒÃÇÎÞ·¨ÔÙ½«Æ«ÒÆÖµ  
»Ö¸´µ½Ô­À´µÄÕýȷλÖᣵ±ÎļþÐ޸ĺó,ÎÒÃÇΨһµÄ°ì·¨ÊDz»ÈÃÓйØÓû§ÔڵǼ½ø  
À´¡£  
18.4 Ö»Óе±client_add±»µ÷ÓÃʱ£¬ÎÒÃDzÅÄÜͨ¹ýreallocÒÆ¶¯clientÊý×é¡£ÒòΪc  
lient_addÊÇÔÚselectºó£¬¶ø²»ÊÇÔÚʹÓÃcliptrµÄÑ­»·ÖС£  
18.5 ·¢Ë͵½Ô¶¶ËϵͳµÄ²»Í¬ÃüÁî¿ÉÄܻᱻ»ìÏýÆðÀ´¡£¿ÉÒÔÔÚtake_put_argsÖмÓÈë  
һЩ¼ì²é¹¦ÄÜʵÏÖÃüÁîµÄÇø·Ö¡£  
18.6 Ò»¸ö³£Óõķ½·¨ÊÇ£ºÒªÇóÓû§ÔÚÐÞ¸ÄÈκÎÎļþºó֪ͨ·þÎñÆ÷£¬ÒÔʹ·þÎñÆ÷¿É  
ÒÔÖØÐ¶ÁÈ¡Îļþ¡£SIGHUPÃüÁî¾ÍÊǾ­³£ÓÃÀ´Íê³ÉÕâÏîÈÎÎñµÄ¡£  
18.9 ¿ÉÒÔÔÚÔ¶¶ËÖ´ÐÐsttyÃüÁȻºó·ÖÎöÆäÊä³ö½á¹û¡£µ«ÊÇ¿¼Âǵ½²»Í¬UNIXƽ̨  
 
µÄsttyÃüÁîÊä³ö½á¹û²î±ðºÜ´ó£¬ÕâÖÖ·½Ê½ÊµÏÖÆðÀ´½ÏΪÀ§ÄÑ¡£  
   
   
µÚÊ®¾ÅÕ  
19.1 telnetdºÍrlogindÁ½¸ö·þÎñÆ÷¾ùÒÔ³¬¼¶Óû§µÄȨÏÞÔËÐÐ,ËùÒÔËüÃǶ¼¿ÉÒԳɹ¦  
µØµ÷ÓÃchownºÍchmod¡£  
Ì  
   
--  
 
 
-- 
¡ù À´Ô´:¡¤BBS Ë®Ä¾Ç廪վ smth.org¡¤[FROM: 202.38.248.38] 

BBSˮľÇ廪վ¡Ã¾«»ªÇø