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

·¢ÐÅÈË: forest (ÇẮС¥~~С¼ªÆª), ÐÅÇø: Unix        
±ê  Ìâ: [×ªÔØ]unix»·¾³¸ß¼¶±à³Ì-12 (×ªÔØ) 
·¢ÐÅÕ¾: BBS Ë®Ä¾Ç廪վ (Fri Mar 17 17:51:53 2000) 
 
¡¾ ÒÔÏÂÎÄ×Ö×ªÔØ×Ô Linux ÌÖÂÛÇø ¡¿ 
¡¾ Ô­ÎÄÓÉ SuperSB Ëù·¢±í ¡¿ 
 
 
 
·¢ÐÅÈË: taosm (128+64-->cool), ÐÅÇø: unix  
±ê  Ìâ: unix»·¾³¸ß¼¶±à³Ì--µÚ12Õ ¸ß¼¶I/O  
·¢ÐÅÕ¾: Î÷Ê®°ËBBS (Sat Mar 11 13:50:56 2000), ×ªÐÅ  
   
   
µÚÊ®¶þÕ   ¸ß¼¶I/O  
12.1 ÒýÑÔ  
±¾ÕÂÄÚÈݰüÀ¨£º·Ç×èÈûI/O¡¢¼ÇÂ¼Ëø¡¢ÏµÍ³VÁ÷»úÖÆ¡¢I/O¶à·ת½Ó£¨selectºÍpoll  
º¯Êý£©¡¢readvºÍwritevº¯Êý£¬ÒÔ¼°´æ´¢Ó³ÕÕI/O£¨mmap£©¡£ÔÚµÚÊ®ËÄÕ¡¢Ê®ÎåÕÂÖР 
˵Ã÷µÄ½ø³Ì¼äͨÐÅ£¬ÒÔ¼°ÒÔºó¸÷ÕÂÖеĺܶàʵÀý¶¼ÒªÊ¹Óñ¾ÕÂËùÊöµÄ¸ÅÄîºÍº¯Êý¡£  
   
12.2 ·Ç×èÈûI/O  
ÔÚ10.5½ÚÖÐÔø½«ÏµÍ³µ÷Ó÷ֳÉÁ½ÀࣺµÍËÙϵͳµ÷ÓÃºÍÆäËü¡£µÍËÙϵͳµ÷ÓÃÊÇ¿ÉÄܻᠠ
ʹ½ø³ÌÓÀÔ¶×èÈûµÄÒ»Ààϵͳµ÷Ó㺠 
l Èç¹ûÊý¾Ý²¢²»´æÔÚ£¬Ôò¶ÁÎļþ¿ÉÄÜ»áʹµ÷ÓÃÕßÓÀÔ¶×èÈû£¨ÀýÈç¶Á¹ÜµÀ£¬ÖÕ¶ËÉ豸  
ºÍÍøÂçÉ豸£©¡£  
l Èç¹ûÊý¾Ý²»ÄÜÁ¢¼´±»½ÓÊÜ£¬ÔòдÕâЩͬÑùµÄÎļþÒ²»áʹµ÷ÓÃÕßÓÀÔ¶×èÈû¡£  
l ÔÚijЩÌõ¼þ·¢Éú֮ǰ£¬´ò¿ªÎļþ»á±»×èÈû£¨ÀýÈç´ò¿ªÒ»¸öÖÕ¶ËÉ豸¿ÉÄÜÐèµÈ´ýµ½  
Ò»¸öÁ¬½ÓµÄµ÷ÖÆ½âµ÷Æ÷Ó¦´ð£»ÓÖÀýÈçÈôÒÔֻд·½Ê½´ò¿ªFIFO£¬ÄÇôÔÚûÓÐÆäËü½ø³Ì  
ÒÑÓöÁ·½Ê½´ò¿ª¸ÃFIFOʱҲҪµÈ´ý£©¡£  
l ¶ÔÒѾ­¼ÓÉÏÁËÇ¿ÖÆÐÔ¼ÇÂ¼ËøµÄÎļþ½øÐжÁ¡¢Ð´¡£  
l Ä³Ð©ioctl²Ù×÷¡£  
l Ä³Ð©½ø³Ì¼äͨÐź¯Êý£¨µÚÊ®ËÄÕ£©¡£  
ËäÈ»¶Á¡¢Ð´´ÅÅÌÎļþ»áʹµ÷ÓÃÔÚ¶ÌÔÝʱ¼äÄÚ×èÈû£¬µ«²¢²»Äܽ«ËüÃÇÊÓΪ"µÍËÙ"¡£  
·Ç×èÈûI/OʹÎÒÃÇ¿ÉÒÔµ÷Óò»»áÓÀÔ¶×èÈûµÄI/O²Ù×÷£¬ÀýÈçopen,readºÍwrite¡£Èç¹û  
ÕâÖÖ²Ù×÷²»ÄÜÍê³É£¬ÔòÁ¢¼´³ö´í·µ»Ø£¬±íʾ¸Ã²Ù×÷Èç¼ÌÐøÖ´Ðн«¼ÌÐø×èÈûÏÂÈ¥¡£  
¶ÔÓÚÒ»¸ö¸ø¶¨µÄÃèÊö·ûÓÐÁ½ÖÖ·½·¨¶ÔÆäÖ¸¶¨·Ç×èÈûI/O£º  
1. Èç¹ûÊǵ÷ÓÃopenÒÔ»ñµÃ¸ÃÃèÊö·û£¬Ôò¿ÉÖ¸¶¨O_NONBLOCK±êÖ¾£¨3.3½Ú£©¡£  
2. ¶ÔÓÚÒѾ­´ò¿ªµÄÒ»¸öÃèÊö·û£¬Ôò¿Éµ÷ÓÃfcntl£¬¶ÔÆä´ò¿ªO_NONBOCKÎļþ״̬±ê  
Ö¾£¨3.13½Ú£©¡£ÔÚ³ÌÐò3.5Öеĺ¯Êý¿ÉÓÃÀ´ÎªÒ»¸öÃèÊö·û´ò¿ªÈÎÒ»Îļþ״̬±êÖ¾¡£  
   
ÔçÆÚµÄϵͳV°æ±¾Ê¹ÓñêÖ¾O_NDELAYÖ¸¶¨·Ç×èÈû·½Ê½¡£ÔÚÕâЩ°æ±¾ÖУ¬Èç¹ûÎÞÊý¾Ý  
¿É¶Á£¬Ôòread·µ»ØÖµ0¡£¶øUnixÓÖ³£½«readµÄ·µ»ØÖµ0½âÊÍΪÎļþ½áÊø£¬Á½ÕßÓÐËù»ì  
Ïý¡£PISIX.1ÔòÌṩÁËÒ»¸ö·Ç×èÈû±êÖ¾£¬ËüµÄÃû×ÖºÍÓïÒå¶¼ÓëO_NDELAY²»Í¬¡£PISI  
X.1ÒªÇ󣬶ÔÓÚÒ»¸ö·Ç×èÈûµÄÃèÊö·ûÈç¹ûÎÞÊý¾Ý¿É¶Á£¬Ôòread·µ»Ø-1£¬²¢ÇÒerrno±»  
ÉèÖÃΪEAGAIN¡£SVR4Ö§³Ö½ÏÀϵÄO_NDELAYºÍPOSIX.1µÄO_NONBLOCK£¬µ«ÔÚ±¾ÊéµÄʵ  
ÀýÖÐֻʹÓÃPOSIX.1¹æ¶¨µÄÌØÕ÷¡£O_NDELAYÊÇΪÁËÏòºó¼æÈÝÐÔ£¬²»Ó¦ÔÚÐÂÓ¦ÓóÌÐò  
ÖÐʹÓᣠ 
4.3BSDΪfcntlÌṩFNDELAY±êÖ¾£¬ÆäÓïÒåÒ²ÉÔÓÐÇø±ð¡£Ëü²»Ö»Ó°Ïì¸ÃÃèÊö·ûµÄÎļþ  
״̬±êÖ¾£¬Ëü½«ÖÕ¶ËÉ豸»òÌ׽ӿڵıêÖ¾¸ü¸Ä³É·Ç×èÈûµÄ£¬Òò´ËÓ°ÏìÁËÖÕ¶Ë»òÌ×½Ó  
¿ÚµÄËùÓÐÓû§£¬²»Ö»ÊÇÓ°Ïì¹²ÏíͬһÎļþ±íÏîµÄÓû§£¨4.3BSD·Ç×èÈûI/OÖ»¶ÔÖÕ¶Ë  
ºÍÌ×½Ó¿ÚÆð×÷Óã©¡£Èç¹û¶ÔÒ»¸ö·Ç×èÈûÃèÊö·ûµÄ²Ù×÷²»ÄÜÎÞ×èÈûµØÍê³É£¬ÄÇô4.3  
BSD·µ»ØEWOULDBLOCK¡£4.3+BSDÌṩPOSIX.1µÄO_NONBLOCK±êÖ¾£¬µ«ÆäÓïÒåÈ´ÀàËÆÓÚ  
4.3BSDµÄFNDELAY¡£·Ç×èÈûI/Oͨ³£ÓÃÀ´´¦ÀíÖÕ¶ËÉ豸»òÍøÂçÁ¬½Ó£¬¶øÕâЩÉ豸ͨ³£  
Ò»´ÎÓÉÒ»¸ö½ø³ÌʹÓá£Õâ¾ÍÒâζ×ÅBSDÓïÒåµÄ¸ü¸Äͨ³£²»»áÓ°ÏìÎÒÃÇ¡£³ö´í·µ»ØEW  
OULDBLOCK¶ø²»ÊÇPOSIX.1µÄEAGAIN£¬ÕâÔì³ÉÁË¿ÉÒÆÖ²ÐÔÎÊÌ⣬ÎÒÃDZØÐë´¦ÀíÕâÒ»ÎÊ  
Ìâ¡£4.3+BSDÒ²Ö§³ÖFIFO£¬·Ç×èÈûI/OÒ²¶ÔFIFOÆð×÷Óᣠ 
ʵÀý  
³ÌÐò12.1ÊÇÒ»¸ö·Ç×èÈûI/OµÄʵÀý£¬Ëü´Ó±ê×¼ÊäÈë¶Á100£¬000×Ö½Ú£¬²¢ÊÔͼ½«ËüÃÇ  
дµ½±ê×¼Êä³öÉÏ¡£¸Ã³ÌÐòÏȽ«±ê×¼Êä³öÉèÖÃΪ·Ç×èÈûµÄ£¬È»ºóÓÃforÑ­»·½øÐÐÊä³ö  
£¬Ã¿´ÎдµÄ½á¹û¶¼ÔÚ±ê×¼³ö´íÉÏ´òÓ¡¡£º¯Êýctl-f1ÀàËÆÓÚ³ÌÐò3.5ÖеÄset-f1£¬µ«  
Óëset-f1µÄ¹¦ÄÜÏà·´£¬ËüÇå³ý1¸ö»ò¶à¸ö±ê־λ¡£  
#include        <sys/types.h>  
#include        <errno.h>  
#include        <fcntl.h>  
#include        "ourhdr.h"  
char    buf[100000];  
int  
main(void)  
{  
        int             ntowrite, nwrite;  
        char    *ptr;  
        ntowrite = read(STDIN_FILENO, buf, sizeof(buf));  
        fprintf(stderr, "read %d bytes\n", ntowrite);  
        set_fl(STDOUT_FILENO, O_NONBLOCK);      /* set nonblocking */  
        for (ptr = buf; ntowrite > 0; ) {  
                errno = 0;  
                nwrite = write(STDOUT_FILENO, ptr, ntowrite);  
                fprintf(stderr, "nwrite = %d, errno = %d\n", nwrite, errno);  
                if (nwrite > 0) {  
                        ptr += nwrite;  
                        ntowrite -= nwrite;  
                }  
        }  
        clr_fl(STDOUT_FILENO, O_NONBLOCK);      /* clear nonblocking */  
        exit(0);  
}  
³ÌÐò12.1  ³¤µÄ·Ç×èÈûд  
Èô±ê×¼Êä³öÊÇÆÕͨÎļþ£¬Ôò¿ÉÒÔÆÚÍûwriteÖ»Ö´ÐÐÒ»´Î¡£  
$ ls -l /etc/termcap  
 Ó¡Îļþ³¤¶È  
-rw-rw-r-1 root 133439 Oct 11 1990 /etc/termcap  
$a.out < /etc/termcap >temp.file                                        ÏÈÊÔÒ»ÆÕ  
 Îļþ  
read 100000 bytes  
nwrite-100000, errno=0                                                  Ò»´Îд  
$ls -l temp.file  
 ÑéÊä³öÎļþ³¤¶È  
-rw-rw-r-1 stevens 100000 Nev 21 16:27 temp.file  
µ«ÊÇ£¬Èô±ê×¼Êä³öÊÇÖÕ¶Ë£¬Ôò¿ÉÆÚÍûwriteÓÐʱ»á·µ»ØÒ»¸öÊý×Ö£¬ÓÐʱÔò³ö´í·µ»Ø  
¡£ÏÂÃæÊÇÔÚÒ»¸öϵͳÉÏÔËÐгÌÐò12.1µÄ½á¹û£º  
$ a.out < /etc/termcap 2>stderr.out                             ÏòÖÕ¶ËÊä³ö  
   
       ´óÁ¿Êä³öÖÁÖÕ¶Ë  
$ cat stderr.out  
read 100000 bytes  
nwrite=8192, errno=0  
nwrite=8192, errno=0  
nwrite=-1, errno=11  
âÖÖ´í211´Î  
¡­  
nwrite=4096,errno=0  
nwrite=-1, errno=11  
âÖÖ´í698´Î  
¡­  
nwrite=4096,errno=0  
nwrite=-1, errno=11  
âÖÖ´í604´Î  
¡­  
nwrite=4096,errno=0  
nwrite=-1, errno=11  
âÖÖ´í1047´Î  
¡­  
nwrite=-1, errno=11  
âÖÖ´í1046´Î  
¡­  
nwrite=4096,errno=0                                                     ¡­µÈµÈ  
ÔÚ¸ÃϵͳÉÏ£¬errno11ÊÇEAGAIN¡£´ËϵͳÉϵÄÖÕ¶ËÇý¶¯³ÌÐò×ÜÊÇÒ»´Î½ÓÊÕ4096»ò81  
92×Ö½Ú¡£ÔÚÁíÒ»¸öϵͳÉÏ£¬Ç°Èý¸öwrite·µ»Ø2005£¬1822ºÍ1811£¬È»ºóÊÇ96´Î³ö´í  
·µ»Ø£¬½Ó×ÅÊÇ·µ»Ø1864µÈµÈ¡£  
ÿ¸öwriteÄÜд¶àÉÙ×Ö½ÚÊÇÒÀÀµÓÚϵͳµÄ¡£  
´Ë³ÌÐòÔÚSVRÖÐÔËÐУ¬ÔòÆä½á¹ûÍêÈ«²»Í¬ÓÚÇ°ÃæµÄÇé¿ö¡£µ±Êä³öµ½ÖÕ¶ËÉÏʱ£¬Êä³ö  
¸ÃÕû¸öÊäÈëÎļþÖ»ÐèÒªÒ»¸öwrite¡£ÏÔÈ»£¬·Ç×èÈû·½Ê½²¢²»¹¹³ÉÇø±ð¡£´´½¨ÁËÒ»¸ö  
½Ï´óµÄÊäÈëÎļþ£¬²¢ÇÒϵͳΪÔËÐиóÌÐòÔö¼ÓÁ˳ÌÐò»º´æ¡£³ÌÐòµÄÕâÖÖÔËÐз½Ê½£¨  
¼´Êä³öÒ»Õû¸öÎļþ£¬Ö»µ÷ÓÃÒ»´Îwrite£©Ò»Ö±¼ÌÐøµ½ÊäÈëÎļþ³¤¶Èµ½´ïÔ¼700£¬000  
×Ö½Ú¡£µ½´ï´Ë³¤¶Èºó£¬Ã¿Ò»¸öwrite¶¼·µ»Ø³ö´íEAGAIN¡££¨ÊäÈëÎļþÔò¾ö²»»áÔÙÊä  
³öµ½ÖÕ¶ËÉÏ-¸Ã³ÌÐòÖ»ÊÇÁ¬ÐøµØ²úÉú³ö´íÏûÏ¢Á÷¡££©  
ËùÒÔ·¢ÉúÕâÖÖÇé¿öÊÇÒòΪ£ºÔÚSVR4ÖÐÖÕ¶ËÇý¶¯³ÌÐòͨ¹ýÁ÷I/OϵͳÁ¬½Óµ½³ÌÐò¡££¨  
12.4½Ú½«Ïêϸ˵Ã÷Á÷¡££©Á÷ϵͳÓÐËü×Ô¼ºµÄ»º´æ£¬ËüÒ»´ÎÄÜ´Ó³ÌÐò½ÓÊÕ¸ü¶àµÄÊý¾Ý  
¡£SVR4µÄÐÐΪҲÒÀÀµÓÚÖÕ¶ËÀàÐÍ-Ó²Á¬ÏßÖÕ¶Ë¡¢¿ØÖÆÌ¨É豸»òαÖÕ¶Ë¡£  
ÔÚ´ËʵÀýÖУ¬³ÌÐò·¢³öÁËÊýǧ¸öwriteµ÷Ó㬵«ÊÇÖ»ÓÐ20¸ö×óÓÒÊÇÕæÕýÊä³öÊý¾ÝµÄ  
£¬ÆäÓàµÄÔò³ö´í·µ»Ø¡£ÕâÖÖÐÎʽµÄÑ­»·³ÆÎªÂÖѯ£¬ÔÚ¶àÓû§ÏµÍ³ÉÏËüÀË·ÑÁËCPUʱ  
¼ä¡£ÔÚ12.5½ÚÖУ¬ÎÒÃǽ«»á¿´µ½¶ÔÓÚ·Ç×èÈûÃèÊö·ûµÄI/O£¬¶à·ת½ÓÊǽøÐÐÕâÖÖ²Ù  
×÷µÄ¸ü¼ÓÓÐЧµÄ·½·¨¡£  
ÔÚµÚÊ®ÆßÕ£¬ÎÒÃǽ«»áÓõ½·Ç×èÈûI/O£¬ÄÇʱÎÒÃÇÒªÊä³öµ½ÖÕ¶ËÉ豸£¨PostScript  
´òÓ¡»ú£©¶øÇÒ²»Ï£ÍûÔÚwriteÉÏ×èÈû¡£  
12.3 ¼ÇÂ¼Ëø£¨Record Locking£©  
µ±Á½¸öÈËͬʱ±à¼­Ò»¸öÎļþʱ£¬Æäºó¹û½«ÈçºÎÄØ£¿ÔںܶàUnixϵͳÖУ¬¸ÃÎļþµÄ×î  
ºó״̬ȡ¾öÓÚд¸ÃÎļþµÄ×îºóÒ»¸ö½ø³Ì¡£µ«ÊǶÔÓÚÓÐЩӦÓóÌÐò£¬ÀýÈçÊý¾Ý¿â£¬ÓР 
ʱ½ø³ÌÐèҪȷ±£ËüÕýÔÚµ¥¶Àдһ¸öÎļþ¡£ÎªÁËÏò½ø³ÌÌṩÕâÖÖÄÜÁ¦£¬½ÏеÄUnixϵ  
ͳÌṩÁ˼ÇÂ¼Ëø»úÖÆ¡££¨ÔÚµÚÊ®ÁùÕÂÖаüº¬ÁËʹÓüÇÂ¼ËøµÄÊý¾Ý¿â×Ó³ÌÐò¿â¡££©  
¼ÇÂ¼Ëø»úÖÆµÄ¹¦ÄÜÊÇ£ºÒ»¸ö½ø³ÌÕýÔÚ¶Á»òÐÞ¸ÄÎļþµÄij¸ö²¿·Öʱ£¬¿ÉÒÔ×èÖ¹ÆäËü½ø  
³ÌÐÞ¸ÄͬһÎļþÇø¡£¶ÔÓÚUnix£¬"¼Ç¼"Õâ¸ö¶¨ÓïÒ²ÊÇÎóÓã¬ÒòΪUnixϵͳºË¸ù±¾Ã»  
ÓÐʹÓÃÎļþ¼Ç¼ÕâÖÖ¸ÅÄî¡£Ò»¸ö¸üÊʺϵÄÊõÓï¿ÉÄÜÊÇ"ÇøÓòËø"£¬ÒòΪËüËø¶¨µÄÖ»ÊÇ  
ÎļþµÄÒ»¸öÇøÓò£¨Ò²¿ÉÄÜÊÇÕû¸öÎļþ£©¡£  
ÀúÊ·  
    Í¼12.1¡¡¡¡Ê¾³öÁ˸÷ÖÖUnixϵͳÌṩµÄ²»Í¬ÐÎʽµÄ¼ÇÂ¼Ëø¡£  
ͼ12.1¡¡¡¡¸÷ÖÖUnixϵͳ֧³ÖµÄ¼ÇÂ¼ËøÐÎʽ  
ÔÚ±¾½ÚµÄ×îºó²¿·Ö½«ËµÃ÷½¨ÒéÐÔËøºÍÇ¿ÖÆÐÔËøÖ®¼äµÄÇø±ð¡£POSIX.1Ñ¡ÔñÁËÒÔfcnt  
lº¯ÊýΪ»ù´¡µÄϵͳ£Ö·ç¸ñµÄ¼ÇÂ¼Ëø¡£ÕâÖÖ·ç¸ñÒ²µÃµ½£´.£³BSD¡¡Reno°æ±¾µÄÖ§³Ö  
¡£  
ÔçÆÚµÄ±´¿ËÀ³°æÖ»Ö§³ÖBSD flockº¯Êý¡£´Ëº¯ÊýÖ»ËøÕû¸öÎļþ£¬¶ø²»ËøÎļþÖеÄÒ»  
¸öÇøÓò¡£µ«ÊÇPOSIX.1µÄfcntlº¯Êý¿ÉÒÔËøÎļþÖеÄÈÎÒ»ÇøÓò£¬´óÖÁÕû¸öÎļþ£¬Ð¡ÖÁ  
µ¥¸ö×Ö½Ú¡£  
ÔÚ±¾ÊéÖÐֻ˵Ã÷POSIX.1µÄfcntlËø¡£ÏµÍ³VµÄlockfº¯ÊýÖ»ÊÇfcntlº¯ÊýµÄÒ»¸ö½çÃæ  
¡£  
        ¼ÇÂ¼ËøÊÇ1980ÄêÓÉJohn Bass×îÔç¼Óµ½Version7Éϵġ£ÏµÍ³ºËÖÐÏàӦϵͳ  
µ÷ÓÃÈë  
        ¿Ú±íÏîÊÇÃûΪlockingµÄº¯Êý¡£´Ëº¯ÊýÌṩÁËÇ¿ÖÆÐÔ¼ÇÂ¼Ëø¹¦ÄÜ£¬Ëü´«µ½  
Á˺ܶàÖÆ  
        ÔìÉ̵ÄϵͳIII°æ±¾¡£Xenixϵͳ²ÉÓÃÁ˴˺¯Êý£¬SVR4ÔÚXenix¼æÈÝ¿âÖÐÈÔ  
¾ÉÖ§  
        ³Ö¸Ãº¯Êý¡£  
        SVR2ÊÇϵͳVÖеÚÒ»¸öÖ§³Öfcntl·ç¸ñ¼ÇÂ¼ËøµÄ°æ±¾£¨1984£©¡£  
fcntl¼ÇÂ¼Ëø  
    3.13½ÚÖÐÒѾ­¸ø³öÁËfcntlº¯ÊýµÄÔ­ÐÍ£¬ÎªÁËÐð˵·½±ã£¬ÕâÀïÔÙÖØ¸´Ò»´Î¡£  
_______________________________________________________________________  
________  
#include <sys/types.h>  
#include <unistd.h>  
#include <fcnt1.h>  
int fcnt1(int filedes,int cmd,¡­/* struct flock *flockptr */);  
                                                ·µ»Ø£ºÈô³É¹¦ÒÀÀµÓÚcmd£¨¼ûÏ£©£¬³  
