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

·¢ÐÅÈË: Mccartney (coolcat), ÐÅÇø: Unix 
±ê  Ìâ: Solaris2.4 ¶àÏ̱߳à³ÌÖ¸ÄÏ5--°²È«ºÍ²»°²È«µÄ½Ó¿Úº¯Ê 
·¢ÐÅÕ¾: BBS Ë®Ä¾Ç廪վ (Sun May 17 16:32:40 1998) 
 
5£® °²È«ºÍ²»°²È«µÄ½Ó¿Ú 
 
±¾Õ¶¨ÒåÁ˺¯ÊýºÍ¿âµÄ¶àḬ̈߳²È«µÈ¼¶¡£ 
        Ḭ̈߳²È« 
        ¶àÏ߳̽ӿڰ²È«µÈ¼¶ 
        Òì²½°²È«º¯Êý 
        ¿âµÄ¶àḬ̈߳²È«µÈ¼¶ 
 
5.1Ḭ̈߳²È« 
 
    Ḭ̈߳²È«ÊÇΪÁ˱ÜÃâÊý¾Ý¾ºÕù--Êý¾ÝÉèÖõÄÕýÈ·ÐÔÒÀÀµÓÚ¶à¸öÏß³ÌÐÞ¸ÄÊý¾Ý 
µÄ˳Ðò¡£ 
    Èç¹û²»ÐèÒª¹²Ïí£¬Ôò¸øÃ¿¸öÏ̷߳ÖÅäÒ»¸ö˽ÓеÄÊý¾Ý¿½±´¡£Èç¹ûÊý¾Ý±ØÐë¹² 
Ïí£¬Ò»¶¨ÒªÓÃͬ²½»úÖÆÀ´±£Ö¤²Ù×÷µÄΨһÐÔ¡£ 
    Èç¹ûÒ»¸öÏß³ÌÔÚ¼¸¸öÏß³ÌͬʱִÐÐʱÔÚÂß¼­ÉÏÊÇÕýÈ·µÄ£¬Ôò³ÆËüΪḬ̈߳²È« 
µÄ¡£ÔÚÒ»¸öʵ¼ÊµÄˮƽÉÏ£¬°Ñ°²È«µÈ¼¶»®·ÖΪ3²ã±È½Ï·½±ã¡£ 
        ¡¤ ²»°²È« 
        ¡¤ Ḭ̈߳²È«--·Ç²¢ÐР
        ¡¤ Ḭ̈߳²È«--¶àḬ̈߳²È« 
    Ò»¸ö²»°²È«µÄ¹ý³Ì¿ÉÒÔÓÃÔÚ²Ù×÷ǰ¼Ó»¥³âËø£¬²Ù×÷ºó½â»¥³âËøµÄ°ì·¨À´Ê¹²Ù 
×÷ÐòÁл¯£¨¼´Ïû³ý²¢·¢£©¡£Ê¾Àý5-1Ê×ÏÈÏÔʾÁËÒ»¸ö¼ò»¯µÄfputs()µÄ·ÇḬ̈߳²È« 
ʵÏÖ¡£ 
    ½ÓÏÂÀ´ÊÇÓõ¥»¥³âËø±£»¤Ê¹²Ù×÷ÐòÁл¯µÄ°æ±¾¡£Êµ¼ÊÉÏ£¬Ê¹ÓÃÁ˱ÈÐèÒªµÄ¸ü 
Ç¿µÄͬ²½¡£Èç¹ûÁ½¸öÏ̵߳÷ÓÃfputs()À´´òÓ¡µ½²»Í¬µÄÎļþʱ£¬ÆäÖÐÒ»¸öÓò»×Å 
µÈ´ýÁíÒ»¸ö--ËüÃÇ¿ÉÒÔͬʱ²Ù×÷¡£ 
    ×îºóÒ»¸ö°æ±¾ÊǶàḬ̈߳²È«°æ¡£Ëü¸øÃ¿¸öÎļþ¼ÓÒ»¸öËø£¬ÔÊÐíÁ½¸öÏß³Ìͬʱ 
Ö¸Ïò²»Í¬µÄÎļþ¡£ËùÒÔ£¬MT-SAFE(¼´¶àḬ̈߳²È«)µÄº¯ÊýÊÇḬ̈߳²È«µÄ£¬²¢²»»áʹ 
ÔËÐÐÐÔÄܱ仵¡£ 
 
Code Example 5-1 Ḭ̈߳²È«µÄ³Ì¶È 
/*not thread-safe */ 
fputs(const char *s, FILE *stream){ 
                char *p; 
                for(p=s; *p; p++) 
                        putc((int)*p,stream); 
        } 