´íΪ-1  
_______________________________________________________________________  
________  
¶ÔÓÚ¼ÇÂ¼Ëø£¬cmdÊÇF_GETLK¡¢F_SETLK»òF_SETLKW¡£µÚÈý¸ö²ÎÊý£¨ÎÒÃǽ«Æä³ÆÎªfl  
ockptr£©ÊÇÒ»¸öÖ¸Ïòflock½á¹¹µÄÖ¸Õë¡£  
Struct flock{  
short l_type;           /* F_RDLCK,F_WRLCK, »ò F_UNLCK */  
off_t l_start;          /*Ïà¶ÔÓÚl_whenceµÄ×Ö½ÚÎ»ÒÆÁ¿*/  
short l_whence  /SEEK_SET,SEEK_CUR,»òSEEK_END */  
off_t l_len;            /*³¤¶È£¨×Ö½Ú£©£¬O±íÊ¾ËøÖÁEOF */  
pid_t l_pid;            /*ËæF--FETLKÃüÁî·µ»Ø  
}  
flock½á¹¹ËµÃ÷£º  
l ËùÏ£ÍûµÄËøÀàÐÍ£ºF_RDLCK£¨¹²Ïí¶ÁËø£©¡¢F_WRLCK£¨¶ÀÕ¼ÐÔÐ´Ëø£©¡¢»òF_UNLCK  
£¨½âËøÒ»¸öÇøÓò£©  
l Òª¼ÓËø»ò½âËøµÄÇøÓòµÄÆðʼµØÖ·£¬ËüÓÉl_stantºÍl__whenceÁ½Õß¾ö¶¨¡£l_statÊÇ  
Ïà¶ÔÎ»ÒÆÁ¿£¨×Ö½Ú£©£¬l_whenceÔò¾ö¶¨ÁËÏà¶ÔÎ»ÒÆÁ¿µÄÆðµã¡£ÕâÓëlseekÖеÄʹÓà 
·½·¨Ò»Ñù¡£  
l ÇøÓòµÄ³¤¶È£¬ÕâÓÉl_len±íʾ¡£  
¹ØÓÚ¼ÓËøºÍ½âËøÇøÓòµÄ˵Ã÷»¹Òª×¢ÒâÏÂÁи÷µã£º  
l ¸ÃÇøÓò¿ÉÒÔÔÚµ±Ç°Îļþβ¶Ë´¦¿ªÊ¼»ò³¬¹ýÆäβ¶Ë´¦¿ªÊ¼£¬µ«ÊDz»ÄÜÔÚÎļþÆðʼλ  
ÖÃ֮ǰ¿ªÊ¼»òÔ½¹ý¸ÃÆðʼλÖᣠ 
l ÈçÈôl_lenΪ0£¬Ôò±íÊ¾ËøµÄÇøÓò´ÓÆäÆðµã£¨ÓÉl_startºÍl_whence¾ö¶¨£©¿ªÊ¼Ö±  
ÖÁ×î´ó¿ÉÄÜλÖÃΪֹ¡£Ò²¾ÍÊDz»¹ÜÌíдµ½¸ÃÎļþÖжàÉÙÊý¾Ý£¬Ëü¶¼´¦ÓÚËøµÄ·¶Î§¡£  
   
l ÎªÁËËøÕû¸öÎļþ£¬Í¨³£µÄ·½·¨Êǽ«l_start˵Ã÷Ϊ0£¬l_whence˵Ã÷ΪSEEK_SET£¬  
l_len˵Ã÷Ϊ0¡£  
ÉÏÃæÌáµ½ÁËÁ½¸öËøÀàÐÍ£º¹²Ïí¶ÁËø£¨l_typeΪF_RDLCK£©ºÍ¶ÀռдËö£¨F_WRLCK£©¡£  
»ù±¾¹æÔòÊÇ£º¶à¸ö½ø³ÌÔÚÒ»¸ö¸ø¶¨µÄ×Ö½ÚÉÏ¿ÉÒÔÓÐÒ»°Ñ¹²ÏíµÄ¶ÁËø£¬µ«ÊÇÔÚÒ»¸ö¸ø  
¶¨×Ö½ÚÉϵÄÐ´ËøÔòÖ»ÄÜÓÉÒ»¸ö½ø³Ì¶ÀÓ᣸ü½øÒ»²½¶øÑÔ£¬Èç¹ûÔÚÒ»¸ö¸ø¶¨¼Ó×Ö½ÚÉÏ  
ÒѾ­ÓÐÒ»°Ñ»ò¶à°Ñ¶ÁËø£¬Ôò²»ÄÜÔÚ¸Ã×Ö½ÚÉÏÔÙ¼ÓÐ´Ëø£»Èç¹ûÔÚÒ»¸ö×Ö½ÚÉÏÒѾ­ÓÐÒ»  
°Ñ¶ÀÕ¼ÐÔµÄÐ´Ëø£¬Ôò²»ÄÜÔÙ¶ÔËü¼ÓÈκζÁËø¡£ÔÚͼ12.2ÖÐʾ³öÁËÕâЩ¹æÔò¡£  
ͼ12.2  ²»Í¬ÀàÐÍËøÖ®¼äµÄ¼æÈÝÐÔ  
    ÎªÁ˼ӶÁËø£¬¸ÃÃèÊö·û±ØÐëÊǶÁ´ò¿ª£¬ÎªÁ˼ÓÐ´Ëø£¬¸ÃÃèÊö·û±ØÐëÊÇд´ò¿ª¡£  
   
    ÏÖÔÚ˵Ã÷fcntlº¯ÊýµÄÈýÖÖÃüÁî¡£  
    F_GETLK   ¾ö¶¨ÓÉflockptrËù˵Ã÷µÄËøÊÇ·ñ±»ÁíÍâÒ»°ÑËøËùÅų⣨×èÈû£©¡£Èç  
¹û´æÔÚÒ»°ÑËø£¬Ëü×èÖ¹´´½¨ÓÉflockptrËùÃèÊö·ûµÄËø£¬ÔòÕâ°ÑÏÖ´æµÄËøµÄÐÅϢдµ½  
flockptrÖ¸ÏòµÄ½á¹¹ÖУ»Èç¹û²»´æÔÚÕâÖÖÇé¿ö£¬Ôò³ýl_typeÉèÖÃΪF_UNLCKÖ®Í⣬  
flockptrËùÖ¸Ïò½á¹¹ÖÐµÄÆäËüÐÅÏ¢¡¢±£³Ö²»±ä¡£  
    F_SETLK   ÉèÖÃÓÉflockptrËùÃèÊöµÄËø¡£Èç¹ûÊÔͼ½¨Á¢Ò»°Ñ°´ÉÏÊö¼æÈÝÐÔ¹æÔò  
²¢²»ÔÊÐíµÄËø£¬ÔòfcntlÁ¢¼´³ö´í·µ»Ø£¬´ËʱerrnoÉèÖÃΪEACCES»òEAGAIN¡£  
               SVR2ºÍSVR4·µ»ØEACCES£¬µ«ÊÖ²áÒ³¾¯¸æ½«À´·µ»ØEAGAIN¡£4.3+BS  
DÔò·µ»ØEAGAIN¡£POSIX.1ÔÊÐíÕâÁ½ÖÖÇé¿ö¡£  
            ´ËÃüÁîÒ²ÓÃÀ´Çå³ýÓÉflockptr˵Ã÷µÄËø£¨l_typeΪF_UNLCK£©¡£  
    F_SETLKW  ÕâÊÇF_SETLKµÄ×èÈû°æ±¾£¨ÃüÁîÃûÖеÄW±íʾµÈ´ý£¨wait£©£©¡£Èç¹û  
ÓÉÓÚ´æÔÚÆäËüËø£¬ÄÇô°´¼æÈÝÐÔ¹æÔòÓÉflockptrËùÒªÇóµÄËø²»Äܱ»´´½¨£¬Ôòµ÷Óýø  
³Ì˯Ãß¡£Èç¹û²¶×½µ½ÐźÅÔò˯ÃßÖжϡ£  
Ó¦µ±Á˽⣬ÓÃF_GETLK²âÊÔÄÜ·ñ½¨Á¢Ò»°ÑËø£¬È»ºóÓÃF_SETLKºÍF_SETLKWÆóͼ½¨Á¢Ò»  
°ÑËø£¬ÕâÁ½Õß²»ÊÇÒ»¸öÔ­×Ó²Ù×÷¡£ÔÚÕâÁ½¸ö²Ù×÷Ö®¼ä¿ÉÄÜ»áÓÐÁíÒ»¸ö½ø³Ì²åÈë²¢½¨  
Á¢Ò»°ÑÏà¹ØµÄËø£¬Ê¹Ô­À´²âÊÔµ½µÄÇé¿ö·¢Éú±ä»¯£¬Èç¹û²»Ï£ÍûÔÚ½¨Á¢ËøÊ±¿ÉÄܲúÉú  
µÄ³¤ÆÚ×èÈû£¬ÔòӦʹÓÃF_SETLK£¬²¢¶Ô·µ»Ø½á¹û½øÐвâÊÔ£¬ÒÔÅбðÊÇ·ñ³É¹¦µØ½¨Á¢  
ÁËËùÒªÇóµÄËø¡£  
ÔÚÉèÖûòÊÍ·ÅÔÚÒ»¸öÎļþÉϵÄÒ»°ÑËøÊ±¡£ÏµÍ³°´Ðè×éºÏ»òÁÑ¿ªÏàÁÚÇø¡£ÀýÈçÈô100  
-199×Ö½ÚÊǼÓËøµÄÇø£¬È»ºó½âËøµÚ150×Ö½Ú£¬ÔòϵͳºË½«Î¬³ÖÁ½°ÑËø£¬Ò»°ÑÊÇ´Ó10  
0-149×Ö½Ú£¬ÁíÒ»°ÑÊÇ´Ó151-199×Ö½Ú¡£  
ʵÀý-ÒªÇóºÍÊÍ·ÅÒ»°ÑËø  
ΪÁËÃâÓÚÿ´Î·ÖÅäflock½á¹¹£¬È»ºóÓÖÌîÈë¸÷ÏîÐÅÏ¢£¬¿ÉÒÔÓóÌÐò12.2Öеĺ¯Êýlo  
ck_regÀ´´¦ÀíÕâЩϸ½Ú¡£  
#include        <sys/types.h>  
#include        <fcntl.h>  
#include        "ourhdr.h"  
int  
lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len  
)  
{  
        struct flock    lock;  
        lock.l_type = type;             /* F_RDLCK, F_WRLCK, F_UNLCK */  
        lock.l_start = offset;  /* byte offset, relative to l_whence */  
        lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */  
        lock.l_len = len;               /* #bytes (0 means to EOF) */  
        return( fcntl(fd, cmd, &lock) );  
}  
³ÌÐò12.2  ËøºÍ½âËøÒ»¸öÎļþÇøÓòµÄº¯Êý  
ÒòΪ´ó¶àÊýËøµ÷ÓÃÊÇËø»ò½âËøÒ»¸öÎļþÇøÓò£¨ÃüÁîF_GETLKºÜÉÙʹÓã©¡£ÎÒÃÇͨ³£  
ʹÓÃÏÂÁÐÎå¸öºê£¬ËüÃǶ¼¶¨ÒåÔÚourhdr.hÖУ¨¸½Â¼B£©¡£  
#define read_lock(fd,offset,whence,len)  
lock_reg(fd,F_SETLK,F_RDLCK,offset,whence,len)  
#define needw_lock(fd,offset,whence,len)  
                        lock_reg(fd,F_SETLKW,F_RDLCK,offset,whence,len)  
#define write_lock(fd,offset,whence,len)  
                        lock_reg(fd,F_SETLK,F_WRLCK,offset,whence,len)  
#define writew_lock(fd,offset,whence,len)  
                        lock_reg(fd,F_SETLKW,F_WRLCK,offset,whence,len)  
#define un_lock(fd,offset,whence,len)  
                        lock_reg(fd,F_SETLK,F_UNLCK,offset,whence,len)  
ÎÒÃÇÒÔlseekº¯ÊýÖеÄͬÑù˳Ðò¶¨ÒåÁËÕâЩºêÖеÄÈý¸ö²ÎÊý¡£  
ʵÀý-²âÊÔÒ»°ÑËø  
³ÌÐò12.3¶¨ÒåÁËÒ»¸öº¯Êýlock_test£¬¿ÉÓÃÆä²âÊÔÒ»°ÑËø¡£  
#include        <sys/types.h>  
#include        <fcntl.h>  
#include        "ourhdr.h"  
pid_t  
lock_test(int fd, int type, off_t offset, int whence, off_t len)  
{  
        struct flock    lock;  
        lock.l_type = type;             /* F_RDLCK or F_WRLCK */  
        lock.l_start = offset;  /* byte offset, relative to l_whence */  
        lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */  
        lock.l_len = len;               /* #bytes (0 means to EOF) */  
        if (fcntl(fd, F_GETLK, &lock) < 0)  
                err_sys("fcntl error");  
        if (lock.l_type == F_UNLCK)  
                return(0);              /* false, region is not locked by anothe  
 proc */  
        return(lock.l_pid);     /* true, return pid of lock owner */  
}  
³ÌÐò12.3  ²âÊÔÒ»¸öËøÌõ¼þµÄº¯Êý  
Èç¹û´æÔÚÒ»°ÑËø£¬Ëü×èÈûÓɲÎÊý˵Ã÷µÄËø£¬Ôò´Ëº¯Êý·µ»Ø³ÖÓÐÕâ°ÑÏÖ´æËøµÄ½ø³ÌµÄ  
ID£¬·ñÔò´Ëº¯Êý·µ»Ø0¡£Í¨³£ÓÃÏÂÃæÁ½¸öºêÀ´µ÷Óô˺¯Êý£¨ËüÃÇÒ²¶¨ÒåÔÚourhdr.h  
£©¡£  
#define is_read_lockable(fd,offset,whence,len)  
                        lock_test(fd,F_RDLCK,offset,whence,len)  
#define is_write_lockable(fd,offset,whence,len)  
                        lock_test(fd,F_WRLCK,offset,whence,len)  
ʵÀý-ËÀËø  
Èç¹ûÁ½¸ö½ø³ÌÏ໥µÈ´ý¶Ô·½³ÖÓв¢ÇÒ²»ÊÍ·Å£¨Ëø¶¨£©µÄ×ÊԴʱ£¬ÔòÕâÁ½¸ö½ø³Ì¾Í´¦  
ÓÚËÀËø×´Ì¬¡£Èç¹ûÒ»¸ö½ø³ÌÒѾ­¿ØÖÆÁËÒ»¸öÎļþÖеÄÒ»¸ö¼ÓËøÇøÓò£¬È»ºóËüÓÖÊÔͼ  
¶ÔÁíÒ»¸ö½ø³Ì¿ØÖƵÄÇøÓò¼ÓËø£¬ÔòËü¾Í»á˯Ãߣ¬ÔÚÕâÖÖÇé¿öÏ£¬Óз¢ÉúËÀËøµÄ¿ÉÄÜ  
ÐÔ¡£  
³ÌÐò12.4ʾ³öÁËÒ»¸öËÀËøµÄÀý×Ó¡£×Ó½ø³ÌËø×Ö½Ú0£¬¸¸½ø³ÌËø×Ö½Ú1¡£È»ºó£¬ËüÃÇÖР 
µÄÿһ¸öÓÖÊÔÍ¼Ëø¶Ô·½ÒѾ­¼ÓÁËËøµÄ×Ö½Ú¡£ÔڸóÌÐòÖÐʹÓÃÁË8.8½ÚÖнéÉܵĸ¸-×Ó  
½ø³Ìͬ²½Àý³Ì£¨TELL_xxx£¬WAIT_xxx£©,ʹµÃ¶Ô·½¶¼Äܽ¨Á¢µÚÒ»°ÑËø¡£ÔËÐгÌÐò12  
.4µÃµ½£º  
#include        <sys/types.h>  
#include        <sys/stat.h>  
#include        <fcntl.h>  
#include        "ourhdr.h"  
static void lockabyte(const char *, int, off_t);  
int  
main(void)  
{  
        int             fd;  
        pid_t   pid;  
                /* Create a file and write two bytes to it */  
        if ( (fd = creat("templock", FILE_MODE)) < 0)  
                err_sys("creat error");  
        if (write(fd, "ab", 2) != 2)  
                err_sys("write error");  
        TELL_WAIT();  
        if ( (pid = fork()) < 0)  
                err_sys("fork error");  
        else if (pid == 0) {                    /* child */  
                lockabyte("child", fd, 0);  
                TELL_PARENT(getppid());  
                WAIT_PARENT();  
                lockabyte("child", fd, 1);  
        } else {                                                /* parent */  
                lockabyte("parent", fd, 1);  
                TELL_CHILD(pid);  
                WAIT_CHILD();  
                lockabyte("parent", fd, 0);  
        }  
        exit(0);  
}  
static void  
lockabyte(const char *name, int fd, off_t offset)  
{  
        if (writew_lock(fd, offset, SEEK_SET, 1) < 0)  
                err_sys("%s: writew_lock error", name);  
        printf("%s: got the lock, byte %d\n", name, offset);  
}  
³ÌÐò12.4  ËÀËø¼ì²âʵÀý  
$ a.out  
child:got the lock,byte 0  
parent:got the lock,byte 1  
child:writew_lock error:Deadlock situation detected/avoided  
parent:got the lock,byte 0  
¼ì²âµ½ËÀËøÊ±£¬ÏµÍ³ºË±ØÐëÑ¡ÔñÒ»¸ö½ø³ÌÊÕµ½³ö´í·µ»Ø¡£ÔÚ±¾ÊµÀýÖУ¬Ñ¡ÔñÁË×Ó½ø  
³Ì£¬ÕâÊÇÒ»¸öʵÏÖϸ½Ú¡£µ±´Ë³ÌÐòÔÚÁíÒ»¸öϵͳÉÏÔËÐÐʱ£¬Ò»°ë´ÎÊýÊÇ×Ó½ø³Ì½Óµ½  
³ö´íÐÅÏ¢£¬ÁíÒ»°ëÔòÊǸ¸½ø³Ì¡£  
ËøµÄÒþº¬¼Ì³ÐºÍÊÍ·Å  
¹ØÓÚ¼ÇÂ¼ËøµÄ×Ô¶¯¼Ì³ÐºÍÊÍ·ÅÓÐÈýÌõ¹æÔò£º  
1. ËøÓëÒ»¸ö½ø³Ì¡¢Ò»¸öÎļþÁ½·½ÃæÓйء£ÕâÓÐÁ½Öغ¬Òâ¡£µÚÒ»ÖØÊǺÜÃ÷ÏԵ쬵±  
Ò»¸ö½ø³ÌÖÕֹʱ£¬ËüËù½¨Á¢µÄËøÈ«²¿ÊÍ·Å¡£µÚ¶þÖØÒâ˼¾Í²»ºÜÃ÷ÏÔ£¬ÈκÎʱºò¹Ø±Õ  
Ò»¸öÃèÊö·ûʱ£¬Ôò¸Ã½ø³Ìͨ¹ýÕâÒ»ÃèÊö·û¿ÉÒÔ´æ·ÃµÄÎļþÉϵÄÈκÎÒ»°ÑËø¶¼±»ÊÍ·Å  
£¨ÕâÐ©Ëø¶¼ÊǸýø³ÌÉèÖõģ©¡£Õâ¾ÍÒâζ×ÅÈç¹ûÖ´ÐÐÏÂÁÐËIJ½£º  
              fd1=open(pathname,¡­);  
              read_lock(fd1,¡­);  
              fd2=dup(fd1);  
              close(fd2);  
         ÔòÔÚclose£¨fd2£©ºó£¬ÔÚfd1ÉÏÉèÖõÄËø±»ÊÍ·Å¡£Èç¹û½«dup´ú»»Îªopen  
£¬ÆäЧ¹ûÒ²Ò»Ñù£º  
              fd1=open(palhname,¡­);  
              read_lock(fd1,¡­);  
              fd2=open(palhname,¡­);  
              close(fd2);  
2. ÓÉfork²úÉúµÄ×Ó³ÌÐò²»¼Ì³Ð¸¸½ø³ÌËùÉèÖõÄËø¡£ÕâÒâζ×Å£¬ÈôÒ»¸ö½ø³ÌµÃµ½Ò»  
°ÑËø£¬È»ºóµ÷ÓÃfork£¬ÄÇô¶ÔÓÚ¸¸½ø³Ì»ñµÃµÄËø¶øÑÔ£¬×Ó½ø³Ì±»ÊÓΪÁíÒ»¸ö½ø³Ì£¬  
¶ÔÓÚ´Ó¸¸½ø³Ì´¦¼Ì³Ð¹ýÀ´µÄÈÎÒ»ÃèÊö·û£¬×Ó½ø³ÌÒªµ÷ÓÃfcntlÒÔ»ñµÃËü×Ô¼ºµÄËø¡£  
ÕâÓëËøµÄ×÷ÓÃÊÇÏàÒ»Öµġ£ËøµÄ×÷ÓÃÊÇ×èÖ¹¶à¸ö½ø³Ìͬʱдͬһ¸öÎļþ£¨»òͬһÎÄ  
¼þÇøÓò£©¡£Èç¹û×Ó½ø³Ì¼Ì³Ð¸¸½ø³ÌµÄËø£¬Ôò¸¸¡¢×Ó½ø³Ì¾Í¿ÉÒÔͬʱдͬһ¸öÎļþ¡£  
   
3. ÔÚÖ´ÐÐexecºó£¬Ð³ÌÐò¿ÉÒԼ̳ÐÔ­Ö´ÐгÌÐòµÄËø¡£  
POSIX.1ûÓÐÒªÇóÕâÒ»µã¡£µ«ÊÇ£¬SVR4ºÍ4.3+BSD¶¼Ö§³ÖÕâÒ»µã  
4.3+BSDµÄʵÏÖ  
ÏȼòÒªµØ¹Û²ì4.3+BSDʵÏÖÖÐʹÓõÄÊý¾Ý½á¹¹£¬´ÓÖпÉÒÔ¿´µ½ËøÊÇÓëÒ»¸ö½ø³Ì¡¢Ò»  
¸öÎļþÏà¹ØÁªµÄ¡£  
¿¼ÂÇÒ»¸ö½ø³Ì£¬ËüÖ´ÐÐÏÂÁÐÓï¾ä£¨ºöÂÔ³ö´í·µ»Ø£©£º  
        fd1 = open(pathname, ¡­ );  
        write_lock(fd1, 0, SEEK_SET, 1);                        ¸¸½ø³ÌÔÚ×Ö½Ú0дˠ 
   
        if (fork() > 0) {  
                fd2 = dup(fdl);  
                fd3 = open(pathname, ¡­);  
                pause;  
        }  else  {  
                read_lock(fd1, 1, SEEK_SET, 1);                 ×Ó½ø³ÌÔÚ×Ö½Ú1¶ÁË  
   
                pause;  
        }  
ͼ12.3  ÏÔʾÁ˸¸¡¢×Ó½ø³ÌÔÝÍ££¨Ö´ÐÐpause( )£©ºóµÄÊý¾Ý½á¹¹Çé¿ö¡£  
ͼ12.3  ¹ØÓÚ¼ÇÂ¼ËøµÄ4.3+BSDÊý¾Ý½á¹¹  
ÔÚÒÔǰµÄͼ3.4ºÍ8.1ÖÐÒÑÏÔʾÁËopen¡¢forkÒÔ¼°dupºóµÄÊý¾Ý½á¹¹ÓÐÁ˼ÇÂ¼Ëøºó£¬  
ÔÚÔ­À´µÄÕâЩͼÉÏмÓÁËflock½á¹¹£¬ËüÃÇÓÉi_node½á¹¹¿ªÊ¼Ï໥Á¬½ÓÆðÀ´¡£×¢Òâ  
£¬Ã¿¸öflock½á¹¹ËµÃ÷ÁËÒ»¸ö¸ø¶¨½ø³ÌµÄÒ»¸ö¼ÓËøÇøÓò¡£ÔÚͼÖÐÏÔʾÁËÁ½¸öflock½á  
¹¹£¬Ò»¸öÊÇÓɸ¸½ø³Ìµ÷ÓÃwrite_lockÐγɵģ¬ÁíÒ»¸öÔòÓÉ×Ó½ø³Ìµ÷ÓÃread_lockÐΠ 
³ÉµÄ¡£Ã¿Ò»¸ö½á¹¹¶¼°üº¬ÁËÏàÓ¦½ø³ÌID¡£  
ÔÚ¸¸½ø³ÌÖУ¬¹Ø±Õfd1¡¢fd2ºÍfd3ÖеÄÈκÎÒ»¸ö¶¼ÊÍ·ÅÓɸ¸½ø³ÌÉèÖõÄÐ´Ëø¡£Ôڹؠ 
±ÕÕâÈý¸öÃèÊö·ûÖеÄÈκÎÒ»¸öʱ£¬ÏµÍ³ºË»á´Ó¸ÃÃèÊö·ûËù¹ØÁ¬µÄi_node¿ªÊ¼£¬Öð¸ö  
¼ì²éflockÁ¬½Ó±íÖи÷ÏÊÍ·ÅÓɵ÷Óýø³Ì³ÖÓеĸ÷°ÑËø¡£ÏµÍ³ºË²¢²»Çå³þÒ²²»¹Ø  
Ðĸ¸½ø³ÌÊÇÓÃÄÄÒ»¸öÃèÊö·ûÀ´ÉèÖÃÕâ°ÑËøµÄ¡£  
ʵÀý£º  
½¨ÒéÐÔËø¿ÉÓɾ«Áé½ø³ÌʹÓÃÒÔ±£Ö¤¸Ã¾«Áé½ø³ÌÖ»ÓÐÒ»¸ö¸±±¾ÔÚÔËÐС£ÔÚÆð¶¯Ê±£¬ºÜ  
¶à¾«Áé½ø³Ì¶¼°ÑËüÃǵĽø³ÌIDдµ½Ò»¸öËüÃǸ÷×ÔרÓõÄÒ»¸öPIDÎļþÉÏ¡£µ±ÏµÍ³Í£  
»úʱ£¬¿ÉÒÔ´ÓÕâЩÎļþÖÐÈ¡ÓÃÕâЩ¾«Áé½ø³ÌµÄ½ø³ÌID¡£·ÀÖ¹Ò»¸ö¾«Áé½ø³ÌÓжà·Ý¸±  
±¾Í¬Ê±ÔËÐеķ½·¨ÊÇ£ºÔÚ¾«Áé½ø³Ì¿ªÊ¼ÔËÐÐʱ£¬ÔÚËüµÄ½ø³ÌIDÎļþÉÏÆóͼÉèÖÃÒ»°Ñ  
Ð´Ëø¡£Èç¹ûÔÚËüÔËÐÐʱһֱ±£³ÖÕâ°ÑËø£¬Ôò¾Í²»¿ÉÄÜÔÙÆð¶¯ËüµÄÆäËü¸±±¾¡£³ÌÐò1  
2.5ʵÏÖÁËÕâÒ»¼¼Êõ¡£  
ÒòΪ½ø³ÌIDÎļþ¿ÉÄܰüº¬ÒÔǰµÄ¾«Áé½ø³ÌID£¬¶øÇÒÆä³¤¶È»¹¿ÉÄܳ¤ÓÚµ±Ç°½ø³ÌµÄI  
D£¬ÀýÈç¸ÃÎļþÖÐÒÔǰµÄÄÚÈÝ¿ÉÄÜÊÇ12345\n£¬¶øÏÖÔڵĽø³ÌIDÊÇ654£¬ÎÒÃÇÏ£Íû¸Ã  
ÎļþÏÖÔÚÖ»°üº¬654\n£¬¶ø²»ÊÇ654\n5£¬ËùÒÔÔÚд¸ÃÎļþʱ£¬ÏȽ«Æä½Ø¶ÌΪ0¡£×¢Òâ  
£¬ÒªÔÚÉèÖÃÁËËøÖ®ºóÔÙµ÷ÓýضÌÎļþ³¤¶ÈµÄº¯Êýftruncate¡£ÔÚµ÷ÓÃopenʱ²»ÄÜÖ¸  
¶¨O_TRUNC£¬ÒòΪÕâÑù×ö»áÔÚÓÐÒ»¸öÕâÖÖ¾«Áé½ø³ÌÔËÐв¢¶Ô¸ÃÎļþ¼ÓÁËËøÊ±Ò²»áʹ  
¸ÃÎļþ½Ø¶ÌΪ0¡££¨Èç¹ûʹÓÃÇ¿ÖÆÐÔËø¶ø²»Êǽ¨ÒéÐÔËø£¬Ôò¿ÉʹÓÃO_TRUNC¡£ÔÚ±¾½Ú  
×îºó²¿·Ö½«ÌÖÂÛÇ¿ÖÆÐÔËø¡££©  
ÔÚ±¾ÊµÀýÖУ¬Ò²¶Ô¸ÃÃèÊö·ûÉèÖÃexecʱ¹Ø±Õ£¨close-on-exec£©±êÖ¾¡£ÕâÊÇÒòΪ¾«  
Áé½ø³Ì³£³£fork²¢execÆäËü½ø³Ì£¬ÎÞÐèÔÚÁíÒ»¸ö½ø³ÌÖÐʹ¸ÃÎļþÒ²´¦ÔÚ´ò¿ª×´Ì¬¡£  
   
#include        <sys/types.h>  
#include        <sys/stat.h>  
#include        <errno.h>  
#include        <fcntl.h>  
#include        "ourhdr.h"  
#define PIDFILE         "daemon.pid"  
int  
main(void)  
{  
        int             fd, val;  
        char    buf[10];  
        if ( (fd = open(PIDFILE, O_WRONLY | O_CREAT, FILE_MODE)) < 0)  
                err_sys("open error");  
                        /* try and set a write lock on the entire file */  
        if (write_lock(fd, 0, SEEK_SET, 0) < 0) {  
                if (errno == EACCES || errno == EAGAIN)  
                        exit(0);        /* gracefully exit, daemon is already ru  
ning */  
                else  
                        err_sys("write_lock error");  
        }  
                        /* truncate to zero length, now that we have the lock */  
        if (ftruncate(fd, 0) < 0)  
                err_sys("ftruncate error");  
                        /* and write our process ID */  
        sprintf(buf, "%d\n", getpid());  
        if (write(fd, buf, strlen(buf)) != strlen(buf))  
                err_sys("write error");  
                        /* set close-on-exec flag for descriptor */  
        if ( (val = fcntl(fd, F_GETFD, 0)) < 0)  
                err_sys("fcntl F_GETFD error");  
        val |= FD_CLOEXEC;  
        if (fcntl(fd, F_SETFD, val) < 0)  
                err_sys("fcntl F_SETFD error");  
        /* leave file open until we terminate: lock will be held */  
        /* do whatever ... */  
        exit(0);  
}  
³ÌÐò12.5  ¾«Áé½ø³Ì×èÖ¹Æä¶à·Ý¸±±¾Í¬Ê±ÔËÐÐµÄÆð¶¯´úÂë  
ʵÀý  
ÔÚÏà¶ÔÎļþβ¶Ë¼ÓËø»ò½âËøÊ±ÐèÒªÌØ±ðСÐÄ¡£´ó¶àÊýʵÏÖ°´ÕÕI_whenceµÄSEEK_CU  
R»òSEEN_ENDÖµ£¬ÓÃÎļþµ±Ç°Î»Öûòµ±Ç°³¤¶ÈÒÔ¼°l_startµÃµ½¾ø¶ÔµÄÎļþÎ»ÒÆÁ¿¡£  
µ«ÊÇ£¬Í¨³£ÎÒÃÇÐèÒªÏà¶ÔÓÚÎļþµÄµ±Ç°Î»Öûòµ±Ç°³¤¶ÈÖ¸¶¨Ò»°ÑËø¡£  
³ÌÐò12.6дһ¸öÎļþ,Ò»´ÎÒ»¸ö×Ö½Ú¡£Ã¿´ÎÑ­»·ÖÐ,´ÓÎļþµ±Ç°Î²¶Ë¿ªÊ¼´¦¼ÓËøÖ±µ½  
½«À´¿ÉÄÜÀ©³äµ½µÄβ¶ËΪֹ£¨×îºóÒ»¸ö²ÎÊý£¬³¤¶È£¬Ö¸¶¨Îª0£©£¬È»ºóд1¸ö×Ö½Ú¡£  
È»ºó½â³ýÕâ°ÑËø£¬Ð´ÁíÒ»¸ö×Ö½Ú¡£Èç¹ûϵͳÓÃ"´Óµ±Ç°Î²¶Ë¿ªÊ¼£¬Ö±µ½½«À´¿ÉÄÜÀ©  
³äµÄβ¶Ë"ÕâÖּǷ¨À´¸ú×ÙËø£¬ÄÇôÕâ¶Î³ÌÐòÄܹ»Õý³£¹¤×÷¡£µ«ÊÇÈç¹ûϵͳ½«Ïà¶Ô  
Î»ÒÆÁ¿±ä»»³É¾ø¶ÔÎ»ÒÆÁ¿¾Í»áÓÐÎÊÌâ¡£ÔÚSVR4ÖÐÔËÐд˳ÌÐòµÄÈ·»á·¢ÉúÎÊÌ⣺  
#include        <sys/types.h>  
#include        <sys/stat.h>  
                        /* set close-on-exec flag for descriptor */  
        if ( (val = fcntl(fd, F_GETFD, 0)) < 0)  
                err_sys("fcntl F_GETFD error");  
        val |= FD_CLOEXEC;  
        if (fcntl(fd, F_SETFD, val) < 0)  
                err_sys("fcntl F_SETFD error");  
        /* leave file open until we terminate: lock will be held */  
        /* do whatever ... */  
        exit(0);  
}  
³ÌÐò12.5  ¾«Áé½ø³Ì×èÖ¹Æä¶à·Ý¸±±¾Í¬Ê±ÔËÐÐµÄÆð¶¯´úÂë  
ʵÀý  
ÔÚÏà¶ÔÎļþβ¶Ë¼ÓËø»ò½âËøÊ±ÐèÒªÌØ±ðСÐÄ¡£´ó¶àÊýʵÏÖ°´ÕÕI_whenceµÄSEEK_CU  
R»òSEEN_ENDÖµ£¬ÓÃÎļþµ±Ç°Î»Öûòµ±Ç°³¤¶ÈÒÔ¼°l_startµÃµ½¾ø¶ÔµÄÎļþÎ»ÒÆÁ¿¡£  
µ«ÊÇ£¬Í¨³£ÎÒÃÇÐèÒªÏà¶ÔÓÚÎļþµÄµ±Ç°Î»Öûòµ±Ç°³¤¶ÈÖ¸¶¨Ò»°ÑËø¡£  
³ÌÐò12.6дһ¸öÎļþ,Ò»´ÎÒ»¸ö×Ö½Ú¡£Ã¿´ÎÑ­»·ÖÐ,´ÓÎļþµ±Ç°Î²¶Ë¿ªÊ¼´¦¼ÓËøÖ±µ½  
½«À´¿ÉÄÜÀ©³äµ½µÄβ¶ËΪֹ£¨×îºóÒ»¸ö²ÎÊý£¬³¤¶È£¬Ö¸¶¨Îª0£©£¬È»ºóд1¸ö×Ö½Ú¡£  
È»ºó½â³ýÕâ°ÑËø£¬Ð´ÁíÒ»¸ö×Ö½Ú¡£Èç¹ûϵͳÓÃ"´Óµ±Ç°Î²¶Ë¿ªÊ¼£¬Ö±µ½½«À´¿ÉÄÜÀ©  
³äµÄβ¶Ë"ÕâÖּǷ¨À´¸ú×ÙËø£¬ÄÇôÕâ¶Î³ÌÐòÄܹ»Õý³£¹¤×÷¡£µ«ÊÇÈç¹ûϵͳ½«Ïà¶Ô  
Î»ÒÆÁ¿±ä»»³É¾ø¶ÔÎ»ÒÆÁ¿¾Í»áÓÐÎÊÌâ¡£ÔÚSVR4ÖÐÔËÐд˳ÌÐòµÄÈ·»á·¢ÉúÎÊÌ⣺  
#include        <sys/types.h>  
#include        <sys/stat.h>  
#include        <fcntl.h>  
#include        "ourhdr.h"  
int  
main(void)  
{  
        int             i, fd;  
        if ( (fd = open("temp.lock", O_RDWR | O_CREAT | O_TRUNC,  
   
               FILE_MODE)) < 0)  
                err_sys("open error");  
        for (i = 0; i < 1000000; i++) { /* try to write 2 Mbytes */  
                                /* lock from current EOF to EOF */  
                if (writew_lock(fd, 0, SEEK_END, 0) < 0)  
                        err_sys("writew_lock error");  
                if (write(fd, &fd, 1) != 1)  
                        err_sys("write error");  
                if (un_lock(fd, 0, SEEK_END, 0) < 0)  
                        err_sys("un_lock error");  
                if (write(fd, &fd, 1) != 1)  
                        err_sys("write error");  
        }  
        exit(0);  
¸³Óël_start£©¸Ä»»³ÉËùд×Ö½ÚÊýµÄ¸ºÖµ£¨ÔÚ±¾³ÌÐòÖÐÊÇ-1£©¡£Õâ¾ÍʹµÃun_lockÈ¥  
³ýÉϴμӵÄËø¡£  
½¨ÒéÐÔËøºÍÇ¿ÖÆÐÔËø  
¿¼ÂÇÊý¾Ý¿â´æÈ¡Àý³ÌÐò¡£Èç¹û¸Ã¿âÖÐËùÓк¯Êý¶¼ÒÔÒ»Öµķ½·¨´¦Àí¼ÇÂ¼Ëø£¬ÔòÎÒÃÇ  
³ÆÊ¹ÓÃÕâЩº¯Êý´æÈ¡Êý¾Ý¿âµÄÈκνø³Ì¼¯ÎªºÏ×÷½ø³Ì¡£Èç¹ûÕâЩº¯ÊýÊÇΨһµÄÓÃÀ´  
´æÈ¡Êý¾Ý¿âµÄº¯Êý£¬ÄÇôËüÃÇʹÓý¨ÒéÐÔËøÊÇ¿ÉÐеġ£µ«Êǽ¨ÒéÐÔËø²¢²»ÄÜ×èÖ¹¶Ô  
Êý¾Ý¿âÎļþÓÐдÐí¿ÉȨµÄÈÎºÎÆäËü½ø³ÌдÊý¾Ý¿âÎļþ¡£²»Ê¹ÓÃЭͬһÖµķ½·¨£¨Êý  
¾Ý¿â´æÈ¡Àý³Ì¿â£©À´´æÈ¡Êý¾Ý¿âµÄ½ø³ÌÊÇÒ»¸ö·ÇºÏ×÷½ø³Ì¡£  
Ç¿ÖÆÐÔËø»úÖÆÖУ¬ÏµÍ³ºË¶Ôÿһ¸öopen¡¢readºÍwrite¶¼Òª¼ì²éµ÷Óýø³Ì¶ÔÕýÔÚ´æ  
È¡µÄÎļþÊÇ·ñÎ¥±³ÁËijһ°ÑËøµÄ×÷Óᣠ 
¶ÔÒ»¸öÌØ¶¨Îļþ´ò¿ªÆäÉèÖÃ_×é_ID룬¹Ø±ÕÆä×é_Ö´ÐÐλÔò¶Ô¸ÃÎļþÆô¶¯ÁËÇ¿ÖÆÐÔ  
Ëø»úÖÆ¡££¨»ØÒä³ÌÐò4.4£©¡£ÒòΪµ±×é_ Ö´ÐÐλ¹Ø±Õʱ£¬ÉèÖÃ_×é_IDλ²»ÔÙÓÐÒâÒå  
£¬ËùÒÔSVR3µÄÉè¼ÆÕß½èÓÃÁ½ÕßµÄÕâÖÖ×éºÏÀ´Ö¸¶¨¶ÔÒ»¸öÎļþµÄËøÊÇÇ¿ÖÆÐԵĶø·Ç½¨  
ÒéÐԵġ£  
Èç¹ûÒ»¸ö½ø³ÌÊÔͼ¶Á¡¢Ð´Ò»¸öÇ¿ÖÆÐÔËøÆð×÷ÓõÄÎļþ£¬¶øÓû¶Á¡¢Ð´µÄ²¿·ÖÓÖÓÉÆäËü  
½ø³Ì¼ÓÉÏÁ˶Á¡¢Ð´Ëø£¬´Ëʱ»á·¢ÉúÊ²Ã´ÄØ£¿¶ÔÕâÒ»ÎÊÌâµÄ»Ø´ðÈ¡¾öÓÚÈý·½ÃæµÄÒòËØ  
£º²Ù×÷ÀàÐÍ£¨read»òwrite£©£¬ÆäËü½ø³Ì±£ÓеÄËøµÄÀàÐÍ£¨¶ÁËø»òÐ´Ëø£©£¬ÒÔ¼°ÓР 
¹ØÃèÊö·ûÊÇ×èÈû»¹ÊÇ·Ç×èÈûµÄ¡£Í¼12.7ÏÔʾÁËÕâ°ËÖÖ¿ÉÄÜÐÔ¡£  
ͼ12.7  Ç¿ÖÆÐÔËø¶ÔÆäËü½ø³Ì¶Á¡¢Ð´µÄÓ°Ïì  
³ýÁËͼ12.7ÖеÄread,writeº¯Êý£¬ÆäËü½ø³ÌµÄÇ¿ÖÆÐÔËøÒ²»á¶Ôopenº¯Êý²úÉúÓ°Ïì¡£  
ͨ³££¬¼´Ê¹ÕýÔÚ´ò¿ªµÄÎļþ¾ßÓÐÇ¿ÖÆÐÔ¼ÇÂ¼Ëø£¬¸Ã´ò¿ª²Ù×÷Ò²»á³É¹¦¡£ÏÂÃæµÄrea  
d»òwriteÒÀ´ÓÓÚͼ12.7ÖÐËùʾµÄ¹æÔò¡£µ«ÊÇ£¬Èç¹ûÓû´ò¿ªµÄÎļþ¾ßÓÐÇ¿ÖÆÐÔËø£¨¶Á  
Ëø»òÐ´Ëø£©£¬¶øÇÒopenµ÷ÓÃÖеÄflagΪO_TRUNC»òO_CREAT£¬Ôò²»ÂÛÊÇ·ñÖ¸¶¨O_NON  
BLOCK,open¶¼Á¢¼´³ö´í·µ»Ø£¬erronÉèÖÃΪEAGAIN¡££¨¶ÔO_TRUNCÇé¿ö³ö´í·µ»ØÊÇÓР 
ÒâÒåµÄ£¬ÒòΪÆäËü½ø³Ì¶Ô¸ÃÎļþ³ÖÓжÁ¡¢Ð´Ëø£¬ËùÒÔ²»Äܽ«Æä½Ø¶ÌΪ0¡£¶ÔO_CREA  
TÇé¿öÔÚ·µ»ØÊ±Ò²ÉèÖÃerronÔòÎÞÒâÒ壬ÒòΪ¸Ã±êÖ¾µÄÒâÒåÊÇÈç¹û¸ÃÎļþ²»´æÔÚÔò´´  
½¨£¬ÓÉÓÚÆäËü½ø³Ì¶Ô¸ÃÎļþ³ÖÓмÇÂ¼Ëø£¬Òò¶ø¸ÃÎļþ¿Ï¶¨ÊÇ´æÔڵġ££©  
ÕâÖÖ´¦Àí·½Ê½¿ÉÄܵ¼ÖÂÁîÈ˾ªÒìµÄ½á¹û¡£ÎÒÃÇÔø±àд¹ýÒ»¸ö³ÌÐò£¬Ëü´ò¿ªÒ»¸öÎļþ  
£¨ÆämodeÖ¸¶¨ÎªÇ¿ÖÆÐÔËø£©£¬È»ºó¶Ô¸ÃÎļþµÄÕûÌåÉèÖÃÒ»°Ñ¶ÁËø£¬È»ºó½øÈë˯ÃßÒ»  
¶Îʱ¼ä¡£ÔÚÕâ¶Î˯Ãßʱ¼äÄÚ£¬ÓÃijЩ³£¹æµÄUnix³ÌÐòºÍ²Ù×÷·û¶Ô¸ÃÎļþ½øÐд¦Àí£¬  
·¢ÏÖÏÂÁÐÇé¿ö£º  
l ¿ÉÓÃed±à¼­³ÌÐò¶Ô¸ÃÎļþ½øÐб༭²Ù×÷£¬¶øÇұ༭½á¹ûд»Ø´ÅÅÌ£¡Ç¿ÖÆÐÔ¼ÇÂ¼Ëø  
¶Ô´ËºÁÎÞÓ°Ïì¡£¶Ôed²Ù×÷½øÐиú×Ù·ÖÎö·¢ÏÖ£¬ed½«ÐÂÄÚÈÝдµ½Ò»¸öÁÙʱÎļþÖУ¬È»  
ºóɾ³ýÔ­Îļþ£¬×îºó½«ÁÙʱÎļþÃû¸ÄÃûΪԭÎļþÃû¡£ÓÚÊÇ£¬·¢ÏÖÇ¿ÖÆÐÔËø»úÖÆ¶Ôu  
nlinkº¯ÊýûÓÐÓ°Ïì¡£  
ÔÚSVR4ÖУ¬ÓÃtruss(1)ÃüÁî¿ÉÒԵõ½Ò»¸ö½ø³ÌµÄϵͳµ÷Óøú×ÙÐÅÏ¢£¬ÔÚ4.3+BSDÖР 
£¬ÔòʹÓÃktrace(1)ºÍkdump(1)ÃüÁî¡£  
l ²»ÄÜÓÃvi±à¼­³ÌÐò±à¼­¸ÃÎļþ¡£vi¿ÉÒÔ¶Á¸ÃÎļþ£¬µ«ÊÇÈç¹ûÊÔͼ½«ÐµÄÊý¾Ýдµ½  
¸ÃÎļþÖУ¬Ôò³ö´í·µ»Ø£¨EAGAIN£©¡£Èç¹ûÊÔͼ½«ÐÂÊý¾ÝÌí¼Óµ½¸ÃÎļþÖУ¬Ôòwrite  
×èÈû¡£viµÄÕâÖÖÐÐΪÓëËùÏ£ÍûµÄÒ»Ñù¡£  
l Ê¹ÓÃKornShellµÄ>ºÍ¡·Ëã·ûÖØÐ´»òÌíдµ½¸ÃÎļþÖУ¬²úÉú³ö´íÐÅÏ¢"cannot cre  
at"¡£  
l ÔÚBourne ShellÏÂʹÓÃ>Ëã·û³ö´í£¬µ«ÊÇʹÓá·Ëã·ûÔò×èÈû£¬ÔÚɾ³ýÁËÇ¿ÖÆÐÔËø  
ºóÔÙ¼ÌÐø½øÐд¦Àí¡££¨Ö´ÐÐÌí¼Ó²Ù×÷Ëù²úÉúµÄÇø±ðÊÇÒòΪ£ºKorn ShellÒÔO_CREAT  
ºÍO_APPEND±êÖ¾´ò¿ªÎļþ£¬¶øÉÏÃæÒÑÌá¼°Ö¸¶¨O_CREAT»á²úÉú³ö´í·µ»Ø¡£µ«ÊÇ£¬Bo  
urne ShellÔÚ¸ÃÎļþÒÑ´æÔÚʱ²¢²»Ö¸¶¨O_CREAT£¬ËùÒÔopen³É¹¦£¬¶øÏÂÒ»¸öwriteÔò  
×èÈû¡££©  
´ÓÕâÑùÒ»¸öÀý×ÓÖпɼû£¬ÔÚʹÓÃÇ¿ÖÆÐÔËøÊ±»¹ÐèÓÐËù¾¯Ìè¡£  
Ò»¸ö±ðÓÐÓÃÐĵÄÓû§¿ÉÒÔ¶Ô´ó¼Ò¶¼¿É¶ÁµÄÎļþ¼ÓÒ»°Ñ¶ÁËø£¨Ç¿ÖÆÐÔ£©£¬ÕâÑù¾ÍÄÜ×è  
Ö¹ÈÎºÎÆäËüÈËд¸ÃÎļþ£¨µ±È»£¬¸ÃÎļþÓ¦µ±ÊÇÇ¿ÖÆÐÔËø»úÖÆÆð×÷Óõģ¬Õâ¿ÉÄÜÒªÇó  
¸ÃÓû§Äܹ»¸ü¸Ä¸ÃÎļþµÄÐí¿ÉȨλ¡££©¿¼ÂÇÒ»¸öÊý¾Ý¿âÎļþ£¬ËüÊÇ´ó¼Ò¶¼¿É¶ÁµÄ£¬  
²¢ÇÒÊÇÇ¿ÖÆÐÔËø»úÖÆÆð×÷Óõġ£Èç¹ûÒ»¸ö±ðÓÐÓÃÐĵÄÓû§¶Ô¸ÃÕû¸öÎļþ±£ÓÐÒ»°Ñ¶Á  
Ëø£¬ÔòÆäËü½ø³Ì²»ÄÜÔÙд¸ÃÎļþ¡£  
ʵÀý  
³ÌÐò12.7  ¼ì²éÒ»¸öϵͳÊÇ·ñÖ§³ÖÇ¿ÖÆÐÔËø»úÖÆ¡£  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <sys/wait.h>  
#include <errno.h>  
#include <fcntl.h>  
#include "ourhdr.h"  
int  
main(void)  
{  
 int    fd;  
 pid_t   pid;  
 char   buff[5];  
 struct stat  statbuf;  
 if ( (fd = open("templock", O_RDWR | O_CREAT | O_TRUNC,  
            FILE_MODE)) < 0)  
  err_sys("open error");  
 if (write(fd, "abcdef", 6) != 6)  
  err_sys("write error");  
  /* turn on set-group-ID and turn off group-execute */  
 if (fstat(fd, &statbuf) < 0)  
  err_sys("fstat error");  
 if (fchmod(fd, (statbuf.st_mode & ~S_IXGRP) | S_ISGID) < 0)  
  err_sys("fchmod error");  
 TELL_WAIT();  
 if ( (pid = fork()) < 0) {  
  err_sys("fork error");  
 } else if (pid > 0) { /* parent */  
    /* write lock entire file */  
  if (write_lock(fd, 0, SEEK_SET, 0) < 0)  
   err_sys("write_lock error");  
  TELL_CHILD(pid);  
  if (waitpid(pid, NULL, 0) < 0)  
   err_sys("waitpid error");  
 } else {    /* child */  
  WAIT_PARENT();  /* wait for parent to set lock */  
  set_fl(fd, O_NONBLOCK);  
   /* first let's see what error we get if region is locked */  
  if (read_lock(fd, 0, SEEK_SET, 0) != -1) /* no wait */  
   err_sys("child: read_lock succeeded");  
  printf("read_lock of already-locked region returns %d\n", errno);  
   /* now try to read the mandatory locked file */  
  if (lseek(fd, 0, SEEK_SET) == -1)  
   err_sys("lseek error");  
  if (read(fd, buff, 2) < 0)  
   err_ret("read failed (mandatory locking works)");  
  else  
   printf("read OK (no mandatory locking), buff = %2.2s\n", buff);  
 }  
 exit(0);  
}  
³ÌÐò12.7  ¼ì²éÊÇ·ñÖ§³ÖÇ¿ÖÆÐÔËø  
´Ë³ÌÐòÊ×ÏÈ´´½¨Ò»¸öÎļþ£¬²¢Ê¹Ç¿ÖÆÐÔËø»úÖÆ¶ÔÆäÆð×÷Óá£È»ºóforkÒ»¸ö×Ó½ø³Ì¡£  
¸¸½ø³Ì¶ÔÕû¸öÎļþÉèÖÃÒ»°ÑÐ´Ëø£¬×Ó½ø³ÌÔò½«¸ÃÎļþµÄÃèÊö·ûÉèÖÃΪ·Ç×èÈûµÄ£¬È»  
ºóÆóͼ¶Ô¸ÃÎļþÉèÖÃÒ»°Ñ¶ÁËø£¬ÎÒÃÇÆÚÍûÕâ»á³ö´í·µ»Ø£¬²¢Ï£Íû¿´µ½ÏµÍ³·µ»ØÖµÊÇ  
EACCES»òEAGAIN¡£½Ó×Å£¬×Ó½ø³Ì½«Îļþ¶Á¡¢Ð´Î»Öõ÷Õûµ½ÎļþÆðµã£¬²¢ÊÔͼ¶Á¸ÃÎÄ  
¼þ¡£Èç¹ûϵͳÌá¹©Ç¿ÖÆÐÔËø»úÖÆ£¬ÔòreadÓ¦·µ»ØEACCES»òEAGAIN£¨ÒòΪ¸ÃÃèÊö·ûÊÇ  
·Ç×èÈûµÄ£©¡£·ñÔòread·µ»ØËù¶ÁµÄÊý¾Ý¡£ÔÚSVR4ÖÐÔËÐд˳ÌÐò£¨¸Ãϵͳ֧³ÖÇ¿ÖÆÐÔ  
Ëø»úÖÆ£©£¬µÃµ½£º  
$ a.out  
read_lock of already-locked region returns 13  
read failed (mandatory locking works):No more processes  
²é¿´ÏµÍ³Í·Îļþ»òintro(2)ÊÖ²áÒ³£¬¿ÉÒÔ¿´µ½´íÎó13¶ÔÓ¦ÓÚEACCES¡£´ÓÀý×ÓÖл¹¿É  
ÒÔ¿´µ½£¬ÔÚread³ö´í·µ»ØÐÅÏ¢²¿·ÖÖаüº¬ÓÐ"No more processes"¡£Õâͨ³£À´×ÔÓÚ  
fork£¬±íʾÒÑÓÃÍêÁ˽ø³Ì±íÏî¡£  
$ a.out  
read_lock of already_locked region returns 35  
read OK (no mandatory locking),buff=ab  
ÆäÖУ¬errno35¶ÔÓ¦ÓÚEAGAIN¡£¸Ãϵͳ²»Ö§³ÖÇ¿ÖÆÐÔËø¡£  
ʵÀý  
ÈÃÎÒÃǻص½±¾½ÚµÄµÚÒ»¸öÎÊÌ⣺µ±Á½¸öÈËͬʱ±à¼­Í¬Ò»¸öÎļþ½«»áÔõÑùÄØ£¿Ò»°ãµÄ  
UNIXÎı¾±à¼­Æ÷²¢²»Ê¹ÓüÇÂ¼Ëø£¬ËùÒÔ¶Ô´ËÎÊÌâµÄ»Ø´ðÈÔÈ»ÊÇ£º¸ÃÎļþµÄ×îºó½á¹û  
È¡¾öÓÚд¸ÃÎļþµÄ×îºóÒ»¸ö½ø³Ì¡££¨4.3+BSD vi±à¼­Æ÷ȷʵÓÐÒ»¸ö±àÒëʱѡÔñÏîʹ  
ÔËÐÐʱ½¨ÒéÐÔ¼ÇÂ¼ËøÆð×÷Ó㬵«ÊÇÕâһѡÔñÏî²¢²»ÊÇȱʡ¿ÉÓõġ££©¼´Ê¹ÎÒÃÇÔÚÒ»  
¸ö±à¼­Æ÷£¬ÀýÈçviÖÐʹÓÃÁ˽¨ÒéÐÔËø£¬¿ÉÊÇÕâ°ÑËø²¢²»ÄÜ×èÖ¹ÆäËûÓû§Ê¹ÓÃÁíÒ»¸ö  
±à¼­Æ÷£¬¸Ã±à¼­Æ÷ûÓÐʹÓý¨ÒéÐÔ¼ÇÂ¼Ëø¡£  
ÈôϵͳÌá¹©Ç¿ÖÆÐÔ¼ÇÂ¼Ëø£¬ÄÇôÎÒÃÇ¿ÉÒÔÐ޸ij£Óõı༭Æ÷£¨Èç¹ûÎÒÃÇÓиñ༭Æ÷  
µÄÔ´´úÂë¡££©ÈçÈôÎÒÃÇûÓиñ༭Æ÷µÄÔ´´úÂ룬ÄÇôÎÒÃÇ¿ÉÒÔÊÔÒ»ÊÔÏÂÊö·½·¨¡£±à  
дһ¸öviµÄǰ¶Ë³ÌÐò¡£¸Ã³ÌÐòÁ¢¼´µ÷ÓÃfork£¬È»ºó¸¸½ø³ÌµÈ´ý×Ó½ø³ÌÖÕÖ¹£¬×Ó½ø³Ì  
´ò¿ªÔÚÃüÁîÐÐÖÐÖ¸¶¨µÄÎļþ£¬Ê¹Ç¿ÖÆÐÔËøÆð×÷Ó㬶ÔÕû¸öÎļþÉèÖÃÒ»°ÑÐ´Ëø£¬È»ºó  
exec vi¡£ÔÚviÔËÐÐʱ£¬¸ÃÎļþÊǼÓÁËÐ´ËøµÄ£¬ËùÒÔÆäËûÓû§²»ÄÜÐÞ¸ÄËü¡£µ±vi½á  
ÊøÊ±£¬¸¸½ø³Ì´Ówait·µ»Ø£¬´ËʱÎÒÃÇ×Ô±àµÄǰ¶Ë³ÌÐòÒ²¾Í½áÊø¡£ÔÚ±¾ÀýÖмٶ¨ËøÄÜ  
¿çÔ½exec,ÕâÕýÊÇÎÒÃÇÇ°ÃæËù˵µÄSVR4µÄÇé¿ö£¨SVR4ÊÇÎÒÃÇ˵¹ýµÄÌá¹©Ç¿ÖÆÐÔËøµÄ  
Ψһϵͳ£©¡£  
ÕâÖÖÀàÐ͵Äǰ¶Ë³ÌÐòÊÇ¿ÉÒÔ±àдµÄ£¬µ«È´ÍùÍù²»ÄÜÆð×÷Óá£ÎÊÌâ³öÔÚ´ó¶àÊý±à¼­Æ÷  
£¨ÖÁÉÙÊÇviºÍed£©¶ÁËüÃǵÄÊäÈëÎļþ£¬È»ºó¹Ø±ÕËü¡£Ö»ÒªÒýÓñ»±à¼­ÎļþµÄÃèÊö·û  
¹Ø±ÕÁË£¬ÄÇô¼ÓÔÚ¸ÃÎļþÉϵÄËø¾Í±»ÊÍ·ÅÁË¡£ÕâÒâζ×Å£¬Ôڱ༭Æ÷¶ÁÁ˸ÃÎļþµÄÄÚ  
ÈÝ£¬È»ºó¹Ø±ÕÁËËü£¬ÄÇÃ´ËøÒ²¾Í²»´æÔÚÁË¡£ÔÚǰ¶Ë³ÌÐòÖÐûÓÐÈκη½·¨¿ÉÒÔ×èÖ¹Õâ  
Ò»µã¡£  
ÔÚµÚÊ®ÁùÕµÄÊý¾Ý¿âº¯Êý¿âÖУ¬ÎÒÃÇʹÓÃÁ˼ÇÂ¼ËøÒÔ×èÖ¹¶à¸ö½ø³ÌµÄ²¢·¢´æÈ¡¡£ÔÚ  
±¾Õ£¬ÎÒÃÇÌṩÁËʱ¼ä²âÁ¿ÒÔ¹Û²ì¼ÇÂ¼Ëø¶Ô½ø³ÌµÄÓ°Ïì¡£  
12.4Á÷£¨Streams£©  
Á÷ÊÇϵͳVÌṩµÄ¹¹ÔìÄÚºËÉ豸Çý¶¯³ÌÐòºÍÍøÂçЭÒé°üµÈµÄÒ»ÖÖͨÓ÷½·¨£¬ÎÒÃǶԠ 
Á÷½øÐÐÌÖÂÛµÄÄ¿µÄÊÇÀí½âÏÂÁи÷µã£º  
£¨a£© ÏµÍ³VµÄÖն˽çÃæ¡£  
£¨b£© I/O¶à·¸´ÓÃÖÐÂÖѯº¯ÊýµÄʹÓã¨12.5.2½Ú£©¡£  
£¨c£© »ùÓÚÁ÷µÄ¹ÜµÀºÍÃüÃûÁ÷¹ÜµÀµÄʵÏÖ£¨15.2ºÍ12.5.2½Ú£©¡£  
Á÷»úÖÆÊÇÓÉDennis Ritchie ·¢Õ¹ÆðÀ´µÄ[Ritchie 1984],ÆäÄ¿µÄÊÇÓÃͨÓá¢Áé»îµÄ  
·½·¨¸Äд´«Í³µÄ×Ö·ûI/Oϵͳ²¢ÊÊÓ¦ÍøÂçЭÒéµÄÐèÒª£¬ºóÀ´Á÷»úÖÆ±»¼ÓÈëSVR3¡£SV  
R4ÔòÌṩÁ˶ÔÁ÷£¨»ùÓÚÁ÷µÄÖÕ¶ËI/Oϵͳ£©µÄÈ«ÃæÖ§³Ö¡£[AT&T 1990d]¶ÔSVR4ʵÏÖ  
½øÐÐÁË˵Ã÷¡£  
Çë×¢Òâ²»Òª½«±¾ÕÂ˵Ã÷µÄÁ÷Óë±ê×¼I/O¿â£¨5.2½Ú£©ÖÐʹÓõÄÁ÷Ïà»ìÏý¡£  
Ò»¸öÁ÷ÔÚÓû§½ø³ÌºÍÉ豸Çý¶¯³ÌÐòÖ®¼äÌṩÁËÒ»Ìõȫ˫¹¤Í¨Â·¡£Á÷ÎÞÐèºÍʵ¼ÊÓ²¼þ  
É豸ֱ½Ó¶Ô»°-Á÷Ò²¿ÉÒÔÓÃ×÷ΪαÉ豸Çý¶¯³ÌÐò¡£Í¼12.8ʾ³öÁËÒ»¸ö¼òµ¥Á÷µÄ»ù±¾  
½á¹¹¡£  
ͼ12.8  Ò»¸ö¼òµ¥Á÷  
ÔÚÁ÷Ê×֮ϿÉÒÔѹÈë´¦ÀíÄ£¿é¡£Õâ¿ÉÒÔÓÃioctlʵÏÖ¡£Í¼12.9ʾ³öÁËÒ»¸ö°üº¬Ò»¸ö  
´¦ÀíÄ£¿éµÄÁ÷¡£¸÷·½¿òÖ®¼äÓÃÁ½¸ù´ø¼ýÍ·µÄÏßÁ¬½Ó£¬ÒÔÇ¿µ÷Á÷µÄȫ˫¹¤ÌØÕ÷¡£  
ÈÎÒâ¸öÊýµÄ´¦ÀíÄ£¿é¿ÉÒÔѹÈëÁ÷¡£ÎÒÃÇʹÓÃÊõÓï"ѹÈë"£¬ÕâÊÇÒòΪÿһÐÂÄ£¿é×ÜÊÇ  
²åµ½Á÷Ê×֮ϣ¬¶ø½«ÒÔǰѹÈëµÄÄ£¿éÏÂѹ¡££¨ÕâÀàËÆÓÚºó½ø¡¢ÏȳöµÄÕ»¡££©ÔÚͼ1  
2.9ÖУ¬ÎÒÃDZê³öÁËÁ÷µÄÁ½²à£¬·Ö±ð³ÆÎªË³Á÷£¨downstream£©ºÍÄæÁ÷£¨upstream£©  
¡£Ð´µ½Á÷Ê×µÄÊý¾Ý½«Ë³Á÷¶øÏ´«ËÍ¡£ÓÉÉ豸Çý¶¯³ÌÐò¶Áµ½µÄÊý¾ÝÔòÄæÁ÷ÏòÉÏ´«ËÍ¡£  
   
ͼ12.9  ¾ßÓд¦ÀíÄ£¿éµÄÁ÷  
Á÷Ä£¿éÊÇ×÷ΪºËÐIJ¿·ÖÖ´Ðеģ¬ÕâÀàËÆÓÚÉ豸Çý¶¯³ÌÐò£¬µ±¹¹ÔìºËÐÄʱ£¬Á÷Ä£¿éÁ¬  
±à½øÈëºËÐÄ¡£´ó¶àÊýϵͳ²»ÔÊÐí½«Ä©Á¬±à½øÈëºËÐĵÄÁ÷Ä£¿éѹÈëÁ÷¡£  
ÔÚͼ11.2ÖÐʾ³öÁË»ùÓÚÁ÷µÄÖÕ¶ËϵͳµÄÒ»°ã½á¹¹¡£Í¼Öбê³öµÄ"¶Á¡¢Ð´"º¯ÊýÊÇÁ÷Ê×  
¡£±êעΪ"ÖÕ¶ËÐйæ³Ì"µÄ¿òÊÇÒ»¸öÁ÷´¦ÀíÄ£¿é¡£¸Ã´¦ÀíÄ£¿éµÄʵ¼ÊÃû³ÆÊÇldterm¡£  
£¨¸÷ÖÖÁ÷Ä£¿éµÄÊÖ²áÒ³ÔÚ[AT&T 1990d]µÄµÚ7½ÚºÍ[AT&T 1991]µÄµÚ7½ÚÖС£  
ÓõÚÈýÕÂÖÐ˵Ã÷µÄº¯Êý´æÈ¡Á÷£¬ËüÃÇÊÇ£ºopen¡¢close¡¢read¡¢writeºÍioctl¡£Áí  
Í⣬ÔÚSVR3ºËÖÐÔö¼ÓÁË3¸öÖ§³ÖÁ÷µÄк¯Êý£¨getmsg¡¢putmsg¡¢ºÍpoll£©£¬ÔÚSVR4  
ÖÐÓÖ¼ÓÁËÁ½¸ö´¦ÀíÁ÷²»Í¬ÓÅÏȼ¶²¨¶ÎÏûÏ¢µÄº¯Êý£¨getpmsgºÍputpmsg£©¡£±¾½Ú½«Ëµ  
Ã÷ÕâЩк¯Êý£¬ÎÒÃÇΪÁ÷´ò¿ªµÄ·¾¶Ãûͨ³£ÔÚ/devĿ¼֮Ï¡£ÓÃls -l²é¿´É豸Ãû  
£¬¾ÍÄÜÅжϸÃÉ豸ÊÇ·ñΪÁ÷É豸¡£ËùÓÐÁ÷É豸¶¼ÊÇ×Ö·ûÌØÊâÎļþ¡£  
ËäȻijЩÓйØÁ÷µÄÎÄÏ×°µÊ¾ÎÒÃÇ¿ÉÒÔ±àд´¦ÀíÄ£¿é£¬²¢½«ËüÃÇѹÈëÁ÷ÖУ¬µ«ÊDZàд  
ÕâЩģ¿éÈçͬ±àдÉ豸Çý¶¯³ÌÐòÒ»Ñù£¬ÐèҪרÃŵļ¼Êõ¡£  
ÔÚÁ÷»úÖÆÖ®Ç°,ÖÕ¶ËÊÇÓÃÏÖ´æµÄclist»úÖÆ´¦ÀíµÄ¡£(Bach [1986]µÄ10.3.1½ÚºÍ  L  
effler et al[1989]µÄ9.6½Ú)·Ö±ð˵Ã÷SVR2ºÍ4.3BSDÖеÄclist »úÖÆ¡£½«»ùÓÚ×Ö·û  
µÄÉ豸Ìí¼Óµ½ºËÐÄÖÐͨ³£Éæ¼°±àдÉ豸Çý¶¯³ÌÐò£¬½«ËùÓÐÓйز¿·Ö¶¼°²ÅÅÔÚÇý¶¯³Ì  
ÐòÖС£¶ÔÐÂÉ豸µÄ´æÈ¡µäÐ͵ØÍ¨¹ýԭʼÉ豸½øÐУ¬ÕâÒâζ×Åÿ¸öÓû§µÄread,writ  
e¶¼Ö±Í¨½øÈëÉ豸Çý¶¯³ÌÐò¡£Á÷»úÖÆÊ¹ÕâÖÖ½»»¥×÷Ó÷½Ê½¸ü¼ÓÁé»î£¬ÌõÀíÇåÎú£¬Ê¹  
µÃÊý¾Ý¿ÉÒÔÓÃÁ÷ÏûÏ¢·½Ê½ÔÚÁ÷Ê׺ÍÇý¶¯³ÌÐòÖ®¼ä´«ËÍ£¬²¢Ê¹ÈÎÒâÊýµÄÖм䴦ÀíÄ£¿é  
¿É¶ÔÊý¾Ý½øÐвÙ×÷¡£  
Á÷ÏûÏ¢  
Á÷µÄËùÓÐÊäÈëºÍÊä³ö¶¼»ùÓÚÏûÏ¢¡£Á÷Ê׺ÍÓû§Ê¹ÓÃread¡¢write¡¢getmsg¡¢getpms  
g¡¢putmsgºÍputpmsg½»»»ÏûÏ¢¡£ÔÚÁ÷Êס¢¸÷´¦ÀíÄ£¿éºÍÉ豸Çý¶¯³ÌÐòÖ®¼ä£¬ÏûÏ¢¿É  
ÒÔ˳Á÷¶øÏ£¬Ò²¿ÉÒÔÄæÁ÷¶øÉÏ¡£  
ÔÚÓû§½ø³ÌºÍÁ÷Ê×Ö®¼ä£¬ÏûÏ¢ÓÉÏÂÁм¸²¿·Ö×é³É£ºÏûÏ¢ÀàÐÍ¡¢¿ÉÑ¡ÔñµÄ¿ØÖÆÐÅÏ¢£¬  
ÒÔ¼°¿ÉÑ¡ÔñµÄÊý¾Ý¡£ÔÚͼ12.10ÖÐʾ³öÁ˶ÔÓ¦ÓÚwrite¡¢putmsgºÍputpmsgµÄ²»Í¬²Î  
Êý£¬Ëù²úÉúµÄ²»Í¬ÏûÏ¢ÀàÐÍ¡£¿ØÖÆÐÅÏ¢ºÍÊý¾Ý´æ·ÅÔÚstrbuf½á¹¹ÖУº  
struct  strbuf  {  
  int  maxlen;        »º´æ´óС  
  int  Len;            µ±Ç°ÔÚ»º´æÖеÄ×Ö½ÚÊý  
  char  *buf           »º´æÖ¸Õë  
}£»  
ͼ12.10  Îªwrite¡¢putmsgºÍputpmsg²úÉúµÄÁ÷ÏûÏ¢µÄÀàÐÍ  
µ±ÓÃputmsg»òputpmsg·¢ËÍÏûϢʱ£¬lenÖ¸¶¨»º´æÖÐÊý¾ÝµÄ×Ö½ÚÊý¡£µ±ÓÃgetmsg»òg  
etpmsg½ÓÊÕÏûϢʱ£¬maxlen Ö¸¶¨»º´æ³¤¶È£¨Ê¹ºËÐIJ»»áÒç³ö»º´æ£©£¬¶ølenÔòÓɺˠ 
ÐÄÉèÖã¬ËµÃ÷´æ·ÅÔÚ»º´æÖеÄÊý¾ÝÁ¿¡£0³¤ÏûÏ¢ÊÇÔÊÐíµÄ£¬lenΪ-1˵Ã÷ûÓпØÖÆÐÅ  
Ï¢»òÊý¾Ý¡£  
ΪʲôÎÒÃÇÐèÒª´«ËÍ¿ØÖÆÐÅÏ¢ºÍÊý¾ÝÁ½ÕßÄØ£¿ÌṩÕâÁ½ÕßʹÎÒÃÇ¿ÉÒÔʵÏÖÓû§½ø³Ì  
ºÍÁ÷Ö®¼äµÄ½çÃæ¡£Olander,McGrathºÍIsrael[1986]˵Ã÷ÁËϵͳV·þÎñ½çÃæµÄÔ­ÏÈʵ  
ÏÖ¡£AT&T[1990d]µÚÎåÕÂÏêϸ˵Ã÷ÁË·þÎñ½çÃæ,»¹Ê¹ÓÃÁËÒ»¸ö¼òµ¥µÄʵÀý¡£¿ÉÄÜ×îΪ  
ÈËÁ˽âµÄ·þÎñ½çÃæÊÇϵͳVµÄ´«Êä²ã½çÃæ(TLI)£¬ËüÌṩÁËÍøÂçϵͳ½çÃæ£¬Stevens  
[1990]µÚÆßÕ¶Դ˽øÐÐÁË˵Ã÷¡£  
¿ØÖÆÐÅÏ¢µÄÁíÒ»¸öÀý×ÓÊÇ·¢ËÍÒ»¸öÎÞÁ¬½ÓµÄÍøÂçÏûÏ¢£¨Êý¾Ý±¨£©¡£ÎªÁË·¢Ë͸ÃÏûÏ¢  
£¬ÎÒÃÇÐèҪ˵Ã÷ÏûÏ¢µÄÄÚÈÝ£¨Êý¾Ý£©ºÍ¸ÃÏûÏ¢µÄÄ¿µÄµØÖ·£¨¿ØÖÆÐÅÏ¢£©¡£Èç¹ûÎÒÃÇ  
²»Äܽ«Êý¾ÝºÍ¿ØÖÆÒ»Æð·¢ËÍ£¬ÄÇô¾ÍҪijÖÖרÃÅÉè¼ÆµÄ·½°¸¡£ÀýÈ磬ÎÒÃÇ¿ÉÒÔÓÃi  
octl˵Ã÷µØÖ·£¬È»ºóÓÃwrite·¢ËÍÊý¾Ý¡£ÁíÒ»ÖÖ¼¼Êõ¿ÉÄÜÒªÇ󣺵ØÖ·Õ¼ÓÃÊý¾ÝµÄǰ  
N¸ö×Ö½Ú£¬ÓÃwriteдÊý¾Ý¡£½«¿ØÖÆÐÅÏ¢ÓëÊý¾Ý·Ö¿ª£¬²¢ÇÒÌṩ´¦ÀíÁ½Õߵĺ¯Êý£¨p  
utmsgºÍgetmsg£©ÊÇ´¦ÀíÕâÖÖÎÊÌâµÄ½ÏÇåÎúµÄ·½·¨¡£  
ÓÐÔ¼25ÖÖ²»Í¬ÀàÐ͵ÄÏûÏ¢£¬µ«ÊÇÖ»ÓÐÉÙÊý¼¸ÖÖÓÃÓÚÓû§½ø³ÌºÍÁ÷Ê×Ö®¼ä¡£ÆäÓàµÄÔò  
Ö»ÔÚºËÐÄÖÐ˳Á÷¡¢ÄæÁ÷´«ËÍ¡££¨¶ÔÓÚ±àдÁ÷´¦ÀíÄ£¿éµÄÈËÔ±¶øÑÔ£¬ÕâЩÏûÏ¢ÊǷdz£  
ÓÐÓõ쬵«ÊǶԱàдÓû§¼¶´úÂëµÄÈËÔ±¶øÑÔ£¬Ôò¿ÉºöÂÔËüÃÇ¡££©ÔÚÎÒÃÇËùʹÓõĺ¯  
Êý£¨read¡¢write¡¢getmsg¡¢getpmsg¡¢putmsgºÍputpmsg£©ÖУ¬Ö»Éæ¼°ÈýÖÖÏûÏ¢Àà  
ÐÍ£¬ËüÃÇÊÇ£º  
l M_DATA£¨I/OµÄÓû§Êý¾Ý£©£»  
l M_PROTO£¨Ð­Òé¿ØÖÆÐÅÏ¢£©£»  
l M_PCPROTO£¨¸ßÓÅÏȼ¶Ð­Òé¿ØÖÆÐÅÏ¢£©¡£  
Á÷ÖеÄÏûÏ¢¶¼ÓÐÒ»¸öÅŶÓÓÅÏȼ¶£»  
l ¸ßÓÅÏȼ¶ÏûÏ¢£¨×î¸ßÓÅÏȼ¶£©£»  
l ÓÅÏȲ¨¶ÎÏûÏ¢£»  
l ÆÕͨÏûÏ¢£¨×îµÍÓÅÏȼ¶£©¡£  
ÆÕͨÏûÏ¢ÊÇÓÅÏȲ¨¶ÎΪ0µÄÏûÏ¢¡£ÓÅÏȲ¨¶ÎÏûÏ¢µÄ²¨¶Î¿ÉÔÚ1-255Ö®¼ä£¬²¨¶ÎÓú¸ß£¬  
ÓÅÏȼ¶Ò²Óú¸ß¡£  
ÿ¸öÁ÷Ä£¿éÓÐÁ½¸öÊäÈë¶ÓÁС£Ò»¸ö½ÓÊÕÀ´×ÔËüÉÏÃæÄ£¿éµÄÏûÏ¢£¨ÕâÖÖÏûÏ¢´ÓÁ÷Ê×Ïò  
Çý¶¯³ÌÐò˳Á÷´«ËÍ£©¡£ÁíÒ»¸ö½ÓÊÕÀ´×ÔËüÏÂÃæÄ£¿éµÄÏûÏ¢£¨ÕâÖÖÏûÏ¢´ÓÇý¶¯³ÌÐòÏò  
Á÷Ê×ÄæÁ÷´«ËÍ£©¡£ÔÚÊäÈë¶ÓÁÐÖеÄÏûÏ¢°´ÓÅÏȼ¶´Ó¸ßµ½µÍÅÅÁС£ÔÚͼ12.10ÖУ¬ÎÒ  
ÃÇʾ³öÁËÕë¶Ôwrite¡¢putmsgºÍputpmsgµÄ²»Í¬²ÎÊý£¬²úÉú²»Í¬ÓÅÏȼ¶µÄÏûÏ¢¡£  
    ÓÐһЩÏûÏ¢ÎÒÃÇδ¼Ó¿¼ÂÇ¡£ÀýÈ磬ÈôÁ÷Ê×´ÓËüÏÂÃæ½ÓÊÕµ½M_SIGÏûÏ¢£¬Ôò²úÉú  
Ò»Ðźš£ÕâÖÖ·½·¨ÓÃÓÚÖÕ¶ËÐйæ³ÌÄ£¿éÏòÏà¹ØÇ°Ì¨½ø³Ì×é·¢ËÍÖն˲úÉúµÄÐźŠ 
putmsgºÍputpmsgº¯Êý  
putmsgºÍputpmsgº¯ÊýÓÃÓÚ½«Á÷ÏûÏ¢£¨¿ØÖÆÐÅÏ¢»òÊý¾Ý£¬»òÁ½Õߣ©Ð´ÖÁÁ÷ÖС£ÕâÁ½  
¸öº¯ÊýµÄÇø±ðÊǺóÕßÔÊÐí¶ÔÏûÏ¢Ö¸¶¨Ò»¸öÓÅÏȲ¨¶Î¡£  
_______________________________________________________________________  
_______  
#include <stropts.h>  
int putmsg(int filedes,const struct strbug *ctlptr,  
const struct strbuf *dataptr,int flag);  
int uptpmsg(int filedes,const struct strbuf *ctlptr,  
      const struct strbuf *dataptr,int band,int flag);  
       Á½¸öº¯Êý·µ»Ø£ºÈô³É¹¦Îª0,³ö´íΪ-1  
_______________________________________________________________________  
________  
¶ÔÁ÷Ò²¿ÉÒÔʹÓÃwriteº¯Êý£¬ËüµÈЧÓÚ²»´øÈκοØÖÆÐÅÏ¢£¬flagΪ0µÄputmsg¡£  
ÕâÁ½¸öº¯Êý¿ÉÒÔ²úÉúÈýÖÖ²»Í¬ÓÅÏȼ¶µÄÏûÏ¢£ºÆÕͨ¡¢ÓÅÏȲ¨¶ÎºÍ¸ßÓÅÏȼ¶¡£Í¼12.  
10ÏêϸÁгöÁËÕâÁ½¸öº¯ÊýÖм¸¸ö²ÎÊýµÄ¸÷ÖÖ¿ÉÄÜ×éºÏ£¬ÒÔ¼°Ëù²úÉúµÄ²»Í¬ÀàÐ͵ÄÏû  
Ï¢¡£  
ͼ12.10  write,putmsgºÍputpmsgËù²úÉúµÄÁ÷ÏûÏ¢ÀàÐÍ  
ÔÚ´ËͼÖУ¬ÏûÏ¢¿ØÖÆÁÐÖеÄ"·ñ"£¨no£©¶ÔÓ¦ÓÚ¿Õctlptr²ÎÊý£¬»òctlptr->lenΪ-1  
¡£¸ÃÁÐÖеÄ"ÊÇ"¶ÔÓ¦ÓÚctlptrÊǷǿգ¬ÒÔ¼°ctlptr->len´óÓÚµÈÓÚ0¡£ÕâЩ˵Ã÷ͬÑù  
ÊÊÓÃÓÚÏûÏ¢µÄÊý¾Ý²¿·Ö£¨ÓÃdataptr´úÌæctlptr£©¡£  
Á÷ ioct l²Ù×÷  
ÔÚSVR4ÖУ¬Ê¹ÓÃioctl¿É¶ÔÁ÷Ö´ÐÐ29ÖÖ²»Í¬µÄ²Ù×÷¡£¹ØÓÚÕâЩ²Ù×÷µÄ˵Ã÷Çë¼ûstre  
amio(7)ÊÖ²áÒ³£¨AT&T1990d£©£¬Í·Îļþ<stropts.h>Ó¦°üÀ¨ÔÚʹÓÃÕâЩ²Ù×÷µÄC´úÂë  
ÖС£ioctlµÄµÚ2¸ö²ÎÊýrequest˵Ã÷Ö´ÐÐ29¸ö²Ù×÷ÖеÄÄÇÒ»¸ö¡£ËùÓÐrequest¶¼ÒÔI  
_¿ªÊ¼¡£µÚ3¸ö²ÎÊýÔòÓërequestÓйء£ÓÐʱµÚ3¸ö²ÎÊýÊÇÒ»¸öÕûÐÍÖµ£¬ÓÐʱËüÊÇÖ¸Ïò  
Ò»¸öÕûÐÍ»òÒ»¸öÊý¾Ý½á¹¹µÄÖ¸Õë¡£  
  ÊµÀý-isastreamº¯Êý  
ÓÐʱÐèҪȷ¶¨Ò»¸öÃèÊö·ûÊÇ·ñÒýÓÃÒ»¸öÁ÷¡£ÕâÓëµ÷ÓÃisattyº¯ÊýÀ´È·¶¨Ò»¸öÃèÊö·û  
ÊÇ·ñÒýÓÃÒ»¸öÖÕ¶ËÉ豸ÏàÀàËÆ£¨11.9½Ú£©¡£SVR4Ìṩisastreamº¯Êý¡£  
 int isastream(int filedes);  
   ·µ»Ø£ºÈôÊÇÁ÷·µ»Ø1£¬·ñÔò·µ»Ø0  
£¨ÓÉÓÚijÖÖÔ­Òò£¬SVR4µÄÉè¼ÆÕßÍü¼Ç½«´Ëº¯ÊýµÄÔ­ÐÍ·ÅÔÚÍ·ÎļþÖУ¬ËùÒÔÎÒÃÇÒ²²»  
ÄÜΪ´Ëº¯ÊýдһÌõ#includeÓï¾ä¡££©  
    ÓëisattyÀàËÆ£¬Ëüͨ³£ÊÇÓÃÒ»¸öÖ»¶ÔÁ÷É豸²ÅÓÐЧµÄioctlº¯ÊýÀ´½øÐвâÊԵĠ 
¡£³ÌÐò12.8ÊǸú¯ÊýµÄÒ»ÖÖ¿ÉÄܵÄʵÏÖ¡£ËüʹÓÃI_CANPUT ioctlÀ´²âÊÔÓɵÚ3¸ö²Î  
Êý˵Ã÷µÄÓÅÏȲ¨¶ÎÊÇ·ñÊÇ¿ÉдµÄ£¿Èç¹û¸ÃioctlÖ´Ðгɹ¦£¬ÔòËü¶ÔËùÉæ¼°µÄÁ÷²¢Ä©  
×÷Èκθı䡣  
#include <stropts.h>  
#include <unistd.h>  
int  
isastream(int fd)  
{  
 return(ioctl(fd, I_CANPUT, 0) != -1);  
}  
³ÌÐò12.8  ¼ì²éÃèÊö·ûÊÇ·ñÒýÓÃÁ÷É豸  
³ÌÐò12.9  ¿ÉÓÃÓÚ²âÊԴ˺¯Êý¡£  
#include <sys/types.h>  
#include <sys/fcntl.h>  
#include "ourhdr.h"  
int  
main(int argc, char *argv[])  
{  
 int  i, fd;  
 for (i = 1; i < argc; i++) {  
  printf("%s: ", argv[i]);  
  if ( (fd = open(argv[i], O_RDONLY)) < 0) {  
   err_ret("%s: can't open", argv[i]);  
   continue;  
  }  
  if (isastream(fd) == 0)  
   err_ret("%s: not a stream", argv[i]);  
  else  
   err_msg("%s: streams device", argv[i]);  
 }  
 exit(0);  
}  
³ÌÐò12.9  ²âÊÔisasteamº¯Êý  
ÔËÐд˳ÌÐò£¬µÃµ½ºÜ¶àÓÉioctlº¯Êý·µ»ØµÄ³ö´íÐÅÏ¢¡£  
$ a.out /dev/tty /dev/vidadm /dev/null /etc/motd  
/dev/tty:/dev/tty:streams device  
/dev/vidadm:/dev/vidadm:not a stream:Invalid argument  
/dev/null:/dev/null:not a stream:No suck device  
/etc/motd: /etc/motd:not a stream:Not a typewriter  
/dev/ttyÔÚSVRÖ®ÏÂÊǸöÁ÷É豸£¬ÕâÓëÎÒÃÇËùÆÚÍûµÄÒ»Ö¡£/dev/vidadm²»ÊÇÒ»¸öÁ÷  
É豸£¬µ«ÊÇËüÊÇÖ§³ÖÆäËüioctlÇëÇóµÄ×Ö·ûÌØÊâÎļþ¡£¶ÔÓÚ²»ÖªµÀÕâÖÖioctlÇëÇóµÄ  
É豸£¬Ëü·µ»ØEINVAL¡£/dev/nullÊÇÒ»ÖÖ²»Ö§³ÖÈκÎioctl²Ù×÷µÄ×Ö·ûÌØÊâÎļþ£¬Ëù  
ÒÔioctl·µ»ØENODEV¡£×îºó£¬/etc/motdÊÇÒ»¸öÆÕͨÎļþ£¬¶ø²»ÊÇ×Ö·ûÌØÊâÎļþ£¬Ëù  
ÒÔ·µ»ØENOTTY£¨ÕâÊÇÔÚÕâÖÖÇé¿öϵĵäÐÍ·µ»ØÖµ£©¡£  
        ENOTTY£¨"²»ÊÇ´ò×Ö»ú"£©ÊǸöÀúÊ·²úÎµ±ioctlÆóͼ¶Ô²¢²»ÒýÓÃ×Ö·ûÌØ  
ÊâÉ豸  
        µÄÃèÊö·û½øÐвÙ×÷ʱ£¬UnixϵͳºË¶¼·µ»ØENOTTY¡£  
ʵÀý  
Èç¹ûioctl²ÎÊýrequestÊÇI_LIST£¬Ôòϵͳ·µ»Ø¸ÃÁ÷ÉÏËùÓÐÄ£¿éµÄÃû×Ö£¬°üÀ¨×î¶¥¶Ë  
µÄÇý¶¯³ÌÐò¡£ÆäµÚ3¸ö²ÎÊýÓ¦µ±ÊÇÖ¸Ïòstr_list½á¹¹ÊÇÖ¸Õë¡£  
struct str_list{  
int      sl_nmods;    Êý×éÖÐÏîµÄÊýÄ¿  
struct  str_modlist   *sl_modlist;   Ö¸ÏòÊý×éÖеÚÒ»¸öÔªËØµÄÖ¸Õë  
};  
Ó¦½«sl_modlistÉèÖÃΪָÏòstr_mlist½á¹¹Êý×éµÄµÚÒ»¸öÔªËØ£¬½«sl_nmodsÉèÖÃΪ  
¸ÃÊý×éÖеÄÏîÊý¡£  
struct str_mlist {  
char l_name[FMNAMESZ+1];         ÒÔnull½áβµÄÄ£¿éÃû×Ö  
};  
³£ÊýFMNAMESZ¶¨ÒåÔÚÍ·Îļþ<sys/conf.h>ÖУ¬ÆäÖµ³£³£ÊÇ8¡£l_nameµÄʵ¼Ê³¤¶ÈÊÇ  
FMNAMESZ+1£¬Ôö¼Ó1¸ö×Ö½ÚÊÇΪÁË´æ·ÅnullÖÕÖ¹·û¡£  
Èç¹ûioctlµÄµÚ3¸ö²ÎÊýÊÇ0£¬Ôò¸Ãº¯Êý·µ»ØµÄÊÇÄ£¿éÊý£¬¶ø²»ÊÇÄ£¿éÃû¡£ÎÒÃǽ«ÏÈ  
ÓÃÕâÖÖioctlµ÷ÓÃÈ·¶¨Ä£¿éÊý£¬È»ºóÔÙ·ÖÅäËùÒªÇóµÄstr_mlist½á¹¹Êý¡£  
³ÌÐò12.10ÀýʾÁËI_LIST²Ù×÷¡£ÓÉioctl·µ»ØµÄÃû×ÖÁÐ±í²¢²»¶ÔÄ£¿éºÍÇý¶¯³ÌÐò½øÐР 
Çø·Ö£¬ÒòΪÔÚ¸ÃÁбíÖеÄ×îºóÒ»ÏîÊÇ´¦ÓÚÁ÷µ×²¿µÄÇý¶¯³ÌÐò£¬ËùÒÔÔÚ´òӡʱ½«Æä±ê  
Ã÷ΪÇý¶¯³ÌÐò¡£  
#include <sys/conf.h>  
#include <sys/types.h>  
#include <fcntl.h>  
#include <stropts.h>  
#include "ourhdr.h"  
int  
main(int argc, char *argv[])  
{  
 int     fd, i, nmods;  
 struct str_list  list;  
 if (argc != 2)  
  err_quit("usage: a.out <pathname>");  
 if ( (fd = open(argv[1], O_RDONLY)) < 0)  
  err_sys("can't open %s", argv[1]);  
 if (isastream(fd) == 0)  
  err_quit("%s is not a stream", argv[1]);  
   /* fetch number of modules */  
 if ( (nmods = ioctl(fd, I_LIST, (void *) 0)) < 0)  
  err_sys("I_LIST error for nmods");  
 printf("#modules = %d\n", nmods);  
   /* allocate storage for all the module names */  
 list.sl_modlist = calloc(nmods, sizeof(struct str_mlist));  
 if (list.sl_modlist == NULL)  
  err_sys("calloc error");  
 list.sl_nmods = nmods;  
   /* and fetch the module names */  
 if (ioctl(fd, I_LIST, &list) < 0)  
  err_sys("I_LIST error for list");  
   /* print the module names */  
 for (i = 1; i <= nmods; i++)  
  printf("  %s: %s\n", (i == nmods) ? "driver" : "module",  
        list.sl_modlist++);  
 exit(0);  
}  
³ÌÐò12.10  ´òÓ¡Á÷ÖеÄÄ£¿éÃû  
$ who  
stevens console sep 25 06:12  
stevens pts001 Oct 12 07:12  
$ a.out /dev/pts001  
#modules=4  
 module:ttcompat  
 module:ldterm  
 module:ptem  
 driver:pts  
$ a.out /dev/console  
#modules=5  
 module:ttcompat  
 module:ldterm  
 module:ansi  
 module:char  
 driver:cmux  
ÔÚÕâÁ½ÖÖÇéÐÎÖУ¬¶¥ÉϵÄÁ½¸öÁ÷Ä£¿é¶¼ÊÇÒ»ÑùµÄ£¨ttcompacºÍldterm£©£¬µ«ÊÇÓàÏ  
µÄÄ£¿éºÍÇý¶¯³ÌÐòÔò²»Í¬¡£ÔÚµÚÊ®¾ÅÕÂÖÐÎÒÃǽ«ËµÃ÷αÖÕ¶ËÇéÐΡ£  
writeÖÁÁ÷É豸  
ÔÚͼ12.10ÖпÉÒÔ¿´µ½writeÖÁÁ÷É豸²úÉúÒ»¸öM_DATAÏûÏ¢¡£Ò»°ã¶øÑÔ£¬ÕâȷʵÈç´Ë  
£¬µ«ÊÇÒ²»¹ÓÐһЩÇé¿öÐèÒª¿¼ÂÇ¡£Ê×ÏÈ£¬Á÷Öж¥²¿µÄÒ»¸ö´¦ÀíÄ£¿é¹æ¶¨ÁË¿É˳Á÷´«  
Ë͵Ä×îС¡¢×î´óÊý¾Ý°ü³¤¶È¡££¨ÎÞ·¨²éѯ¸ÃÄ£¿éÖй涨µÄÕâЩֵ¡££©Èç¹ûwriteµÄ  
Êý¾Ý³¤¶È³¬¹ý×î´óÖµ£¬ÔòÁ÷Ê×½«ÕâÒ»Êý¾Ý·Ö½â³É×î´ó³¤¶ÈµÄÈô¸ÉÊý¾Ý°ü¡£×îºóÒ»¸ö  
Êý¾Ý°üµÄ³¤¶ÈÔòСÓÚ×î´óÖµ¡£  
½Ó×ÅÒª¿¼ÂǵÄÊÇ£ºÈç¹ûÏòÁ÷write 0¸ö×Ö½Ú£¬ÓÖ½«ÈçºÎÄØ£¿³ý·ÇÁ÷Éæ¼°¹ÜµÀ»òFIFO  
£¬·ñÔò¾Í˳Á÷·¢ËÍ0³¤ÏûÏ¢¡£¶ÔÓڹܵÀFIFO£¬ÎªÓëÒÔǰ°æ±¾¼æÈÝ£¬ÏµÍ³µÄĬÈÏ´¦Àí  
·½Ê½ÊǺöÂÔ0³¤write¡£¿ÉÒÔÓÃioctlÉèÖÃʵÏֹܵÀºÍFIFOµÄÁ÷д·½Ê½ÒÔ¸ü¸ÄÕâÖÖĬ  
ÈÏ´¦Àí·½Ê½¡£  
д·½Ê½  
¿ÉÒÔÓÃioctlÈ¡µÃºÍÉèÖÃÒ»¸öÁ÷µÄд·½Ê½¡£Èç¹û½«requestÉèÖÃΪI_GWROPT£¬µÚÈý¸ö  
²ÎÊýΪָÏòÒ»¸öÕûÐͱäÁ¿µÄÖ¸Õë,Ôò¸ÃÁ÷µÄµ±Ç°Ð´·½Ê½¾ÍÔÚ¸ÃÕûÐÍÁ¿Öзµ»Ø¡£Èç¹û  
½«requestÉèÖÃΪI_SWROPT,µÚ3¸ö²ÎÊýÊÇÒ»¸öÕûÐÍ,ÔòÆäÖµ¾Í³ÉΪ¸ÃÁ÷еÄд·½Ê½¡£  
Èçͬ´¦ÀíÎļþÃèÊö·û±êÖ¾ºÍÎļþ״̬±êÖ¾(3.13½Ú)Ò»Ñù,×ÜÊÇÓ¦µ±ÏÈÈ¡µ±Ç°Ð´·½Ê½  
Öµ,È»ºóÐÞ¸ÄËü,¶ø²»Ö»Êǽ«Ð´·½Ê½ÉèÖÃΪij¸ö¾ø¶ÔÖµ(ºÜ¿ÉÄÜÒª¹Ø±ÕijЩԭÀ´´ò¿ª  
µÄλ)¡£  
Ŀǰ£¬Ö»¶¨ÒåÁËÁ½¸öд·½Ê½Öµ¡£  
SNDZERO  ¶Ô¹ÜµÀºÍFIFOµÄ0³¤Ð´»áÔì³É˳Á÷´«ËÍÒ»¸ö0³¤ÏûÏ¢¡£°´ÏµÍ³Ä¬ÈÏ£¬0³¤Ð´  
²»·¢ËÍÏûÏ¢¡£  
SNPIPE    ÔÚÁ÷ÉÏÒѳö´íºó£¬Èôµ÷ÓÃwrite»òputmsg£¬ÔòÏòµ÷Óýø³Ì·¢ËÍSIGPIPEÐÅ  
ºÅ¡£  
Ò»¸öÁ÷Ò²ÓжÁ·½Ê½£¬ÎÒÃÇÏÈ˵Ã÷getmsgºÍgetpmsgº¯Êý£¬È»ºóÔÙ˵Ã÷¶Á·½Ê½¡£  
_______________________________________________________________________  
____  
#include <stropts.h>  
int getmsg(int filedes,struct strbuf *ctlptr,  
   struct strbuf *dataptr,int *flagptr);  
int getpmsg(int filedes,struct strbuf *ctlptr,  
   struct strbuf *dataptr, int *bandptr, int *flagptr);  
 Á½¸öº¯Êý·µ»Ø£ºÈô³É¹¦Îª·Ç¸ºÖµ£¬³ö´íΪ-1  
  _____________________________________________________________________  
________  
getmsgºÍgetpmsgº¯Êý  
ÓÃread£¬getmsgºÍgetpmsg´ÓÁ÷Ê×¶ÁÁ÷ÏûÏ¢¡£  
×¢Ò⣬flagptrºÍbandptrÊÇÖ¸ÏòÕûÐ͵ÄÖ¸Õë¡£ÔÚµ÷ÓÃ֮ǰ£¬ÕâÁ½¸öÖ¸ÕëËùÖ¸ÏòµÄÕû  
Ð͵¥ÔªÖÐÓ¦ÉèÖóÉËùÏ£ÍûµÄÏûÏ¢ÀàÐÍ£¬ÔÚ·µ»ØÊ±£¬´ËÕûÐÍÁ¿ÉèÖÃΪËù¶Áµ½µÄÏûÏ¢µÄ  
ÀàÐÍ¡£  
Èç¹ûflagptrÖ¸ÏòµÄÕûÐ͵¥ÔªµÄÖµÊÇ0£¬Ôògetmsg·µ»ØÔÚÁ÷Ê×¶Á¶ÓÁÐÖеÄÏÂÒ»¸öÏûÏ¢  
¡£Èç¹ûÏÂÒ»¸öÏûÏ¢ÊǸßÓÅÏÈȨÏûÏ¢£¬ÔòÔÚ·µ»ØÊ±£¬flagptrËùÖ¸ÏòµÄÕûÐ͵¥ÔªÉèÖà 
ΪRS_HIPRI¡£Èç¹ûÏ£ÍûÖ»½ÓÊÕ¸ßÓÅÏÈȨÏûÏ¢£¬ÔòÔÚµ÷ÓÃgetmsg֮ǰ±ØÐ뽫flagptr  
ËùÖ¸ÏòµÄÕûÐ͵¥ÔªÉèÖÃΪRS_HIPRI¡£  
ÕâÁ½¸öº¯ÊýÓкܶàÌõ¼þÀ´È·¶¨·µ»Ø¸øµ÷ÓÃÕߺÎÖÖÏûÏ¢£º(a)flagptrºÍbandptrËùÖ¸  
ÏòµÄÖµ£¬(b)ctlptr->maxlenºÍdataptr->maxlenµÄÖµ¡£¶ÔʹÓÃgetmsg¶øÑÔ£¬²¢²»Ðè  
ÒªÁ˽âËùÓÐÕâЩϸ½Ú¡£ÈçÓûÁ˽âÕâЩϸ½ÚÇë²ÎÔÄgetmsg£¨2£©ÊÖ²áÒ³¡£  
¶Á·½Ê½  
Èç¹ûreadÁ÷É豸»á·¢ÉúÐ©Ê²Ã´ÄØ£¿ÓÐÁ½¸öDZÔÚµÄÎÊÌ⣺(1)Èç¹û¶Áµ½Á÷ÖÐÏûÏ¢µÄ¼Ç  
¼±ß½ç½«»áÔõÑù£¿(2)Èç¹ûµ÷ÓÃread£¬¶øÁ÷ÖÐÏÂÒ»¸öÏûÏ¢ÓпØÖÆÐÅÏ¢ÓÖ½«ÈçºÎ£¿¶Ô  
µÚÒ»ÖÖÇé¿öµÄĬÈÏ´¦Àí·½Ê½±»³ÆÎª×Ö½ÚÁ÷·½Ê½¡£ÔÚÕâÖÖ·½Ê½ÖУ¬read´ÓÁ÷ÖÐÈ¡Êý¾Ý  
Ö±ÖÁÂú×ãÁËÒªÇ󣬻òÕßÒѾ­Ã»ÓÐÊý¾Ý¡£ÔÚÕâÖÖ·½Ê½ÖУ¬ºöÂÔÁ÷ÖÐÏûÏ¢µÄ±ß½ç¡£¶ÔµÚ  
¶þÖÖÇé¿öµÄĬÈÏ´¦ÀíÊÇ£¬Èç¹ûÔÚ¶ÓÁеÄǰ¶ËÓпØÖÆÏûÏ¢£¬Ôòread³ö´í·µ»Ø¡£¿ÉÒԸĠ 
±äÕâÁ½ÖÖĬÈÏ´¦Àí·½Ê½¡£  
ÔÚµ÷ÓÃioctlʱ£¬Èô½«requestÉèÖÃΪI_GRDOPT£¬µÚ3¸ö²ÎÊýÓÖÊÇÖ¸ÏòÒ»¸öÕûÐ͵¥Ôª  
µÄÖ¸Õ룬Ôò¶Ô¸ÃÁ÷µÄµ±Ç°¶Á·½Ê½ÔÚ¸ÃÕûÐ͵¥ÔªÖзµ»Ø¡£Èç¹û½«requestÉèÖÃΪI_SR  
DOPT£¬µÚ3¸ö²ÎÊýÊÇÕûÐÍÖµ£¬Ôò¸ÃÁ÷µÄ¶Á·½Ê½ÉèÖÃΪ¸ÃÖµ¡£¶Á·½Ê½ÖµÓÐÏÂÁÐÈý¸ö£º  
   
RNORM  ÆÕͨ£¬×Ö½ÚÁ÷·½Ê½£¨ÓëÉÏÃæËµÃ÷µÄÏàͬ£©¡£ÕâÊÇĬÈÏ·½Ê½¡£  
RMSGN  ÏûÏ¢²»É¾³ý·½Ê½¡£¶Á´ÓÁ÷ÖÐÈ¡Êý¾ÝÖ±ÖÁ¶Áµ½ËùÒªÇóµÄ×Ö½ÚÊý£¬»òÕßµ½´ïÏû  
Ï¢±ß½ç¡£Èç¹ûij´Î¶ÁÖ»ÓÃÁËÒ»¸öÏûÏ¢µÄÒ»²¿·Ö£¬ÔòÆäÓàϲ¿·ÖÈÔÁôÔÚÁ÷ÖУ¬ÒÔ¹©Ï  
Ò»¸ö¶ÁÈ¡¡£  
RMSGD  ÏûϢɾ³ý·½Ê½¡£ÕâÓ벻ɾ³ý·½Ê½µÄÇø±ðÊÇ£¬Èç¹ûij´Î¶ÁÖ»ÓÃÒ»¸öÏûÏ¢µÄÒ»  
²¿·Ö¡£ÔòÓàϲ¿·Ö¾Í±»É¾³ý£¬²»ÔÙʹÓᣠ 
ÔÚ¶Á·½Ê½Öл¹¿ÉÖ¸¶¨ÁíÍâÈý¸ö³£Êý£¬ÒÔ±ãÉèÖÃÔÚ¶Áµ½Á÷Öаüº¬Ð­ÒéÐÅÏ¢µÄÏûϢʱr  
eadµÄ´¦Àí·½·¨£º  
RPROTNORM  Ð­Òé-ÆÕͨ·½Ê½£ºread³ö´í·µ»Ø£¬errnoÉèÖÃΪEBADMSG¡£ÕâÊÇĬÈÏ·½Ê½  
¡£  
RPROTDAT    Ð­Òé-Êý¾Ý·½Ê½£ºread½«¿ØÖƲ¿·Ö×÷ΪÊý¾Ý·µ»Ø¸øµ÷ÓÃÕß¡£  
RPROTDIS    Ð­Òé-ɾ³ý·½Ê½£ºreadɾ³ýÏûÏ¢ÖеĿØÖÆÐÅÏ¢£¬µ«ÊÇ·µ»ØÏûÏ¢ÖеÄÊý  
¾Ý¡£  
ʵÀý  
³ÌÐò12.11ÊÇÔÚ³ÌÐò3.3µÄ»ù´¡ÉϸÄдµÄ£¬ËüÓÃgetmsg´úÌæÁËread¡£Èç¹ûÔÚSVR4֮Ϡ 
£¨Æä¹ÜµÀºÍÖն˶¼ÊÇÓÃÁ÷ʵÏֵģ©ÔËÐд˳ÌÐòÔòµÃ£º  
$ echo hello,world | a.out         requires pipes to be implemented usi  
ng streams  
flag=0,ctl.len=-1,dat.len=13  
hello,world  
flag=0,ctl.len=0,dat.len=0 indicates a streams hangup  
$ a.out        requires terminals to be implemented using streams  
this is line 1  
flag=0,ctl.len=-1,dat.len=15  
this is line 1  
and line 2  
flag=0,ctl.len=-1,dat.len=11  
and line 2  
^D        type our terminal EOF character  
flag=0,ctl.len=-1,dat.len=0   tty end of file is not the same as a hang  
up  
$ a.out < /etc/motd  
getmsg error:Not a stream device  
µ±¹ÜµÀ±»¹Ø±Õʱ£¨µ±echoÖÕֹʱ£©£¬Ëü¶Ô³ÌÐò12.11±íÏÖΪһ¸öÁ÷¹Ò¶Ï-¿ØÖƳ¤¶ÈºÍ  
Êý¾Ý³¤¶È¶¼ÉèÖÃΪ0¡££¨ÔÚ14.2½ÚÖн«ÌÖÂ۹ܵÀ¡££©µ«ÊǶÔÓÚÖÕ¶Ë£¬¼üÈëÎļþ½áÊø  
×Ö·û£¬Ö»Ê¹·µ»ØµÄÊý¾Ý³¤¶ÈΪ0¡£ÕâÓë¹Ò¶Ï²¢²»Ïàͬ¡£ÈçËùÔ¤ÁϵÄÒ»Ñù£¬½«±ê×¼Êä  
ÈëÖØÐ¶¨Ïòµ½Ò»¸ö·ÇÁ÷É豸£¬getmsg³ö´í·µ»Ø¡£  
#include <stropts.h>  
#include "ourhdr.h"  
#define BUFFSIZE 8192  
int  
main(void)  
{  
 int    n, flag;  
 char   ctlbuf[BUFFSIZE], datbuf[BUFFSIZE];  
 struct strbuf ctl, dat;  
 ctl.buf = ctlbuf;  
 ctl.maxlen = BUFFSIZE;  
 dat.buf = datbuf;  
 dat.maxlen = BUFFSIZE;  
 for ( ; ; ) {  
  flag = 0;  /* return any message */  
  if ( (n = getmsg(STDIN_FILENO, &ctl, &dat, &flag)) < 0)  
   err_sys("getmsg error");  
  fprintf(stderr, "flag = %d, ctl.len = %d, dat.len = %d\n",  
      flag, ctl.len, dat.len);  
  if (dat.len == 0)  
   exit(0);  
  else if (dat.len > 0)  
   if (write(STDOUT_FILENO, dat.buf, dat.len) != dat.len)  
    err_sys("write error");  
 }  
}  
³ÌÐò12.11  ÓÃgetmsg½«±ê×¼ÊäÈë¸´ÖÆµ½±ê×¼Êä³ö  
12.4 I/O¶à·ת½Ó  
µ±´ÓÒ»¸öÃèÊö·û¶Á£¬È»ºóÓÖдµ½ÁíÒ»¸öÃèÊö·ûʱ£¬ÎÒÃÇ¿ÉÒÔÔÚÏÂÁÐÐÎʽµÄÑ­»·ÖÐʹ  
ÓÃ×èÈûI/O£º  
 while ( (n=read(STDIN_FILENO,buf,BUFSIZ) ) >0)  
   if (write (STDOUT_FILENO,buf,n) !=n)  
    err_sys (write error");  
ʹÓÃÕâÖÖÐÎʽµÄ×èÈûI/OÊǵ½´¦¿É¼ûµÄ¡£µ«ÊÇÈçÈô±ØÐë¶ÁÁ½¸öÃèÊö·ûÓÖ½«ÈçºÎÄØ£¿  
Èç¹ûÎÒÃÇÈÔ¾ÉʹÓÃ×èÈûI/O£¬ÄÇô¾Í¿ÉÄܳ¤Ê±¼ä×èÈûÔÚÒ»¸öÃèÊö·ûÉÏ£¬¶øÁíÒ»¸öÃè  
Êö·ûËäÓкܶàÊý¾ÝÈ´²»Äܵõ½¼°Ê±´¦Àí¡£ËùÒÔΪÁË´¦ÀíÕâÖÖÇé¿öÏÔÈ»ÐèÒªÁíÒ»ÖÖ²»  
ͬµÄ¼¼Êõ¡£  
ÈÃÎÒÃǸÅÂԵع۲ìÒ»¸öµ÷ÖÆ½âµ÷Æ÷²¦ºÅ³ÌÐòµÄ¹¤×÷Çé¿ö£¨¸Ã³ÌÐò½«ÔÚµÚÊ®°ËÕÂÖн頠
ÉÜ£©¡£¸Ã³ÌÐò¶ÁÖÕ¶Ë£¨±ê×¼ÊäÈ룩£¬½«ËùµÃÊý¾Ýдµ½µ÷ÖÆ½âµ÷Æ÷ÉÏ£»Í¬Ê±¶Áµ÷ÖÆ½â  
µ÷Æ÷£¬½«ËùµÃÊý¾Ýдµ½ÖÕ¶ËÉÏ£¨±ê×¼Êä³ö£©¡£Í¼12.11ÏÔʾÕâÖÖ¹¤×÷Çé¿ö¡£  
ͼ12.11  µ÷ÖÆ½âµ÷Æ÷²¦ºÅ³ÌÐò¸Å¹Û  
Ö´ÐÐÕâ¶Î³ÌÐòµÄ½ø³ÌÓÐÁ½¸öÊäÈ룬Á½¸öÊä³ö¡£Èç¹û¶ÔÕâÁ½¸öÊäÈ붼ʹÓÃ×èÈûread£¬  
ÄÇô¾Í¿ÉÄÜÔÚÒ»¸öÊäÈëÉϳ¤ÆÚ×èÈû£¬¶øÁíÒ»¸öÊäÈëµÄÊý¾ÝÔò±»¶ªÊ§¡£  
´¦ÀíÕâÖÖÌØÊâÎÊÌâµÄÒ»ÖÖ·½·¨ÊÇ£ºÉèÖÃÁ½¸ö½ø³Ì£¬Ã¿¸ö½ø³Ì´¦ÀíÒ»ÌõÊý¾Ýͨ·¡£ÔÚ  
ͼ12.12ÖÐÏÔʾÁËÕâÖÖ°²ÅÅ¡£  
ͼ12.12  Ê¹ÓÃÁ½¸ö½ø³ÌʵÏÖµ÷ÖÆ½âµ÷Æ÷²¦ºÅ³ÌÐò  
Èç¹ûʹÓÃÁ½¸ö½ø³Ì£¬Ôò¿Éʹÿ¸ö½ø³Ì¶¼Ö´ÐÐ×èÈûread¡£µ«ÊÇÒ²²úÉúÁËÕâ¶þ¸ö½ø³Ì¼ä  
Ï໥ÅäºÏÎÊÌâ¡£Èç¹û×Ó½ø³Ì½ÓÊÕµ½Îļþ½áÊø·û£¨ÓÉÓڵ绰ÏßµÄÒ»¶ËÒѾ­¹Ò¶Ï£¬Ê¹µ÷  
ÖÆ½âµ÷Æ÷Ò²¹Ò¶Ï£©£¬ÄÇô¸Ã×Ó½ø³ÌÖÕÖ¹£¬È»ºó¸¸½ø³Ì½ÓÊÕµ½SIGCHLDÐźš£µ«ÊÇ£¬  
ÈçÈô¸¸½ø³ÌÖÕÖ¹£¨Óû§ÔÚÖÕ¶ËÉϼüÈëÁËÎļþ½áÊø·û£©£¬ÄÇô¸¸½ø³ÌӦ֪ͨ×Ó½ø³ÌÍ£  
Ö¹¹¤×÷¡£Îª´ËÎÒÃÇ¿ÉÒÔʹÓÃÒ»¸öÐźţ¨ÀýÈ磬SIGUSR1£©¡£Õâʹ³ÌÐò±äµÃ¸ü¼Ó¸´ÔÓ  
¡£  
ÁíÒ»¸ö·½Ê½ÊÇÈÔ¾ÉʹÓÃÒ»¸ö½ø³ÌÖ´ÐиóÌÐò£¬µ«µ÷Ó÷Ç×èÈûI/O¶ÁÈ¡Êý¾Ý£¬Æä»ù±¾  
˼ÏëÊÇ£º½«Á½¸öÊäÈëÃèÊö·û¶¼ÉèÖÃΪ·Ç×èÈûµÄ£¬¶ÔµÚÒ»¸öÃèÊö·û·¢Ò»¸öread¡£Èç¹û  
¸ÃÊäÈëÉÏÓÐÊý¾Ý£¬Ôò¶ÁÊý¾Ý²¢´¦ÀíËü¡£Èç¹ûÎÞÊý¾Ý¿É¶Á£¬ÔòreadÁ¢¼´·µ»Ø¡£È»ºó¶Ô  
µÚ¶þ¸öÃèÊö·û×÷ÓÃÑùµÄ´¦Àí¡£ÔÚ´ËÖ®ºó£¬µÈ´ýÈô¸ÉÃëÔÙ¶ÁµÚÒ»¸öÃèÊö·û¡£ÕâÖÖÐÎʽ  
µÄÑ­»·³ÆÎªÂÖѯ¡£ÕâÖÖ·½·¨µÄ²»×ãÖ®´¦ÊÇÀË·ÑCPUʱ¼ä¡£´ó¶àÊýʱ¼äʵ¼ÊÉÏÊÇÎÞÊý  
¾Ý¿É¶Á£¬µ«ÊÇÈÔ²»¶Ï·´¸´Ö´ÐÐread£¬ÕâÀË·ÑÁËCPUʱ¼ä¡£ÔÚÿ´ÎÑ­»·ºóÒªµÈ¶à³¤Ê±  
¼äÔÙÖ´ÐÐÏÂÒ»ÂÖÑ­»·Ò²ÊǺÜÄÑÈ·¶¨µÄ¡£ÂÖѯ¼¼ÊõÔÚÖ§³Ö·Ç×èÈûI/OµÄϵͳÉ϶¼¿Éʹ  
Ó㬵«ÊÇÔÚ¶àÈÎÎñϵͳÖÐÓ¦µ±±ÜÃâʹÓᣠ 
»¹ÓÐÒ»ÖÖ¼¼Êõ³ÆÖ®ÎªÒì²½I/O¡£Æä»ù±¾Ë¼ÏëÊǽø³Ì¸æËßϵͳºË£¬µ±Ò»¸öÃèÊö·ûÒÑ×¼  
±¸ºÃ¿ÉÒÔ½øÐÐI/Oʱ£¬ÓÃÒ»¸öÐźÅ֪ͨËü¡£ÕâÖÖ¼¼ÊõÓÐÁ½¸öÎÊÌâ¡£µÚÒ»¸öÊDz¢·ÇËù  
ÓÐϵͳ¶¼Ö§³ÖÕâÖÖ»úÖÆ£¨ÏÖÔÚËü»¹²»ÊÇPOSIXµÄ×é³É²¿·Ö£¬¿ÉÄܽ«À´»áÊÇ£©¡£SVR4  
Ϊ´Ë¼¼ÊõÌṩSIGPOLLÐźţ¬µ«Êǽöµ±ÃèÊö·ûÒýÓÃÁ÷É豸ʱ£¬´ËÐźŲÅÄܹ¤×÷¡£4.  
3+BSDÓÐÒ»¸öÀàËÆµÄÐźÅSIGIO£¬µ«Ò²ÓÐÀàËÆµÄÏÞÖÆ-½öµ±ÃèÊö·ûÒýÓÃÖÕ¶ËÉ豸»òÍø  
Âçʱ²ÅÄܹ¤×÷¡£ÕâÖÖ¼¼ÊõµÄµÚ¶þ¸öÎÊÌâÊÇ£¬ÕâÖÖÐźŶÔÿ¸ö½ø³Ì¶øÑÔÖ»ÓÐ1¸ö¡£Èç  
¹ûʹ¸ÃÐźŶÔÁ½¸öÃèÊö·û¶¼Æð×÷Óã¬ÄÇôÔÚ½Óµ½´ËÐźÅʱ½ø³ÌÎÞ·¨ÅбðÊÇÄÄÒ»¸öÃè  
Êö·ûÒÑ×¼±¸ºÃ¿ÉÒÔ½øÐÐI/O¡£ÎªÁËÈ·¶¨ÊÇÄÄÒ»¸öÃèÊö·ûÒÑ×¼±¸ºÃ£¬ÈÔÐ轫ÕâÁ½¸öÃè  
Êö·û¶¼ÉèÖÃΪ·Ç×èÈûµÄ£¬²¢Ë³ÐòÊÔÖ´ÐÐI/O¡£ÔÚ12.6½ÚÖн«¼òҪ˵Ã÷Òì²½I/O¡£  
Ò»ÖֱȽϺõļ¼ÊõÊÇʹÓÃI/O¶à·ת½Ó¡£Æä»ù±¾Ë¼ÏëÊÇ£ºÏȹ¹ÔìÒ»ÕÅÓйØÃèÊö·ûµÄ  
±í£¬È»ºóµ÷ÓÃÒ»¸öº¯Êý£¬ËüÒªµ½ÕâЩÃèÊö·ûÖеÄÒ»¸öÒÑ×¼±¸ºÃ½øÐÐI/Oʱ²Å·µ»Ø¡£  
ÔÚ·µ»ØÊ±£¬Ëü¸æËß½ø³ÌÄÇÒ»¸öÃèÊö·ûÒÑ×¼±¸ºÃ¿ÉÒÔ½øÐÐI/O¡£  
        I/O¶à·ת½ÓÖÁ½ñ»¹²»ÊÇPOSIXµÄ×é³É²¿·Ö¡£SVR4ºÍ4.3+BSD¶¼Ìṩselect  
º¯ÊýÒÔÖ´ÐÐI/O¶à·ת½Ó¡£pollº¯ÊýÖ»ÓÉSVR4Ìṩ¡£SVR4ʵ¼ÊÉÏÓÃpollʵÏÖselect  
¡£  
        I/O¶à·ת½ÓÔÚ4.2+BSDÖÐÊÇÓÃselectº¯ÊýÌṩµÄ¡£ËäÈ»¸Ãº¯ÊýÖ÷ÒªÓÃÓÚÖÕ  
¶ËI/OºÍÍøÂçI/O£¬µ«Ëü¶ÔÆäËüÃèÊö·ûͬÑùÊÇÆð×÷Óõġ£SVR3ÔÚÔö¼ÓÁ÷»úÖÆÊ±Ôö¼ÓÁË  
pollº¯Êý¡£µ«ÔÚSVR4֮ǰ£¬pollÖ»¶ÔÁ÷É豸Æð×÷Óá£SVR4Ö§³Ö¶ÔÈÎÒ»ÃèÊö·ûÆð×÷Óà 
µÄpoll¡£  
selectºÍpollµÄ¿ÉÖжÏÐÔ  
    ÖжϵÄϵͳµ÷ÓõÄ×Ô¶¯ÔÙÆð¶¯ÊÇÓÉ4.2+BSDÒý½øµÄ£¨10.5½Ú£©£¬µ«µ±Ê±select  
º¯ÊýÊDz»  
ÔÙÆð¶¯µÄ¡£ÕâÖÖÌØÐÔÑÓÐøµ½4.3+BSD£¬¼´Ê¹Ö¸¶¨ÁËSA_RESTARTÒ²ÊÇΪ´Ë¡£µ«ÊÇ£¬ÔÚ  
SVR4֮ϣ¬Èç¹ûÖ¸¶¨ÁËSA_RESTART£¬ÄÇôselectºÍpollÒ²ÊÇ×Ô¶¯ÔÙÆð¶¯µÄ¡£ÎªÁ˽«  
Èí¼þÒÆÖ²µ½SVR4ʱ×èÖ¹ÕâÒ»µã£¬Èç¹ûÐźſÉÄÜÖжÏselect»òpoll£¬Ôò×ÜÊÇʹÓÃsig  
nal_intrº¯Êý£¨³ÌÐò10.13£©¡£  
12.4.1 selectº¯Êý  
selectº¯ÊýʹÎÒÃÇÔÚSVR4ºÍ4.3+BSD֮ϿÉÒÔÖ´ÐÐI/O¶à·ת½Ó£¬´«ÏòselectµÄ²ÎÊý  
¸æËßϵͳºË£º  
1. ÎÒÃÇËù¹ØÐĵÄÃèÊö·û¡£  
2. ¶Ôÿ¸öÃèÊö·ûÎÒÃÇËù¹ØÐĵÄÌõ¼þ¡££¨ÎÒÃÇÊÇ·ñ¶ÁÒ»¸ö¸ø¶¨µÄÃèÊö·û£¿ÊÇ·ñÏëд  
Ò»¸ö¸ø¶¨µÄÃèÊö·û£¿ÊÇ·ñ¹ØÐÄÒ»¸öÃèÊö·ûµÄÒì³£Ìõ¼þ£¿£©  
3. Ï£ÍûµÈ´ý¶à³¤Ê±¼ä¡££¨¿ÉÒÔÓÀÔ¶µÈ´ý£¬µÈ´ýÒ»¸ö¹Ì¶¨Á¿Ê±¼ä£¬»òÍêÈ«²»µÈ´ý£©  
   
´Óselect·µ»ØÊ±£¬ÏµÍ³ºË¸æËßÎÒÃÇ£º  
1. ÒÑ×¼±¸ºÃµÄÃèÊö·ûµÄÊýÁ¿¡£  
2. ÄÄÒ»¸öÃèÊö·ûÒÑ×¼±¸ºÃ¶Á»òд¡¢»òÒì³£Ìõ¼þ¡£  
ʹÓÃÕâÖÖ·µ»ØÖµ£¬ÎÒÃǾͿɵ÷ÓÃÏàÓ¦µÄI/Oº¯Êý£¨Ò»°ãÊÇread»òwrite£©£¬²¢ÇÒÈ·Öª  
¸Ãº¯Êý²»»á×èÈû¡£  
_______________________________________________________________________  
_______  
#include <sys/types.h>    fd_setÊý¾ÝÀàÐÍ  
#include <sys/time.h>    timeval½á¹¹  
#include <unistd.h>    º¯ÊýÔ­ÐΠ 
int select (int maxfdp1,fd_set *readfds,fd_set *writefds,fd_set *except  
fds,  
struct timeval * tvptr);  
     ·µ»Ø£º×¼±¸¾ÍÐ÷µÄÃèÊö·ûÊý£¬Èô³¬Ê±Îª0£¬³ö´íΪ-1  
_______________________________________________________________________  
_______  
ÏÈ˵Ã÷×îºóÒ»¸ö²ÎÊý£¬ËüÖ¸¶¨Ô¸ÒâµÈ´ýµÄʱ¼ä¡£  
struct  timeval{  
    long  tv_sec;  /*Ãë*/  
    long  tv_usec; /*ÒÔ¼°Î¢Ãë*/  
}£»  
ÓÐÈýÖÖÇé¿ö£º  
tvptr= =NULL  
  ÓÀÔ¶µÈ´ý¡£Èç¹û²¶×½µ½Ò»¸öÐźÅÔòÖжϴËÎÞÏÞÆÚµÈ´ý¡£µ±ËùÖ¸¶¨µÄÃèÊö·ûÖеÄÒ»  
¸öÒÑ×¼±¸ºÃ»ò²¶×½µ½Ò»¸öÐźÅÔò·µ»Ø¡£Èç¹û²¶×½µ½Ò»¸öÐźţ¬Ôòselect·µ»Ø-1£¬  
errnoÉèÖÃΪEINTR¡£  
tvptr->tv_sec= =0 && tvptr->tv_usec= =0  
  ÍêÈ«²»µÈ´ý¡£²âÊÔËùÓÐÖ¸¶¨µÄÃèÊö·û²¢Á¢¼´·µ»Ø¡£ÕâÊǵõ½¶à¸öÃèÊö·ûµÄ״̬¶ø  
²»×èÈûselectº¯ÊýµÄÂÖѯ·½·¨¡£  
tvptr->tv_sec ! =0 | | tvptr->tv_usec! =0  
  µÈ´ýÖ¸¶¨µÄÃëÊýºÍ΢ÃëÊý¡£µ±Ö¸¶¨µÄÃèÊö·ûÖ®Ò»ÒÑ×¼±¸ºÃ£¬»òµ±Ö¸¶¨µÄʱ¼äÖµÒÑ  
¾­³¬¹ýʱÁ¢¼´·µ»Ø¡£Èç¹ûÔÚ³¬Ê±Ê±»¹Ã»ÓÐÒ»¸öÃèÊö·û×¼±¸ºÃ£¬Ôò·µ»ØÖµÊÇ0£¬£¨Èç  
¹ûϵͳ²»Ìṩ΢Ãë·Ö±æÂÊ£¬Ôòtvptr->tv_usecֵȡÕûµ½×î½üµÄÖ§³ÖÖµ¡££©ÓëµÚÒ»ÖÖ  
Çé¿öÒ»Ñù£¬ÕâÖֵȴý¿É±»²¶×½µ½µÄÐźÅÖжϡ£  
ÖмäÈý¸ö²ÎÊýreadfds,writefdsºÍexceptfdsÊÇÖ¸ÏòÃèÊö·û¼¯µÄÖ¸Õë¡£ÕâÈý¸öÃèÊö  
·û¼¯ËµÃ÷ÁËÎÒÃǹØÐĵĿɶÁ¡¢¿Éд»ò´¦ÓÚÒì³£Ìõ¼þµÄ¸÷¸öÃèÊö·ûÿ¸öÃèÊö·û¼¯´æ·Å  
ÔÚÒ»¸öfd_setÊý¾ÝÀàÐÍÖС£ÕâÖÖÊý¾ÝÀàÐ͵ÄʵÏÖ¿ÉÈçͼ12.13ÖÐËùʾ£¬ËüΪÿһ¿É  
ÄܵÄÃèÊö·û±£³ÖÁËһλ¡£  
ͼ12.13  ¶ÔselectÖ¸¶¨¶Á¡¢Ð´ºÍÒì³£Ìõ¼þÃèÊö·û  
¶Ôfg_setÊý¾ÝÀàÐÍ¿ÉÒÔ½øÐеĴ¦ÀíÊÇ£º(a)·ÖÅäÒ»¸öÕâÖÖÀàÐ͵ıäÁ¿£¬(b)½«ÕâÖÖÀà  
Ð͵ÄÒ»¸ö±äÁ¿¸³ÓëͬÀàÐ͵ÄÁíÒ»¸ö±äÁ¿£¬»ò(c)¶ÔÓÚÕâÖÖÀàÐ͵ıäÁ¿Ê¹ÓÃÏÂÁÐËĸö  
ºê£º  
ÒÔÏÂÁз½Ê½ËµÃ÷ÁËÒ»¸öÃèÊö·û¼¯ºó£¬  
    fd_set  rset;  
    int     fd;  
±ØÐëÓÃFD_ZEROÇå³ýÆäËùÓÐλ¡£  
    FD_ZERO (&rset);  
È»ºóÔÚÆäÖÐÉèÖÃÎÒÃǹØÐĵĸ÷λ£º  
    FD_SET (fd,&rset);  
    FD_SET (STDIN_FILENO,&rset);  
´Óselect·µ»ØÊ±£¬ÓÃFD_ISSET²âÊÔÔڸü¯ÖеÄÒ»¸ö¸ø¶¨Î»ÊÇ·ñÈÔ¾ÉÉèÖ㺠 
    if (FD_ISSET(fg,&rset)){  
    }¡­¡­  
selectµÄÖмäÈý¸ö²ÎÊýÖеÄÈÎÒ»¸ö£¨»òÈ«²¿£©¿ÉÒÔÊÇ¿ÕÖ¸Õ룬Õâ±íʾ¶ÔÏàÓ¦Ìõ¼þ²¢  
²»¹ØÐÄ¡£Èç¹ûËùÓÐÈý¸öÖ¸Õë¶¼ÊÇ¿ÕÖ¸Õ룬ÔòselectÌṩÁ˽Ïsleep¸ü¾«È·µÄ¼ÆÊ±Æ÷  
£¨»ØÒä10.19½Ú£¬sleepµÈ´ýÕûÊýÃ룬¶ø¶ÔÓÚselect£¬ÆäµÈ´ýµÄʱ¼ä¿ÉÒÔСÓÚ1Ã룻  
Æäʵ¼Ê·Ö±æÂÊÈ¡¾öÓÚϵͳʱÖÓ¡££©Á·Ï°12.6³öʾÁËÕâÑùÒ»¸öº¯Êý¡£  
selectµÚÒ»¸ö²ÎÊýmaxfdp1µÄÒâ˼ÊÇ"×î´ófd¼Ó1"£¨maxfd plux 1£©¡£ÔÚÈý¸öÃèÊö·û  
¼¯ÖÐÕÒ³ö×î¸ßÃèÊö·û±àºÅÖµ£¬È»ºó¼Ó1£¬Õâ¾ÍÊǵÚÒ»¸ö²ÎÊýÖµ¡£ÎÒÃÇÒ²¿É½«µÚÒ»¸ö  
²ÎÊýÉèÖÃΪFD_SETSIZE£¬ÕâÊÇÒ»¸ö<sys/types.h>Öеij£Êý£¬Ëü˵Ã÷ÁË×î´óµÄÃèÊö  
·ûÊý£¨¾­³£ÊÇ256»ò1024£©¡£µ«ÊǶԴó¶àÊýÓ¦ÓóÌÐò¶øÑÔ£¬´ËÖµÊÇÌ«´óÁË¡£È·Êµ£¬  
´ó¶àÊýÓ¦ÓóÌÐòÖ»Ó¦ÓÃ3-10¸öÃèÊö·û¡£Èç¹û½«µÚÈý¸ö²ÎÊýÉèÖÃΪ×î¸ßÃèÊö·û±àºÅÖµ  
¼Ó1£¬ÏµÍ³ºË¾ÍÖ»ÐèÔÚ´Ë·¶Î§ÄÚѰÕÒ´ò¿ªµÄ룬¶ø²»±ØÔÚÊý°ÙλµÄ´ó·¶Î§ÄÚËÑË÷¡£  
   
    ÀýÈ磬Èô±àдÏÂÁдúÂ룺  
fd_set readset,writeset;  
FD_ZERO(&readset);  
FD_ZERO(&writeset);  
FD_SET(0,&readset);  
FD_SET(3,&readset);  
FD_SET(1,&writeset);  
FD_SET(2,&writeset);  
Select (4,&readset,&writeset,NULL,NULL);  
È»ºó£¬Í¼12.14ÏÔʾÁËÕâÁ½¸öÃèÊö·û¼¯µÄÇé¿ö¡£  
ͼ12.14  selectµÄÑù±¾ÃèÊö·û¼¯  
ÒòΪÃèÊö·û±àºÅ´Ó0¿ªÊ¼£¬ËùÒÔÒªÔÚ×î´óÃèÊö·û±àºÅÖµÉϼÓ1¡£µÚÒ»¸ö²ÎÊýʵ¼ÊÉÏÊÇ  
Òª¼ì²éµÄÃèÊö·ûÊý¡££¨´ÓÃèÊö·û0¿ªÊ¼¡££©  
selectÓÐÈý¸ö¿ÉÄܵķµ»ØÖµ¡£  
1. ·µ»ØÖµ-1±íʾ³ö´í¡£ÕâÊÇ¿ÉÄÜ·¢ÉúµÄ£¬ÀýÈçÔÚËùÖ¸¶¨µÄÃèÊö·û¶¼Ã»ÓÐ×¼±¸ºÃʱ  
²¶×½µ½Ò»¸öÐźš£  
2. ·µ»ØÖµ0±íʾûÓÐÃèÊö·û×¼±¸ºÃ¡£ÈôÖ¸¶¨µÄÃèÊö·û¶¼Ã»ÓÐ×¼±¸ºÃ£¬¶øÇÒÖ¸¶¨µÄʱ  
¼äÒѾ­³¬¹ý£¬Ôò·¢ÉúÕâÖÖÇé¿ö¡£  
3. ·µ»ØÒ»¸öÕýÖµ£¬Ëü˵Ã÷ÁËÒѾ­×¼±¸ºÃµÄÃèÊö·ûÊý£¬ÔÚÕâÖÖÇé¿öÏ£¬ÔÚÈý¸öÃèÊö  
·û¼¯ÖÐÈԾɴò¿ªµÄλÊǶÔÓ¦ÓÚÒÑ×¼±¸ºÃµÄÃèÊö·ûλ¡£  
×¢Ò⣬³ý·Ç·µ»ØÕýÖµ£¬·ñÔòÔÚ·µ»Øºó¼ì²éÃèÊö·û¼¯ÊÇûÓÐÒâÒåµÄ¡£Èô²¶×½µ½ÐźŻò  
¼ÆÊ±Æ÷³¬Ê±£¬ÄÇôÃèÊö·û¼¯µÄÖµÊÇÈ¡¾öÓÚʵÏֵġ£È·Êµ£¬Èô¼ÆÊ±Æ÷³¬Ê±£¬4.3+BSD  
²¢²»¸Ä±äÃèÊö·û¼¯£¬¶øSVR4ÔòÇå³ýÃèÊö·û¼¯¡£  
ÔÚSVR4ºÍBSDµÄselectʵÏÖÖ®¼ä£¬ÓÐÁíһЩ²îÒì¡£BSDϵͳ×ÜÊÇ·µ»ØÔÚÿһ¸ö¼¯ÖÐ×¼  
±¸¾ÍÐ÷µÄÃèÊö·ûÊýÖ®ºÍ¡£ÈôÔÚÁ½¸ö¼¯ÖеÄͬһÃèÊö·ûÊÇ×¼±¸¾ÍÐ÷µÄ£¨ÀýÈ磬¶Á¼¯ºÍ  
д¼¯£©£¬Ôò¸ÃÃèÊö·û¼ÆÁ½´Î¡£²»ÐÒ£¬SVR4¸ü¸ÄÁËÕâÒ»µã£¬ÈôͬһÃèÊö·ûÔÚ¶à¸ö¼¯ÖР 
×¼±¸¾ÍÐ÷£¬¸ÃÃèÊö·ûÖ»¼ÆÒ»´Î¡£ÕâÔÙÒ»´ÎÏÔʾÁËÎÒÃǽ«»áÅöµ½µÄÎÊÌ⣬ֱÖÁPOSIX  
±ê×¼»¯ÁËselectÕâÑùµÄº¯Êý²ÅÄܽâ¾ö´ËÎÊÌâ¡£  
¶ÔÓÚ"×¼±¸ºÃ"µÄÒâ˼Ҫ×÷һЩ¸ü¾ßÌåµÄ˵Ã÷£º  
1. Èô¶Ô¶Á¼¯£¨readfds£©ÖеÄÒ»¸öÃèÊö·ûµÄread²»»á×èÈû£¬Ôò´ËÃèÊö·ûÊÇ×¼±¸ºÃµÄ  
¡£  
2. Èô¶Ôд¼¯£¨writefds£©ÖеÄÒ»¸öÃèÊö·ûµÄwrite²»»á×èÈû£¬Ôò´ËÃèÊö·ûÊÇ×¼±¸ºÃ  
µÄ¡£  
3. Èô¶ÔÒì³£Ìõ¼þ¼¯£¨exceptfds£©ÖеÄÒ»¸öÃèÊö·ûÓÐÒ»¸öÄ©¾öÒì³£Ìõ¼þ£¬Ôò´ËÃèÊö  
·ûÊÇ×¼±¸ºÃµÄ¡£ÏÖÔÚ£¬Òì³£Ìõ¼þ°üÀ¨£º(a)ÔÚÍøÂçÁ¬½ÓÉϵ½´ïÖ¸¶¨²¨ÌØÂÊÍâµÄÊý¾Ý  
£¬»òÕß(b)ÔÚ´¦ÓÚÊý¾Ý°ü·½Ê½µÄαÖÕ¶ËÉÏ·¢ÉúÁËijЩÌõ¼þ¡££¨Stevens[1990]µÄ15.  
10½ÚÖÐ˵Ã÷ÁËÕâÖÖÌõ¼þ¡££©  
Ó¦µ±Àí½âÒ»¸öÃèÊö·û×èÈûÓë·ñ²¢²»Ó°ÏìselectÊÇ·ñ×èÈû¡£Ò²¾ÍÊÇ˵£¬Èç¹ûÎÒÃÇÏ£Íû  
¶ÁÒ»¸ö·Ç×èÈûÃèÊö·û£¬²¢ÇÒÒÔ³¬Ê±ÖµÎª5Ãëµ÷ÓÃselect£¬Ôòselect×î¶à×èÈû5Ãë¡£Ïà  
ÀàËÆ£¬Èç¹ûÖ¸¶¨Ò»¸öÎÞÏ޵ij¬Ê±Öµ£¬Ôòselect×èÈûµ½¶Ô¸ÃÃèÊö·ûÊý¾Ý×¼±¸ºÃ£¬»ò²¶  
×½µ½Ò»¸öÐźš£  
Èç¹ûÔÚÒ»¸öÃèÊö·ûÉÏÅöµ½ÁËÎļþ½áÊø£¬ÔòselectÈÏΪ¸ÃÃèÊö·ûÊǿɶÁµÄ¡£È»ºóÎÒÃÇ  
µ÷ÓÃread£¬Ëü·µ»Ø0£¬ÕâÊÇUnixָʾµ½´ïÎļþ½áβ´¦µÄ·½·¨¡££¨ºÜ¶àÈË´íÎóµØÈÏΪ  
£¬µ±µ½´ïÎļþ½áβ´¦Ê±£¬select»áָʾһ¸öÒì³£Ìõ¼þ¡££©  
12.5.2 pollº¯Êý  
SVR4µÄpollº¯ÊýÀàËÆÓÚselect£¬µ«ÊÇÆäµ÷ÓÃÐÎʽÔòÓÐËù²»Í¬¡£ÎÒÃǽ«»á¿´µ½£¬pol  
lÓëÁ÷ϵͳ½ô½ôÏà¹Ø£¬ËäÈ»ÔÚSVR4ÖУ¬¿ÉÒÔ¶ÔÈÎÒ»ÃèÊö·û¶¼Ê¹Óøú¯Êý¡£  
_______________________________________________________________________  
______  
#include <stropts.h>  
#include <poll.h>  
int poll(struct pollfd fdarray[],unsigned long nfds,int timeout);  
·µ»Ø£º×¼±¸¾ÍÐ÷µÄÃèÊö·ûÊý£¬Èô³¬Ê±Îª0£¬³ö´íΪ-1  
_______________________________________________________________________  
______  
Óëselect²»Í¬£¬poll²»ÊÇΪÿ¸öÌõ¼þ¹¹ÔìÒ»¸öÃèÊö·û¼¯£¬¶øÊǹ¹ÔìÒ»¸öpollfd½á¹¹  
Êý×飬ÿ¸öÊý×éÔªËØÖ¸¶¨Ò»¸öÃèÊö·û±àºÅÒÔ¼°¶ÔÆäËù¹ØÐĵÄÌõ¼þ¡£  
Struct pollfd{  
int fd;     Òª¼ì²éµÄÎļþÃèÊö·û£¬Èô<0ÔòºöÂÔ  
short events;    ¶Ôfd¸ÐÐËȤµÄÎļþ  
short revents;    ¶Ôfd ÒÑ·¢ÉúµÄÎļþ  
};  
fdarrayÊý×éÖеÄÔªËØÊýÓÉnfds˵Ã÷¡£  
ÓÉÓÚijÖÖĩ֪µÄÔ­Òò£¬SVR3˵Ã÷nfdsµÄÀàÐÍΪunsigned long£¬ÕâËÆºõÊÇÌ«´óÁË¡£  
ÔÚSVR4ÊÖ²áÖУ¬ÔÚpollµÄÔ­ÐÍÖУ¬µÚ¶þ¸ö²ÎÊýµÄÊý¾ÝÀàÐÍΪsige_t£¬µ«ÔÚ<poll.h  
£¾°üº¬µÄʵ¼ÊÔ­ÐÍÖУ¬µÚ¶þ¸ö²ÎÊýµÄÊý¾ÝÀàÐÍÈÔ˵Ã÷Ϊunsigned long¡£  
SVR4µÄSVID[AT&T1989]˵Ã÷pollµÄµÚÒ»¸ö²ÎÊýÊÇ£ºstruct pollfd fdarray[ ],¶ø  
SVR4ÊÖ²áÒ³[AT&T 1990 d]Ôò˵Ã÷¸Ã²ÎÊýΪstruct pollfd *fdarray¡£ÔÚCÓïÑÔÖУ¬  
ÕâÁ½ÖÖ˵Ã÷Êǵȼ۵ġ£ÎÒÃÇʹÓõÚÒ»ÖÖ˵Ã÷ÒÔÖØÉêfdarrayÖ¸ÏòÒ»¸ö½á¹¹Êý×飬¶ø  
²»ÊÇÖ¸Ïòµ¥¸ö½á¹¹µÄÖ¸Õë¡£  
Ó¦½«events³ÉÔ±ÉèÖÃΪͼ12.15ÖÐËùʾֵµÄÒ»¸ö»ò¼¸¸ö¡£Í¨¹ýÕâЩֵ¸æËßϵͳºËÎÒ  
ÃǶԸÃÃèÊö·û¹ØÐĵÄÊÇʲô¡£ÔÚ·µ»ØÊ±£¬ÏµÍ³ºËÉèÖÃrevents³ÉÔ±£¬ÒÔ˵Ã÷¶Ô¸ÃÃè  
Êö·û·¢ÉúÁËʲôʼþ¡££¨×¢Ò⣬pollûÓиü¸Äevents³ÉÔ±£¬ÕâÓëselect²»Í¬£¬sel  
ectÐÞ¸ÄÆä²ÎÊýÒÔָʾÄÇÒ»¸öÃèÊö·ûÒÑ×¼±¸ºÃÁË¡££©  
ͼ12.15  pollµÄeventsºÍrevents±êÖ¾  
ͼ12.15ÖÐÍ·ËÄÐвâÊԿɶÁÐÔ£¬½Ó×ŵÄÈýÐвâÊÔ¿ÉдÐÔ£¬×îºóÈýÐÐÔòÊÇÒì³£Ìõ¼þ¡£  
×îºóÈýÐÐÊÇÓÉϵͳºËÔÚ·µ»ØÊ±ÉèÖõġ£¼´Ê¹ÔÚevents×Ö¶ÎÖÐûÓÐÖ¸¶¨ÕâÈý¸öÖµ£¬Èç  
¹ûÏàÓ¦Ìõ¼þ·¢Éú£¬ÔòÔÚreventsÖÐÒ²·µ»ØËüÃÇ¡£  
µ±Ò»¸öÃèÊö·û±»¹Ò¶Ïºó£¨POLLHUP£©£¬¾Í²»ÄÜÔÙдÏò¸ÃÃèÊö·û¡£µ«ÊÇÈÔ¿ÉÄÜ´Ó¸ÃÃè  
Êö·û¶ÁÈ¡µ½Êý¾Ý¡£  
pollµÄ×îºóÒ»¸ö²ÎÊý˵Ã÷ÎÒÃÇÏëÒªµÈ´ý¶àÉÙʱ¼ä¡£ÈçͬselectÒ»Ñù£¬ÓÐÈýÖÖ²»Í¬µÄ  
ÇéÐΣº  
   timeout= =INFTIM  
ÓÀÔ¶µÈ´ý¡£³£ÊýINFTIM¶¨ÒåÔÚ<stropts.h>,Æäֵͨ³£ÊÇ-1¡£µ±ËùÖ¸¶¨µÄÃèÊö·ûÖеĠ 
Ò»¸öÒÑ×¼±¸ºÃ£¬»ò²¶×½µ½Ò»¸öÐźÅÔò·µ»Ø¡£Èç¹û²¶×½µ½Ò»¸öÐźţ¬Ôòpoll·µ»Ø-1£¬  
erronÉèÖÃΪEINTR¡£  
   timeout= =0  
²»µÈ´ý¡£²âÊÔËùÓÐÃèÊö·û²¢Á¢¼´·µ»Ø¡£ÕâÊǵõ½ºÜ¶à¸öÃèÊö·ûµÄ״̬¶ø²»×èÈûpol  
lº¯ÊýµÄÂÖѯ·½·¨¡£  
   timeout>0  
µÈ´ýtimeoutºÁÃë¡£µ±Ö¸¶¨µÄÃèÊö·ûÖ®Ò»ÒÑ×¼±¸ºÃ£¬»òÖ¸¶¨µÄʱ¼äÖµÒѳ¬¹ýʱÁ¢¼´  
·µ»Ø¡£Èç¹ûÒѳ¬Ê±µ«ÊÇ»¹Ã»ÓÐÒ»¸öÃèÊö·û×¼±¸ºÃ£¬Ôò·µ»ØÖµÊÇ0¡££¨Èç¹ûϵͳ²»Ìá  
¹©ºÁÃë·Ö±æÂÊ£¬ÔòtimeoutֵȡÕûµ½×î½üµÄÖ§³ÖÖµ¡££©  
Ó¦µ±Àí½âÔÚÎļþ½áÊøºÍ¹Ò¶ÏÖ®¼äµÄÇø±ð¡£Èç¹ûÕýÔÚÖÕ¶ËÊäÈëÊý¾Ý£¬²¢¼üÈëÎļþ½áÊø  
×Ö·û£¬POLLIN±»´ò¿ª£¬ÓÚÊǾͿɶÁÎļþ½áÊøÖ¸Ê¾£¨read·µ»Ø0£©¡£POLLHUPÔÚreven  
tsÖÐûÓдò¿ª¡£Èç¹û¶Áµ÷ÖÆ½âµ÷Æ÷£¬²¢Çҵ绰ÏßÒѹҶϣ¬ÔòÔÚreventsÖн«½Óµ½PO  
LLHUP¡£  
ÓëselectÒ»Ñù£¬²»ÂÛÒ»¸öÃèÊö·ûÊÇ·ñ×èÈû£¬²¢²»Ó°ÏìpollÊÇ·ñ×èÈû¡£  
12.6 Òì²½I/O  
    Ê¹ÓÃselectºÍpoll¿ÉÒÔʵÏÖÒì²½I/O¡£¹ØÓÚÃèÊö·ûµÄ״̬,ϵͳ²¢²»Ö÷¶¯¸æËßÎÒ  
ÃÇÈκÎÐÅÏ¢,ÎÒÃÇÐèÒªÖ÷¶¯µØ½øÐвéѯ(µ÷ÓÃselect»òpoll)¡£ÈçÔÚµÚÊ®ÕÂÖÐËùÊö£¬  
ÐźŻú¹¹ÌṩһÖÖÒì²½ÐÎʽµÄ֪ͨijÖÖʼþÒÑ·¢ÉúµÄ·½·¨¡£SVR4ºÍ4.3+BSDÌṩÁË  
ʹÓÃÒ»¸öÐźţ¨ÔÚSVR4ÖÐÊÇSIGPOLL£¬ÔÚ4.3+BSDÖÐÊÇSIGIO£©µÄÒì²½I/O·½·¨£¬¸ÃÐÅ  
ºÅ֪ͨ½ø³Ì£¬¶Ôij¸öÃèÊö·ûËù¹ØÐĵÄij¸öʼþÒѾ­·¢Éú¡£  
ÎÒÃÇÒÑÁ˽⵽ÔÚSVR4ÖÐselectºÍpoll¶ÔÈÎÒ»ÃèÊö·û¶¼Äܹ¤×÷¡£ÔÚ4BSDÖУ¬select¶Ô  
ÈÎÒ»ÃèÊö·û¶¼Äܹ¤×÷¡£µ«ÊǹØÓÚÒì²½I/OÈ´ÓÐÏÞÖÆ¡£ÔÚSVR4ÖУ¬Òì²½I/OÖ»¶ÔÉ豸Æð  
×÷Óá£ÔÚ4.3+BSDÖУ¬Òì²½I/OÖ»¶ÔÖն˺ÍÍøÂçÆð×÷Óᣠ 
SVR4ºÍ4.3+BSDËùÖ§³ÖµÄÒì²½I/OµÄÒ»¸öÏÞÖÆÊÇÿ¸ö½ø³ÌÖ»ÓÐÒ»¸öÐźš£Èç¹ûÒª¶Ô¼¸  
¸öÃèÊö·û½øÐÐÒì²½I/O£¬ÄÇôÔÚ½ø³Ì½ÓÊÕµ½¸ÃÐźÅʱ²¢²»ÖªµÀÕâÒ»ÐźŶÔÓ¦ÓÚÄÄÒ»  
¸öÃèÊö·û¡£  
12.6.1 ÏµÍ³VµÚËÄ·¢Ðа栠
ÔÚϵͳVÖУ¬Òì²½I/OÊÇÁ÷ϵͳµÄÒ»²¿·Ö¡£ËüÖ»¶ÔÁ÷É豸Æð×÷Óá£SVR4Òì²½I/OÐźŠ 
ÊÇSIGPOLL¡£  
ΪÁ˶ÔÒ»¸öÁ÷É豸Æð¶¯Òì²½I/O£¬ÐèÒªµ÷ÓÃioctl£¬¶øÆäµÚ¶þ¸ö²ÎÊý£¨request£©Ôò  
ΪI_SETSIG¡£µÚÈý¸ö²ÎÊýÔòÊÇÓÉͼ12.6ÖÐÒ»¸ö»ò¶à¸ö³£Êý¹¹³ÉµÄÕûÐÍÖµ¡£ÕâЩ³£Êý  
ÔÚ<stropts.h>Öж¨Òå¡£  
ͼ12.16  ²úÉúSIGPOLLÐźŵÄÌõ¼þ  
ͼ12.16ÖР "Òѵ½´ï"µÄÒâ˼ÊÇ"Òѵ½´ïÁ÷Ê׵ĶÁ¶ÓÁÐ"¡£  
³ýÁ˵÷ÓÃioctlÒÔ˵Ã÷²úÉúSIGPOLLÐźŵÄÌõ¼þ£¬Ò²Ó¦Îª¸ÃÐźŽ¨Á¢Ò»¸öÐźŴ¦Àí³Ì  
Ðò¡£»ØÒäͼ10.1£¬¶ÔÓÚSIGPOLLµÄĬÈ϶¯×÷ÊÇÖÕÖ¹¸Ã½ø³Ì£¬ËùÒÔÓ¦ÔÚµ÷ÓÃioctl֮ǰ  
½¨Á¢ÐźŴ¦Àí³ÌÐò¡£  
12.6.2 4.3+BSD  
ÔÚ4.3+BSDÖУ¬Òì²½I/OÊÇÁ½¸öÐźÅSIGIOºÍSIGURGµÄ×éºÏ¡£Ç°ÕßÊÇͨÓÃÒì²½I/OÐźŠ 
£¬ºóÕßÔòÖ»±»ÓÃÀ´Í¨Öª½ø³ÌÔÚÍøÂçÁ¬½ÓÉϵ½´ïÁ˷ǹ涨²¨ÌØÂʵÄÊý¾Ý¡£  
ΪÁ˽ÓÊÕSIGIOÐźţ¬ÐèÖ´ÐÐÏÂÁÐÈý²½£º  
1. µ÷ÓÃsignal»òsigactionΪ¸ÃÐźŽ¨Á¢Ò»¸öÐźŴ¦Àí³ÌÐò¡£  
2. ÒÔÃüÁîF_SETOWN£¨3.13½Ú£©µ÷ÓÃfcntlÀ´ÉèÖýø³ÌIDºÍ½ø³Ì×éID£¬ËüÃǽ«½ÓÊÕ¶Ô  
ÓÚ¸ÃÃèÊö·ûµÄÐźš£  
3. ÒÔÃüÁîF_SETFLµ÷ÓÃfcntlÉèÖÃO_ASYNC״̬±êÖ¾£¬Ê¹ÔÚ¸ÃÃèÊö·ûÉÏ¿ÉÒÔ½øÐÐÒì²½  
I/O¡£  
eadvºÍwitrevº¯Êý  
readvºÍwritevº¯ÊýʹÎÒÃÇÔÚÒ»¸öº¯Êýµ÷ÓÃÖпÉÒÔ¶Á¡¢Ð´¶à¸ö·ÇÁ¬Ðø»º´æ¡£ÓÐʱҲ  
½«ÕâÁ½¸öº¯Êý³ÆÎªÉ¢²¼¶Á/¾Û¼¯Ð´¡£  
_______________________________________________________________________  
______  
#include <sys/types.h>  
#include <sys/uio.h>  
ssize_t readv(int filedes,const struct iovec iov[],int iovcnt);  
ssize_t writev(int filedes,const struct iovec iov[],int iovcnt);  
Á½¸öº¯Êý·µ»Ø£ºÒѶÁ¡¢Ð´µÄ×Ö½ÚÊý£¬³ö´íΪ-1  
_______________________________________________________________________  
______  
ÕâÁ½¸öº¯ÊýµÄµÚ¶þ¸ö²ÎÊýÊÇ£ºÖ¸Ïòiovec½á¹¹Êý×éµÄÒ»¸öÖ¸Õ룺  
Struct iovec {  
Void iov_base;   »º´æÆðʼµØÖ·  
Size_t iov_len;    »º´æ´óС  
};  
iovÊý×éÖеÄÔªËØÊýÓÉiovcnt˵Ã÷¡£  
ÕâÁ½¸öº¯ÊýÆðʼÓÚ4.2BSD£¬ÏÖÔÚSVR4Ò²ÌṩËüÃÇ¡£  
ÕâÁ½¸öº¯ÊýµÄÔ­ÐÍÒÔ¼°ËüÃÇʹÓõÄiovec½á¹¹ÔÚ¸÷ÖÖÓйØÎÄÏ××ÊÁÏÖж¼ÂÔÓвî±ð¡£  
Èç¹ûÎÒÃDZȽÏËüÃÇÔÚSVR4³ÌÐòÔ±ÊÖ²á[AT&T1990e]¡¢SVR4µÄSVID[AT&T1989]£¬ÒÔ¼°  
SVR4ºÍ4.3+BSD<sys/uio.h>Í·ÎļþÖе͍Ò壬ÄÇôËüÃÇÖ®¼ä¶¼Óвî±ð£¡Æä²¿·ÖÔ­Òò  
ÊÇ£ºSVIDºÍSVR4³ÌÐòÔ±ÊÖ²á¶ÔÓ¦ÓÚ1988 POSIX.1±ê×¼£¬¶ø·Ç1990°æ¡£ÉÏÃæÊ¾³öµÄÔ­  
Ðͺͽṹ¶¨Òå¶ÔÓ¦ÓÚreadºÍwriteµÄPOSIX.1¶¨Ò壺»º´æµØÖ·ÊÇvoid£¬»º´æ³¤¶ÈÊÇs  
ize_t,·µ»ØÖµÊÇssize_t¡£  
×¢Ò⣬readvµÄµÚ¶þ¸ö²ÎÊý±»ËµÃ÷Ϊconst¡£ÕâÈ¡×Ô4.3+BSDÖиú¯ÊýµÄÔ­ÐÍ£¬ÔÚSV  
R4µÄÊÖ²áÖÐÔòÎÞ´ËÐÞÊδʡ£¶ÔÓÚreadv´ËÐÞÊδÊÊÇÓÐЧµÄ£¬ÒòΪ²¢²»ÐÞ¸Äiovec½á¹¹  
µÄ³ÉÔ±-´Ëº¯ÊýÖ»ÐÞ¸Äiov_baseËùÖ¸ÏòµÄ´æ´¢Çø¡£  
4. 3BSDºÍSVR4½«iovcntÏÞÖÆÎª16¡£4.3+BSD¶¨ÒåÁ˳£ÊýUIO_MAXIOV£¬µ±Ç°ÆäÖµ¶¨Òå  
Ϊ1024¡£SVIDÉù³Æ³£ÊýIOV_MAXÌṩϵͳVÏÞÖÆ£¬µ«ÊÇËüûÓб»¶¨ÒåÔÚÈÎÒ»SVRÍ·ÎÄ  
¼þÖС£  
ͼ12.17ÏÔʾÁËreadvºÍwritevµÄ²ÎÊýºÍiovec½á¹¹Ö®¼äµÄ¹ØÏµ¡£writevÒÔ˳Ðòiov[  
0],iov[1]ÖÁiov[iovcnt-1] ´Ó»º´æÖоۼ¯Êä³öÊý¾Ý¡£writer·µ»ØÊä³öµÄ×Ö½Ú×ÜÊý  
£¬ËüÓ¦µÈÓÚËùÓлº´æ³¤¶ÈÖ®ºÍ  
readvÔò½«¶ÁÈëµÄÊý¾Ý°´ÉÏÊöͬÑù˳ÐòÉ¢²¼µ½»º´æÖС£readv×ÜÊÇÏÈÌîÂúÒ»¸ö»º´æ£¬  
È»ºóÔÙÌîдÏÂÒ»¸ö¡£readv·µ»Ø¶ÁµÃµÄ×Ü×Ö½ÚÊý¡£Èç¹ûÓöµ½Îļþ½á⣬ÒÑÎÞÊý¾Ý¿É  
¶Á£¬Ôò·µ»Ø0¡£  
ͼ12.7  readvºÍwritevµÄiovec½á¹¹  
ʵÀý  
    ÔÚ16.7½ÚµÄ_db-writeidxº¯ÊýÖУ¬Ð轫Á½¸ö»º´æÁ¬ÐøµØÐ´µ½Ò»¸öÎļþÖС£µÚ¶þ  
¸ö»º´æÊǵ÷ÓÃÕß´«µÝ¹ýÀ´µÄÒ»¸ö²ÎÊý£¬µÚÒ»¸ö»º´æÊÇÎÒÃÇ´´½¨µÄ£¬Ëü°üº¬Á˵ڶþ¸ö  
»º´æµÄ³¤¶È£¬ÎļþÖÐÆäËüÐÅÏ¢µÄÎ»ÒÆÁ¿¡£ÓÐÈýÖÖ·½·¨¿ÉÒÔʵÏÖÕâÒ»ÒªÇ󣺠 
1. µ÷ÓÃwrtieÁ½´Î,Ò»´ÎÒ»¸ö»º´æ¡£  
2. ·ÖÅäÒ»¸ö´óµ½×ãÒÔ°üº¬Á½¸ö»º´æµÄлº´æ¡£½«Á½¸ö»º´æµÄÄÚÈݸ´ÖƵ½Ð»º´æÖР 
¡£È»ºó¶Ô¸Ã»º´æµ÷ÓÃwrtieÒ»´Î¡£  
3. µ÷ÓÃwritevÊä³öÁ½»º´æ¡£  
    ÔÚ16.7½ÚÖÐʹÓÃÁËwrite¡£½«ËüÓëÁíÍâÁ½ÖÖ·½·¨½øÐбȽϣ¬¶ÔÎÒÃǺÜÓÐÆô·¢¡£  
ͼ12.18ÏÔʾÁËÉÏÃæËùÊöÈýÖÖ·½·¨µÄ½á¹û¡£  
ͼ12.18  ±È½ÏwritevºÍÆäËü¼¼ÊõËùµÃµÄʱ¼ä½á¹û  
    ËùÓõIJâÊÔ³ÌÐòÊä³ö100×Ö½ÚµÄÍ·Îļþ£¬½Ó×ÅÓÖÊä³ö200×Ö½ÚµÄÊý¾Ý¡£ÕâÑù×ö1  
0£¬000´Î£¬²úÉúÁËÒ»¸ö°ÙÍò×Ö½ÚµÄÎļþ¡£¸Ã³ÌÐò°´ÉÏÃæËùÊö·½·¨Ð´ÁË3¸ö°æ±¾£¬¸÷  
ÔËÐÐÒ»´Î£¬  
²âµÃËüÃǸ÷ʹÓõÄÓû§cpuʱ¼ä¡¢ÏµÍ³cpuʱ¼äºÍʱÖÓʱ¼ä¡£ËüÃǵĵ¥Î»¶¼ÊÇÃë¡£  
ÈçͬÎÒÃÇËùÁϵ½µÄ£¬µ÷ÓÃwrite¶ø´Î£¬Óëµ÷ÓÃwriteÒ»´Î£¬»òµ÷ÓÃwritev  Ò»´ÎÏà±È  
£¬ÏµÍ³Ê±¼ä×ÜÊÇÁ½±¶£¬ÕâÓëͼ3.1ÖеĽá¹ûÏàÀàËÆ¡£  
½Ó×Å£¬Òª×¢ÒâµÄÊÇ£ºcpuʱ¼ä£¨Óû§¼Óϵͳ£©ÔÚ»º´æ¸´ÖÆ£¬È»ºóÓÃÒ»¸öwrite£¬»òÓà 
Ò»¸öwritevµÄÇé¿ö¼¸ºõÏàµÈ¡£Á½ÕßµÄÇø±ðÖ»ÊÇÔÚÓû§¿Õ¼äÏÂÖ´ÐеÄʱ¼ä¶àÒ»µã£¨w  
ritev£©¡£ÔÚSPARCϵͳÉÏÔËÐÐʱ£¬ÆäºÍÊÇ4.9Ã룬¶øÔÚ80386ϵͳÏÂÔËÐÐÔòÊÇÔ¼8.0  
Ãë¡£  
¶ÔÓÚͼ12.8×îºóҪ˵Ã÷µÄÊÇ  ÔÚSPARCÉϱ¾²âÊÔËùÓõÄʱÖÓʱ¼äÖ÷ÒªÓÃÓÚ´ÅÅÌÊý¾Ý  
´«ÊäÉÏ£¬¶øÔÚ386ϵͳÉÏÔòÖ÷ÒªÓÃÓÚcpu·½Ãæ¡£  
12.8 readnºÍwritenº¯Êý  
ijЩÉ豸,ÌØ±ðÊÇÖÕ¶Ë¡¢ÍøÂçºÍSVR4µÄÁ÷É豸ÓÐÏÂÁÐÁ½ÖÖÐÔÖÊ£º  
1. Ò»´Î¶Á²Ù×÷Ëù·µ»ØµÄÊý¾Ý¿ÉÄÜÉÙÓÚËùÒªÇóµÄÊý¾Ý£¬¼´Ê¹»¹Ã»´ïµ½Îļþβ¶Ë¡£Õâ  
²»ÊÇÒ»¸ö´íÎó£¬ÎÒÃÇÓ¦µ±¼ÌÐø¶Á¸ÃÉ豸¡£  
2. Ò»´Îд²Ù×÷µÄ·µ»ØÖµÒ²¿ÉÄÜÉÙÓÚÖ¸¶¨Êä³öµÄ×Ö½ÚÊý¡£Õâ¿ÉÄÜÊÇÓÉÈô¸ÉÒòËØÔì³É  
µÄ£¬ÀýÈ磬ÏÂÓÎÄ£¿éµÄÁ÷Á¿¿ØÖÆÏÞÖÆ¡£ÕâÒ²²»ÊÇ´íÎó£¬ÎÒÃÇÓ¦µ±¼ÌÐøÐ´ÓàϵÄÊý¾Ý  
ÖÁ¸ÃÉ豸¡££¨Í¨³££¬Ö»ÓжԷÇ×èÈûÃèÊö·û£¬»ò²¶×½µ½Ò»¸öÐźÅʱ£¬²Å·¢ÉúÕâÖÖwir  
te·µ»Ø¡££©  
ÔÚ¶Á¡¢Ð´ÅÌÎļþʱûÓÐÕâÁ½ÖÖÐÔÖÊ¡£  
ÔÚµÚÊ®°ËÕ£¬ÎÒÃǽ«Ð´Ò»¸öÁ÷¹ÜµÀ£¨»ùÓÚSVR4Á÷»òBSDUnixµÄÓòÌ×½Ó¿Ú£©£¬ÔÚÆäÖР 
ÐèÒª¿¼ÂÇÕâÐ©ÌØÐÔ¡£ÏÂÃæÁ½¸öº¯ÊýreadnºÍwritenµÄ¹¦ÄÜÊǶÁ¡¢Ð´Ö¸¶¨µÄN×Ö½ÚÊý¾Ý  
£¬²¢´¦Àí·µ»ØÖµÐ¡ÓÚÒªÇóÖµµÄÇé¿ö¡£ÕâÁ½¸öº¯ÊýÖ»Êǰ´Ðè¶à´Îµ÷ÓÃread£¬writeÖ±  
ÖÁ¶Á¡¢Ð´ÁËN×Ö½ÚÊý¾Ý¡£  
_______________________________________________________________________  
______  
#include "ourhdr.h"  
ssize_t readn(int filedes,void *buff,size_t nbytes);  
ssize_t writen(int filedes,void *buff,size_t nbytes);  
  Á½¸öº¯Êý·µ»Ø£ºÒѶÁ¡¢Ð´×Ö½ÚÊý£¬³ö´íΪ-1  
_______________________________________________________________________  
______  
ÔÚÒª½«Êý¾Ýдµ½ÉÏÃæÌáµ½µÄÉ豸ÉÏʱ£¬¾Í¿Éµ÷ÓÃwriten£¬µ«Êǽöµ±ÏȾÍÖªµÀÒª½ÓÊÕ  
Êý¾ÝµÄÊýÁ¿Ê±£¬²Åµ÷ÓÃreadn£¨Í¨³££¬ÎÒÃǵ÷ÓÃreadÒÔ½ÓÊÕÀ´×ÔÕâЩÉ豸µÄÊý¾Ý£©  
¡£  
    ³ÌÐò12.12£¬12.13ÊÇwritenºÍreadnµÄÒ»ÖÖʵÏÖ¡£  
#include "ourhdr.h"  
ssize_t      /* Write "n" bytes to a descriptor. */  
writen(int fd, const void *vptr, size_t n)  
{  
 size_t  nleft, nwritten;  
 const char *ptr;  
 ptr = vptr; /* can't do pointer arithmetic on void* */  
 nleft = n;  
 while (nleft > 0) {  
  if ( (nwritten = write(fd, ptr, nleft)) <= 0)  
   return(nwritten);  /* error */  
  nleft -= nwritten;  
  ptr   += nwritten;  
 }  
 return(n);  
}  
³ÌÐò12.12  writeº¯Êý  
#include "ourhdr.h"  
ssize_t      /* Read "n" bytes from a descriptor. */  
readn(int fd, void *vptr, size_t n)  
{  
 size_t nleft, nread;  
 char *ptr;  
 ptr = vptr;  
 nleft = n;  
 while (nleft > 0) {  
  if ( (nread = read(fd, ptr, nleft)) < 0)  
   return(nread);  /* error, return < 0 */  
  else if (nread == 0)  
   break;    /* EOF */  
  nleft -= nread;  
  ptr   += nread;  
 }  
 return(n - nleft);  /* return >= 0 */  
}  
³ÌÐò12.13  readnº¯Êý  
12.9 ´æ´¢Ó³ÕÕI/O  
´æ´¢Ó³ÕÕI/Oʹһ¸ö´ÅÅÌÎļþÓë´æ´¢¿Õ¼äÖеÄÒ»¸ö»º´æÏàÓ³ÕÕ¡£ÓÚÊǵ±´Ó»º´æÖÐÈ¡  
Êý¾Ý£¬¾ÍÏ൱ÓÚ¶ÁÎļþÖеÄÏàÓ¦×Ö½Ú¡£ÓëÆäÀàËÆ£¬½«Êý¾Ý´æÈ뻺´æ£¬ÔòÏàÓ¦×ֽھ͠ 
×Ô¶¯µØÐ´ÈëÎļþ¡£ÕâÑù£¬¾ÍʹÎÒÃÇÔÚ²»Ê¹ÓÃread¡¢writeÇé¿öÏ¿ÉÒÔÖ´ÐÐI/O¡£  
ΪÁËʹÓÃÕâÖÖ¹¦ÄÜ£¬Ó¦Ê×ÏȸæËßϵͳºË½«Ò»¸ö¸ø¶¨µÄÎļþÓ³ÕÕµ½Ò»¸ö´æ´¢ÇøÓòÖС£  
ÕâÊÇÓÉmmapº¯ÊýʵÏֵġ£  
_______________________________________________________________________  
______  
#include <sys/types.h>  
#include <sys/mman.h>  
caddr_t mmap(caddr_t addr, size_t lan,int prot,int flag,  
  int filedes,off_t off);  
  ·µ»Ø£ºÈô³É¹¦ÎªÓ³ÕÕÇøµÄÆðʼµØÖ·£¬³ö´íΪ-1  
_______________________________________________________________________  
______  
´æ´¢Ó³ÕÕI/OÒѾ­ÓÃÁ˺ܶàÄê¡£4.1BSD£¨1981£©ÒÔÆävreadºÍvwriteº¯ÊýÌṩÁËÒ»ÖÖ  
²»Í¬ÐÎʽµÄ´æ´¢Ó³ÕÕI/O¡£4.2BSDûÓÐʹÓÃÕâÁ½¸öº¯Êý£¬¶øÊÇÏ£ÍûʹÓÃmmapº¯Êý¡£  
µ«ÊÇÓÉÓÚLeffler et al[1989]2.5½ÚÖÐ˵Ã÷µÄÀíÓÉ£¬4.2BSDʵ¼Ê²¢Ã»Óаüº¬mmapº¯  
Êý¡£Gingell,MoranºÍShannon[1987]˵Ã÷ÁËmmapµÄÒ»ÖÖʵÏÖ¡£ÏÖÔÚ£¬SVR4ºÍ4.3+B  
SD¶¼Ö§³Ömmapº¯Êý¡£  
Êý¾ÝÀàÐÍcaddr_tͨ³£¶¨ÒåΪchar *¡£addr²ÎÊýÓÃÓÚÖ¸¶¨Ó³ÕÕ´æ´¢ÇøµÄÆðʼµØÖ·¡£  
ͨ³£½«ÆäÉèÖÃΪ0£¬Õâ±íʾÓÉϵͳѡÔñ¸ÃÓ³ÕÕÇøµÄÆðʼµØÖ·¡£´Ëº¯ÊýµÄ·µ»ØµØÖ·ÊÇ  
£º¸ÃÓ³ÕÕÇøµÄÆðʼµØÖ·¡£  
filedesÖ¸¶¨Òª±»Ó³ÕÕÎļþµÄÃèÊö·û¡£ÔÚÓ³ÕÕ¸ÃÎļþµ½Ò»¸öµØÖ·¿Õ¼ä֮ǰ£¬ÏÈÒª´ò  
¿ª¸ÃÎļþ¡£lenÊÇÓ³ÕÕµÄ×Ö½ÚÊý£»offÊÇÒªÓ³ÕÕ×Ö½ÚÔÚÎļþÖÐµÄÆðÊ¼Î»ÒÆÁ¿£¨ÏÂÃæ½«  
˵Ã÷¶ÔoffÖµÓÐijЩÏÞÖÆ¡££©  
ÔÚ˵Ã÷ÆäÓà²ÎÊý֮ǰ£¬ÏÈ¿´Ò»Ï´洢ӳÕÕÎļþµÄ»ù±¾Çé¿ö¡£Í¼12.19ÏÔʾÁËÒ»¸ö´æ  
´¢Ó³ÕÕÎļþ¡££¨»ØÒäͼ7.3Öнø³Ì´æ´¢¿Õ¼äµÄµäÐͰ²ÅÅÇé¿ö£©¡£  
ͼ12.19  ´æ´¢Ó³ÕÕÎļþµÄÀý×Ó  
ÔÚ´ËͼÖУ¬"ÆðʼµØÖ·"ÊÇmmapµÄ·µ»ØÖµ¡£ÔÚͼÖУ¬Ó³ÕÕ´æ´¢ÇøÎ»ÓڶѺÍÕ»Ö®¼ä£ºÕâ  
ÊôÓÚʵÏÖϸ½Ú£¬¸÷ÖÖʵÏÖÖ®¼ä¿ÉÄܲ»Í¬¡£  
proc²ÎÊý˵Ã÷Ó³ÕÕ´æ´¢ÇøµÄ±£»¤ÒªÇó¡£  
¶ÔÓÚÓ³ÕÕ´æ´¢ÇøËùÖ¸¶¨µÄ±£»¤ÒªÇóÏàÓ¦ÓëÏàÓ¦ÎļþµÄopen·½·¨ÏàÓ¦×Ô¼º¡£ÀýÈ磬  
Èô¸ÃÎļþÊÇÖ»¶Á´ò¿ªµÄ£¬ÄÇô¶ÔÓ³ÕÕ´æ´¢Çø¾Í²»ÄÜÖ¸¶¨PROT_WRITE¡£  
ͼ12.20  ´æ´¢Ó³ÕÕÇøµÄ±£»¤  
flag²ÎÊýÓ°ÏìÓ³ÕÕ´æ´¢ÇøµÄ¶àÖÖÊôÐÔ£º  
MAP_FIXED    ·µ»ØÖµ±ØÐëµÈÓÚaddr¡£ÒòΪÕâ²»ÀûÓÚ¿ÉÒÆÖ²ÐÔ£¬ËùÒÔ²»¹ÄÀøÊ¹Óôˠ 
±êÖ¾¡£Èç¹ûĩָ¶¨´Ë±êÖ¾£¬¶øÇÒaddr·Ç0£¬ÔòϵͳºËÖ»°ÑaddrÊÓΪºÎ´¦ÉèÖÃÓ³ÕÕÇø  
µÄÒ»ÖÖ½¨Òé¡£  
MAP_SHARED  ÕâÒ»±ê־˵Ã÷Á˱¾½ø³Ì¶ÔÓ³ÕÕÇøËù½øÐеĴ洢²Ù×÷µÄÅäÖô˱ê־˵Ã÷  
´æ´¢²Ù×÷ÐÞ¸ÄÓ³ÕÕÎļþ-Ò²¾ÍÊÇ£¬´æ´¢²Ù×÷Ï൱ÓÚ¶Ô¸ÃÎļþµÄwrite¡£±ØÐëÖ¸¶¨±¾±ê  
Ö¾»òÏÂÒ»¸ö±êÖ¾£¨MAP_PRIVATE£©¡£  
MAP_PRIVATE  ±¾±ê־˵Ã÷£¬¶ÔÓ³ÕÕÇøµÄ´æ´¢²Ù×÷µ¼Ö´´½¨¸ÃÓ³ÕÕÎļþµÄÒ»¸ö¸±±¾  
¡£ËùÓкóÀ´¶Ô¸ÃÓ³ÕÕÇøµÄ´æ·Ã¶¼ÊÇ´æ·Ã¸Ã¸±±¾£¬¶ø²»ÊÇԭʼÎļþ¡£  
4.3+BSD»¹ÓÐÁíÍâһЩMAP_XXX±êÖ¾Öµ£¬ËüÃÇÊÇÕâÖÖÏÖʵËùÌØÓеġ£ÏêϸÇé¿öÇë²Î¼û  
4.3+BSD mmap£¨2£©ÊÖ²áÒ³¡£  
offºÍaddrµÄÖµ£¨Èç¹ûÖ¸¶¨ÁËMAP_FIXED£©Í¨³£Ó¦µ±ÊÇϵͳÐé´æÒ³³¤¶ÈµÄ±¶Êý¡£ÔÚS  
VRÖУ¬Ðé´æÒ³³¤¶È¿ÉÓÃsysconfº¯Êý£¨²ÎÊýSC_PAGSIZE£¬2.5.4½Ú£©µÃµ½¡£ÔÚ4.3+B  
SD֮ϣ¬Ò³³¤¶ÈÓÉÍ·Îļþ<sys/param.h>Öеij£ÊýNBPG¶¨Òå¡£ÒòΪoffºÍaddr³£³£Ö¸  
¶¨Îª0£¬ËùÒÔÕâÖÖÒªÇóÒ»°ã²¢²»ÊÇÎÊÌâ¡£  
ÓëÓ³ÕÕ´æ´¢ÇøÏà¹ØÓÐÁ½¸öÐźţºSIGSEGVºÍSIGBUS¡£ÐźÅSIGSEGVͨ³£ÓÃÓÚָʾ½ø³Ì  
ÊÔͼ´æÈ¡Ëü²»ÄÜ´æÈ¡µÄ´æ´¢Çø¡£Èç¹û½ø³ÌÆóͼ´æÊý¾Ýµ½ÓÃmmapÖ¸¶¨ÎªÖ»¶ÁµÄÓ³ÕÕ´æ  
´¢Çø£¬ÄÇôҲ²úÉú´ËÐźš£Èç¹û´æÈ¡Ó³ÕÕÇøµÄij¸ö²¿·Ö£¬¶øÔÚ´æÈ¡Ê±ÕâÒ»²¿·ÖÒѲ»  
´æÔÚ£¬Ôò²úÉúSIGBUSÐźš£ÀýÈ磬ÓÃÎļþ³¤¶ÈÓ³ÕÕÒ»¸öÎļþ£¬µ«ÔÚ´æ·Ã¸ÃÓ³ÕÕÇøÖ®  
ǰ¡£ÁíÒ»¸ö½ø³ÌÒѽ«¸ÃÎļþ½Ø¶Ì¡£´Ëʱ£¬Èç¹û½ø³ÌÆóͼ´æÈ¡¶ÔÓ¦ÓÚ¸ÃÎļþβ¶Ë²¿·Ö  
µÄÓ³ÕÕÇø£¬Ôò½ÓÊÕµ½SIGBUSÐźš£  
ÔÚforkÖ®ºó£¬×Ó½ø³Ì¼Ì³Ð´æ´¢Ó³ÕÕÇø£¬£¨ÒòΪ×Ó½ø³Ì¸´ÖƸ¸½ø³ÌµØÖ·¿Õ¼ä£¬¶ø´æ´¢  
Ó³ÕÕÇøÊǸõØÖ·¿Õ¼äÖеÄÒ»²¿·Ö¡££©µ«ÊÇÓÉÓÚͬÑùµÄÀíÓÉ£¬execºóµÄгÌÐòÔò²»¼Ì  
³Ð´Ë´æ´¢Ó³ÕÕÇø¡£  
½ø³ÌÖÕֹʱ£¬»òµ÷ÓÃÁËmunmapÖ®ºó£¬´æ´¢Ó³ÕÕÇø¾Í±»×Ô¶¯È¥³ý¡£¹Ø±ÕÎļþÃèÊö·ûf  
iledes²¢²»½â³ýÓ³ÕÕÇø¡£  
_______________________________________________________________________  
______  
#include <sys/types.h>  
#include <sys/mman.h>  
int munmap(caddr_t addr,size_t len);  
         ·µ»Ø£ºÈô³É¹¦Îª0£¬³ö´íΪ-1  
_______________________________________________________________________  
______  
munmap ²¢²»Ó°Ïì±»Ó³ÕյĶÔÏó-Ò²¾ÍÊÇ£¬µ÷ÓÃmunmap²¢²»Ê¹Ó³ÕÕÇøµÄÄÚÈÝдµ½´ÅÅÌ  
ÎļþÉÏ¡£¶ÔÓÚMAP_SHAREDÇøµÄ´ÅÅÌÎļþµÄ¸üУ¬ÔÚдµ½´æ´¢Ó³ÕÕÇøÊ±°´ÏµÍ³ºËÐé´æ  
Ëã·¨×Ô¶¯½øÐС£  
ijЩϵͳÌṩÁËÒ»¸ömsyncº¯Êý£¬ËüÀàËÆÓÚfsyncº¯Êý£¨4.24½Ú£©£¬µ«¶Ô´æ´¢Ó³ÕÕÇø  
Æð×÷Óᣠ 
ʵÀý  
ϵͳ12.14Óô洢ӳÕÕI/O¸´ÖÆÒ»¸öÎļþ£¨ÀàËÆÓÚcp(1)ÃüÁ¡£Ê×ÏÈ´ò¿ª±»¸´Öƺ͠ 
¸´ÖƵ½µÄÁ½¸öÎļþ£¬È»ºóµ÷ÓÃfstatµÃµ½ÊäÈëÎļþµÄ³¤¶È¡£ÎÒÃÇÔÚµ÷ÓÃmmapºÍÉèÖà 
Êä³öÎļþ³¤¶Èʱ¶¼ÐèʹÓÃÊäÈëÎļþ³¤¶È¡£µ÷ÓÃlseek£¬È»ºóдһ¸ö×Ö½ÚÒÔÉèÖÃÊä³ö  
ÎļþµÄ³¤¶È¡£Èç¹û²»ÉèÖÃÊä³öÎļþµÄ³¤¶È£¬Ôò¶ÔÊä³öÎļþµ÷ÓÃmmapÒ²ÊÇ¿ÉÒԵ쬵«  
ÊǶÔÏà¹Ø´æ´¢ÇøµÄµÚÒ»´Î´æ·Ã»á²úÉúSIGBUS¡£ÎÒÃÇÒ²¿ÉʹÓÃftruncateº¯ÊýÀ´ÉèÖà 
Êä³öÎļþµÄ³¤¶È£¬µ«ÊDz¢·ÇËùÓÐϵͳ¶¼Ö§³Ö¸Ãº¯ÊýÀ©³äÎļþ³¤¶È£¨¼û4.13½Ú£©¡£  
È»ºó¶Ôÿ¸öÎļþµ÷ÓÃmmap£¬½«ÎļþÓ³ÕÕµ½´æ´¢Çø£¬×îºóµ÷ÓÃmemcpy½«ÊäÈ뻺´æµÄÄÚ  
Èݸ´ÖƵ½Êä³ö»º´æ¡£ÔÚ´ÓÊäÈ뻺´æ£¨src£©È¡Êý¾Ý×Ö½Úʱ£¬ÏµÍ³ºË×Ô¶¯¶ÁÊäÈëÎļþ  
£»ÔÚ½«Êý¾Ý´æÈëÊä³ö»º´æ£¨dst£©Ê±£¬ÏµÍ³ºË¾Í×Ô¶¯½«Êý¾Ýдµ½Êä³öÎļþÖС£  
½«´æ´¢ÇøÓ³ÕÕ¸´ÖÆÓëÓÃread£¬write½øÐеĸ´ÖÆ£¨»º´æ³¤¶ÈΪ8192£©Ïà±È½Ï£¬µÃµ½  
ͼ12.21ÖÐËùʾµÄ½á¹û¡£  
ͼ12.21  read/writeÓëmmap/memcpy±È½ÏµÄʱ¼ä½á¹û  
ʱ¼äµ¥Î»ÊÇÃ룬±»¸´ÖÆÎļþµÄ³¤¶ÈÊÇÔ¼3°ÙÍò×Ö½Ú¡£  
¶ÔÓÚSPARC£¬Á½ÖÖ¸´ÖÆ·½Ê½µÄCPUʱ¼ä£¨Óû§+ϵͳ£©Ïàͬ£¬¶¼ÊÇ2.6Ãë¡££¨ÕâÓëͼ1  
2.18ÖÐwritevµÄÇé¿öÀàËÆ£©¡£¶ÔÓÚ386£¬mmap/memcpy·½Ê½´óÔ¼ÊÇread/write·½Ê½µÄ  
Ò»°ë¡£  
ʹÓÃmmapʱ£¬¶ÔÓÚSPARCºÍ386ϵͳʱ¼ä¶¼¼õÉÙµÄÔ­ÒòÊÇ£ºÏµÍ³ºËÖ±½Ó¶ÔÓ³ÕÕ´æ´¢»º  
´æ×÷I/O²Ù×÷¡£¶øÔÚread/write·½Ê½£¬ÏµÍ³ºËÒªÔÚÓû§»º´æºÍËü×Ô¼ºµÄ»º´æÖ®¼ä½ø  
Ðи´ÖÆ£¬È»ºóÓÃÆä»º´æ×÷I/O¡£  
ÁíÒ»¸öҪעÒâµÄÊÇ£¬Ê¹ÓÃmmap/memcpyʱ£¬Ê±ÖÓʱ¼äÖÁÉÙ¼õ°ë¡£  
½«Ò»¸öÆÕͨÎļþ¸´ÖƵ½ÁíÒ»¸öÆÕͨÎļþÖÐʱ£¬´æ´¢Ó³ÕÕI/O±È½Ï¿ì¡£µ«ÊÇÓÐһЩÏÞ  
ÖÆ¡£²»ÄÜÓÃÆäÔÚijЩÉ豸֮¼ä£¨ÀýÈçÍøÂçÉ豸»òÖÕ¶ËÉ豸£©½øÐи´ÖƶԱ»¸´ÖƵÄÎÄ  
¼þ½øÐÐÓ³ÕÕºó£¬Ò²Òª×¢Òâ¸ÃÎļþµÄ³¤¶ÈÊÇ·ñ¸Ä±ä¡£¾¡¹ÜÈç´Ë£¬ÓкܶàÓ¦ÓóÌÐò»á´Ó  
´æ´¢Ó³ÕÕI/OµÃµ½ºÃ´¦£¬ÒòΪËü´¦ÀíµÄÊÇ´æ´¢¿Õ¼ä¶ø²»ÊǶÁ¡¢Ð´Ò»¸öÎļþ£¬ËùÒÔ³£  
³£¿ÉÒÔ¼ò»¯Ëã·¨¡£Óô洢ӳÕÕI/O¿ÉÒÔµÃÒæµÄÒ»¸öÀý×ÓÊÇÖ¡»º´æÉ豸£¬¸ÃÉ豸ÒýÓà 
Ò»¸öλһӳÕÕÏÔʾ¡£  
Krieger,StummºÍUnrau[1992]ÖеĵÚÎåÕÂ˵Ã÷ÁËÒ»¸öʹÓô洢ӳÕÕI/OµÄ±ê×¼I/O¿â  
¡£  
ÔÚ14.9½Ú½«·µ»Øµ½´æ´¢Ó³ÕÕI/O£¬ÆäÖÐÓÐÒ»¸öÀý×Ó£¬ËµÃ÷ÔÚSVR4ºÍ4.3+BSDÖ®ÏÂÈçºÎ  
ʹÓô洢ӳÕÕI/OÔÚÓйؽø³Ì¼äÌṩ¹²Ïí´æ´¢Çø¡£  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <sys/mman.h> /* mmap() */  
#include <fcntl.h>  
#include "ourhdr.h"  
#ifndef MAP_FILE /* 44BSD defines this & requires it to mmap files */  
#define MAP_FILE 0 /* to compile under systems other than 44BSD */  
#endif  
int  
main(int argc, char *argv[])  
{  
 int   fdin, fdout;  
 char  *src, *dst;  
 struct stat statbuf;  
 if (argc != 3)  
  err_quit("usage: a.out <fromfile> <tofile>");  
 if ( (fdin = open(argv[1], O_RDONLY)) < 0)  
  err_sys("can't open %s for reading", argv[1]);  
 if ( (fdout = open(argv[2], O_RDWR | O_CREAT | O_TRUNC,  
            FILE_MODE)) < 0)  
  err_sys("can't creat %s for writing", argv[1]);  
 if (fstat(fdin, &statbuf) < 0) /* need size of input file */  
  err_sys("fstat error");  
   /* set size of output file */  
 if (lseek(fdout, statbuf.st_size - 1, SEEK_SET) == -1)  
  err_sys("lseek error");  
 if (write(fdout, "", 1) != 1)  
  err_sys("write error");  
 if ( (src = mmap(0, statbuf.st_size, PROT_READ,  
      MAP_FILE | MAP_SHARED, fdin, 0)) == (caddr_t) -1)  
  err_sys("mmap error for input");  
 if ( (dst = mmap(0, statbuf.st_size, PROT_READ | PROT_WRITE,  
      MAP_FILE | MAP_SHARED, fdout, 0)) == (caddr_t) -1)  
  err_sys("mmap error for output");  
 memcpy(dst, src, statbuf.st_size); /* does the file copy */  
 exit(0);  
}  
³ÌÐò12.14  Óô洢ӳÕÕI/O¸´ÖÆÎļþ  
   
12.10 ÕªÒª  
±¾ÕÂ˵Ã÷Á˺ܶà¸ß¼¶I/O¹¦ÄÜ£¬ÆäÖдó¶àÊý½«ÔÚºóÃæÕ½ڵÄÀý×ÓÖÐʹÓ㺠 
l ·Ç×èÈûI/O-·¢Ò»¸öI/O²Ù×÷£¬²»Ê¹Æä×èÈû£»  
l ¼ÇÂ¼Ëø£»  
l ÏµÍ³VÁ÷»úÖÆ£»  
l I/O¶à·ת½Ó-selectºÍpollº¯Êý£»  
l readvºÍwritevº¯Êý£»  
l ´æ´¢¿Õ¼äÓ³ÕÕI/O£¨mmap£©;  
ϰÌ⣺  
12.1 É¾³ý³ÌÐò12.6forÑ­»·Öеڶþ´Îµ÷ÓÃwriteµÄÓï¾äºó½á¹ûÈçºÎ£¬ÎªÊ²Ã´£¿  
12.2 ²é¿´ÏµÍ³ÖÐ<sys/types.h>Í·Îļþ£¬²¢Ñо¿selectºÍËĸöFD_ºêµÄʵÏÖ¡£  
12.3 <sys/types.h>Í·ÎļþÖж¨ÒåÁËfd_setÊý¾ÝÀàÐÍ¿ÉÒÔ´¦ÀíµÄ×î´óÃèÊö·ûÊý£¬¼Ù  
ÉèÎÒÃÇÐèÒª½«ÃèÊö·ûÊýÔö¼Óµ½2048£¬¸ÃÈçºÎʵÏÖ£¿  
12.4 ±È½Ï´¦ÀíÐźÅÁ¿¼¯µÄº¯Êý£¨10.11½Ú£©ºÍfd_setÃèÊö·û¼¯µÄº¯Êý£¬²¢Ñо¿ÔÚÄã  
µÄϵͳÉÏËüÃǵÄʵÏÖ·½·¨¡£  
12.5 getmsg¿ÉÒÔ·µ»Ø¶àÉÙÖÖ²»Í¬µÄÐÅÏ¢£¿  
12.6 ÓÃselect»òpollʵÏÖÒ»¸öÓësleepÀàËÆµÄº¯Êýsleep_us£¬²»Í¬Ö®´¦ÊÇÒªµÈ´ýÖ¸  
¶¨µÄÈô¸É΢Ãî¡£±È½ÏÕâ¸öº¯ÊýºÍBSDÖеÄusleepº¯Êý¡£  
12.7 ÊÇ·ñ¿ÉÒÔÀûÓý¨ÒéÐÔËøÀ´ÊµÏÖ³ÌÐò10.17Öеĺ¯ÊýTELL_WAIT¡¢TELL_PARENT¡¢  
TELL_CHILD¡¢WAIT_PARENTÒÔ¼°WAIT_CHILD£¿Èç¹û¿ÉÒÔ£¬±àдÕâЩº¯Êý²¢²âÊÔÆä¹¦  
 
ÄÜ¡£  
12.8 ÓÃselect»òpoll²âÊԹܵÀµÄÈÝÁ¿¡£½«ÆäÖµÓëµÚ¶þÕµÄPIPE_BUFµÄÖµ±È½Ï¡£  
12.9 ÔËÐгÌÐò12.14¿½±´Ò»¸öÎļþ£¬¼ì²éÊäÈëÎļþµÄÉÏÒ»´Î·ÃÎÊʱ¼äÊÇ·ñ¸Ä±äÁË£¿  
   
12.10 ÔÚ³ÌÐò12.14ÖÐmmapºóµ÷ÓÃclose¹Ø±ÕÊäÈëÎļþ£¬ÒÔÑéÖ¤¹Ø±ÕÃèÊö·û²»»áʹÄÚ  
´æÓ³ÕÕI/OʧЧ¡£  
   
   
   
--  
 
 
-- 
¡ù À´Ô´:¡¤BBS Ë®Ä¾Ç廪վ smth.org¡¤[FROM: 202.38.248.38] 

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