/*serializable*/ 
fputs(const char *s,FILE *stream){ 
                static mutex_t mut; 
                char *p; 
                mutex_lock(&m); 
                for(p=s;*p;p++) 
                        putc((int)*p,stream); 
                mutex_unlock(&m); 

/*MT-SAFE*/ 
mutex_t m[NFILE]; 
fputs(const char *s, FILE *stream){ 
                static mutex_t mut; 
                char *p; 
                mutex_lock(&m[fileno(stream)]); 
                for (p=s;*p;p++) 
                        putc((int)*p,stream); 
                mutex_unlock(&m[fileno(stream)]); 

 
5.2¶àÏ߳̽ӿڰ²È«µÈ¼¶ 
 
    man page(3)£º¿âº¯ÊýÓÃÏÂÃæµÄ·ÖÀàÀ´ÃèÊöÒ»¸ö½Ó¿ÚÖ§³Ö¶àÏ̵߳½Ê²Ã´³Ì¶È 
£¨ÕâЩ·ÖÀàÔÚIntro(3) man pageÖнâÊ͵ظüΪÏêϸ£©¡£ 
        Safe ¿ÉÒÔ±»¶àÏß³ÌÓ¦ÓóÌÐòµ÷Óà
        Safe with exceptions ÀýÍâµÄ²¿·ÖÇë²Î¼ûNOTES²¿·Ö 
        Unsafe Õâ¸ö½Ó¿ÚÖ»ÓÐÔÚÓ¦ÓóÌÐò±£Ö¤Ò»¸öʱ¿ÌÖ»ÓÐÒ»¸öÏß³ÌÖ´ÐÐʱ²Å 
                Äܰ²È«µ÷Óà
        MT-Safe ÍêȫΪ¶àÏß³ÌÉè¼Æ£¬²»µ«°²È«£¬»¹Ö§³ÖһЩ²¢·¢ÐÔ 
        MT-Safe with exceptions ÀýÍâµÄ²¿·ÖÇë²Î¼ûNOTES²¿·Ö 
        Async-Safe ¿ÉÒÔ±»Ò»¸öÐźſØÖÆÆ÷°²È«µ÷Óá£Ò»¸öÏß³ÌÔÚÖ´ÐР
Async-Safeº¯Êýʱ±»ÐźÅÖжϽ«²»»á²úÉúËÀËø¡£ 
    ÓйØsafe½Ó¿ÚÇë¿´¸½Â¼BµÄ±í"MT Safety Levels:Library Interfaces."£¬ 
ËüÀ´×Ôman pages£¨3£©¡£Èç¹ûÒ»¸öµÚÈý²¿·ÖµÄ½Ó¿Ú²»ÔÚ±íÄÚ£¬Ëü¾ÍÓпÉÄÜÊDz» 
°²È«µÄ£¨²»°üÀ¨Ô´¼æÈÝ¿âSource Compatibility Library£©¡£¼ì²éman pageºó²Å 
ÄÜÈ·¶¨¡£ 
    ÔÚ"man pages(2)£ºÏµÍ³µ÷ÓÃ"ÖÐÃèÊöµÄËùÓк¯Êý£¬³ýÁËvfork(2)Íâ¶¼ÊÇ 
MT-SafeµÄ¡£ 
    Ò»Ð©º¯ÊýÓÐÒâµØ²»×÷³É°²È«£¬ÒòΪÈçÏÂÔ­Òò¡£ 
    ¶ÔÓÚµ¥Ï̵߳ÄÓ¦ÓóÌÐò£¬MT-Safe»ØÔÚÒ»¶¨³Ì¶ÈÉϽµµÍÐÔÄÜ¡£ 
    º¯Êý±¾ÉíÓÐÒ»¸ö²»°²È«½Ó¿Ú¡£ÀýÈ磬һ¸öº¯Êý»á·µ»ØÒ»¸öÖ¸Ïò¶ÑÕ»»º³åÇø 
µÄÖ¸Õë¡£Äã¿ÉÒÔÓÃÕâЩº¯Êý"ÔÙ½øÈë"µÄ¶ÔµÈº¯Êý£¿£¿£¿£¨Ô­ÎÄΪ 
reentrant counterparts£©¡£ÔÙ½øÈ뺯ÊýµÄÃû×ÖÊÇÔ­º¯Êý¼Ó"_r"ºó׺¡£ 
------------------------------------- 
×¢Òâ--³ý·Çͨ¹ý²éѯÊÖ²áÒ³£¨man pages£©£¬·ñÔòÎÞ·¨È·¶¨Ò»¸ö²»ÒÔ"_r"½áβµÄ 
º¯ÊýÊÇ·ñMT-safe¡£·ÇMT-safeµÄº¯ÊýÒ»¶¨ÒªÓÐͬ²½»úÖÆµÄ±£»¤£¬»òÕß±»ÏÞÖÆÔÚ 
³õʼÏß³ÌÀï¡£ 
------------------------------------ 
 
*·Ç°²È«½Ó¿ÚµÄÌæ´ú(ÖØÈë Reentrant)º¯Êý 
 
    ¶ÔÓÚ´ó¶àÊý·Ç°²È«½Ó¿ÚµÄº¯Êý£¬¶¼´æÔÚÒ»¸öMT-safeµÄ°æ±¾¡£ÐµÄMT-safeº¯ 
ÊýÒ»°ãÊǾɵķǰ²È«º¯Êý¼ÓÉÏ"_r"ºó׺¡£SolarisϵͳÌṩÒÔϵÄ"_r"º¯Êý¡£ 
 
Table 5-1 Ìæ´úº¯Êý 
asctime_r(3C)           ctermid_r(3S)           ctime_r(3C) 
fgetgrent_r(3C)         fgetpwent_r(3C)         fgetspent_r(3C) 
Gamma_r(3M)             getgrgid_r(3C)          getgrnam_r(3C) 
getlogin_r(3C)          getpwnam_r(3C)          getpwuid_r(3C) 
getgrent_r(3C)          gethostbyaddr_r(3N)     gethostbyname_r(3N) 
gethostent_r(3N)        getnetbyaddr_r(3N)      getnetbyname_r(3N) 
getnetent_r(3N)         Getprotobyname_r(3N)    getprotobynumber_r(3N) 
getprotoent_r(3N)       getpwent_r(3C)          getrpcbyname_r(3N) 
getrpcbynumber_r(3N)    getrpcent_r(3N)         getservbyname_r(3N) 
getservbyport_r(3N)     getservent_r(3N)        getspent_r(3C) 
getspnam_r(3C)          gmtime_r(3C)            lgamma_r(3M) 
localtime_(3C)r         nis_sperror_r(3N)       rand_r(3C) 
readdir_r(3C)           strtok_r(3C)            tmpnam_r(3C) 
ttyname_r(3C)            
 
5.3Òì²½°²È«º¯Êý 
 
    ¿ÉÒÔ±»ÐźſØÖÆÆ÷°²È«µ÷Óõĺ¯Êý±»³ÆÎªAsync-SafeµÄ¡£POSIX±ê×¼¶¨Òå²¢ 
ÏêÁÐÁËÒì²½°²È«º¯Êý£¨IEEE Std 1003.1-1990.3.3.1.3(3)(f), page 55£©¡£³ý 
ÁËPOSIXÒì²½°²È«º¯ÊýÍ⣬ÏÂÁÐÈý¸öº¯ÊýÒ²ÊÇÒì²½°²È«µÄ¡£ 
        ¡¤ sema_post(3T) 
        ¡¤ thr_sigsetmask(3T) 
        ¡¤ thr_kill(3T) 
 
5.4¿âµÄ¶àḬ̈߳²È«µÈ¼¶ 
 
    ËùÓпÉÄܱ»¶àÏ̳߳ÌÐòµÄÏ̵߳÷Óõĺ¯Êý¶¼Ó¦µ±ÊÇMT-SafeµÄ¡£ 
    ÕâÒâζ׏ý³Ì¿ÉÒÔͬʱÕýÈ·µØÖ´ÐÐÁ½¸ö²Ù×÷¡£ËùÒÔ£¬Ã¿Ò»¸ö±»¶àÏ̳߳ÌÐò 
ʹÓõĽӿڶ¼Ó¦ÊÇMT-Safe¡£ 
    ²¢²»ÊÇËùÓеĿⶼÊÇMT-SafeµÄ¡£Í¨³£±»Ê¹ÓõÄMT-SafeµÄ¿âÏêÁÐÓÚ±í5-2ÖС£ 
ÆäËûµÄ¿âÒ²½«×îÖÕ±»¸Äд³ÉMT-SafeµÄ¡£ 
        ±í5-2 Ò»Ð©MT-Safe¿â 
------------------------------------ 
¿â                                      ËµÃ÷ 
------------------------------------ 
lib/libc                getXXbyYY½Ó¿Ú£¨ÀýÈçgethostbyname(3N)£©ÊÇMT-SafeµÄ 
lib/libdl_stubs         £¨Ö§³Östatic switch compiling£© 
lib/libintl 
lib/libm                ½öµ±Îª¹²Ïí¿â±àÒëʱÊÇMT-SafeµÄ£¬µ«ÓëÎĵµ¿âÁ¬½Óʱ 
                        ²»ÊÇMT-SafeµÄ 
lib/libmalloc 
lib/libmapmalloc 
lib/libnsl              °üÀ¨TLI½Ó¿Ú£¬XDR£¬RPC¿Í»§·½ºÍ·þÎñ·½£¬netdirºÍ 
                        netselect¡£ GetXXbyYYÊDz»°²È«µÄ£¬µ«ÓÐḬ̈߳²È«°æ±¾ 
                        GetXXbyYY_r 
lib/libresolv           Ö§³ÖÒòÏ̶߳øÒìµÄ´íÎóÂë 
lib/libsocket 
lib/libw 
lib/nametoaddr 
lib/nametoaddr 
lib/nsswitch 
libX11 
libC                    £¨²»ÊÇSolarisϵͳµÄ²¿·Ö£»¿ÉÒÔ·Ö¿ª¹ºÂò£© 
------------------------------------ 
         
*²»°²È«¿â 
 
    Èç¹û¿âÖеĺ¯Êý²»ÊÇMT-SafeµÄ£¬ÔòÖ»ÓÐÔÚÒ»¸öÏ̵߳ĵ÷ÓÃʱ²ÅÊǰ²È«µÄ¡£ 
 
-- 
¡ù À´Ô´:¡¤BBS Ë®Ä¾Ç廪վ bbs.net.tsinghua.edu.cn¡¤[FROM: sys11.cic.tsing] 

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