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

·¢ÐÅÈË: forest (ÇẮС¥~~С¼ªÆª), ÐÅÇø: Unix        
±ê  Ìâ: [×ªÔØ]unix»·¾³¸ß¼¶±à³Ì-14 (×ªÔØ) 
·¢ÐÅÕ¾: BBS Ë®Ä¾Ç廪վ (Fri Mar 17 17:52:18 2000) 
 
¡¾ ÒÔÏÂÎÄ×Ö×ªÔØ×Ô Linux ÌÖÂÛÇø ¡¿ 
¡¾ Ô­ÎÄÓÉ SuperSB Ëù·¢±í ¡¿ 
 
 
 
·¢ÐÅÈË: taosm (128+64-->cool), ÐÅÇø: unix  
±ê  Ìâ: unix»·¾³¸ß¼¶±à³Ì--µÚ14Õ ½ø³Ì¼äͨÐÅ  
·¢ÐÅÕ¾: Î÷Ê®°ËBBS (Sat Mar 11 13:57:20 2000), ×ªÐÅ  
   
   
µÚÊ®ËÄÕ£»  ½ø³Ì¼äͨÐÅ  
14.1 ½éÉÜ  
ÔÚµÚ°ËÕÂÖУ¬ÎÒÃÇ˵Ã÷Á˽ø³Ì¿ØÖÆÔ­Óï²¢ÇÒ¹Û²ìÁËÈçºÎµ÷Óöà¸ö½ø³Ì¡£µ«ÊÇÕâЩ½ø  
³ÌÖ®¼ä½»»»ÐÅÏ¢µÄΨһ·½·¨ÊǾ­ÓÉfork»òexec´«ËÍ´ò¿ªÎļþ£¬»òͨ¹ýÎļþϵͳ¡£ÏÖ  
ÔÚ£¬ÎÒÃÇ˵Ã÷½ø³ÌÖ®¼äÏ໥ͨÐŵįäËü¼¼Êõ-IPC£¨interprocess communication£©  
¡£  
Unix IPCÒѾ­ÊǶøÇÒ¼ÌÐøÊǸ÷ÖÖ½ø³ÌͨÐÅ·½Ê½µÄͳ³Æ£¬ÆäÖм«ÉÙÄÜÔÚËùÓÐUnixµÄʵ  
ÏÖÖнøÐÐÒÆÖ²¡£Í¼14.1ÕªÒªÁгöÁ˲»Í¬ÊµÏÖËùÖ§³ÖµÄ²»Í¬ÐÎʽµÄIPC¡£  
ͼ14.1  UNIX  IPC  ÕªÒª  
ÕýÈçÉÏͼËùʾ£¬²»¹ÜÄÄÒ»ÖÖUnixʵÏÖ£¬ÎÒÃǶ¼¿ÉÒÀ¿¿µÄΨһһÖÖIPCÊǰëË«¹¤µÄ¹Ü  
µÀ£¨pipes£©¡£Í¼ÖÐǰ7ÖÖIPCͨ³£ÏÞÓÚͬһ̨Ö÷»úµÄ¸÷¸ö½ø³Ì¼äµÄIPC¡£×îºó¶þÖÖ£»  
Ì×½Ó¿ÚºÍÁ÷£¬ÊÇÖ§³Ö²»Í¬Ö÷»úÉϸ÷¸ö½ø³Ì¼äIPC¡££¨¹ØÓÚÍøÂçIPCµÄÏêϸÇé¿ö£¬Çë²Î  
¼ûStevens[1990]¡££©ËäÈ»ÖмäÈýÖÖÐÎʽµÄIPC£¨ÏûÏ¢¶ÓÁС¢ÐźÅÁ¿ÒÔ¼°¹²Ïí´æ´¢Æ÷  
£©ÔÚͼÖÐ˵Ã÷ΪֻÊܵ½ÏµÍ³VµÄÖ§³Ö£¬µ«ÊÇÔÚ´ó¶àÊýÖÆÔìÉÌËùÖ§³ÖµÄ£¬´Ó±´¿ËÀ³Un  
ixµ¼³öµÄUnixϵͳÖУ¨ÀýÈ磬SunOSÒÔ¼°Ultrix£©£¬ÒѾ­Ìí¼ÓÁËÕâÈýÖÖÐÎʽµÄIPC¡£  
   
        ¼¸¸öPosixС×éÕýÔÚ¶ÔIPC½øÐй¤×÷£¬µ«ÊÇ×îºó½á¹û»¹²»ºÜÇå³þ£¬ÔÚ1994Äê  
ÉõÖÁ  
        ¸ü³ÙÒ»µãÓëIPCÓйصÄPosix¿ÉÄÜ»¹²»»áÖÆ¶¨³öÀ´¡£  
ÎÒÃÇÒѽ«ÓëIPCÓйصÄÌÖÂÛ·Ö³ÉÁ½Õ¡£ÔÚ±¾ÕÂÖУ¬ÎÒÃÇÌÖÂÛ¾­µäµÄIPC£»¹ÜµÀ¡¢FIF  
O¡¢ÏûÏ¢¶ÓÁС¢ÐźÅÁ¿ÒÔ¼°¹²Ïí´æ´¢Æ÷¡£ÔÚÏÂÒ»ÕÂÖУ¬ÎÒÃǽ«¹Û²ìSVR4ºÍ4.3+BSD¹²  
֧ͬ³ÖµÄIPCµÄijЩ¸ß¼¶ÌØÕ÷£¬°üÀ¨£»Á÷¹ÜµÀºÍÃüÃûµÄÁ÷¹ÜµÀ£¬ÒÔ¼°ÓÃÕâЩ¸ü¸ß¼¶  
ÐÎʽIPC£¬ÎÒÃÇ¿ÉÒÔ×öµÄһЩÊÂÇé¡£  
14.2 ¹ÜµÀ  
¹ÜµÀÊÇUnix IPCµÄ×îÀÏÐÎʽ£¬²¢ÇÒËùÓÐUnixϵͳ¶¼Ìṩ´ËÖÖͨÐÅ»úÖÆ£¬¹ÜµÀÓÐÁ½ÖÖ  
ÏÞÖÆ£»  
1. ËüÃÇÊǰëË«¹¤µÄ¡£Êý¾ÝÖ»ÔÚÒ»¸ö·½ÏòÁ÷¶¯¡£  
2. ËüÃÇÖ»ÄÜÔÚ¾ßÓй«¹²×æÏȵĽø³ÌÖ®¼äʹÓá£Í¨³££¬Ò»¸ö¹ÜµÀÓÉÒ»¸ö½ø³Ì´´½¨£¬  
È»ºó¸Ã½ø³Ìµ÷ÓÃfork£¬´Ëºó¸¸¡¢×Ó½ø³ÌÖ®¼ä¾Í¿ÉÓ¦ÓøùܵÀ¡£  
ÎÒÃǽ«»á¿´µ½Á÷¹ÜµÀ£¨15.2½Ú£©Ã»ÓеÚÒ»ÖÖÏÞÖÆ£¬FIFO£¨14.5½Ú£©ºÍÃüÃûÁ÷¹ÜµÀ£¨  
15.5½Ú£©ÔòûÓеڶþÖÖÏÞÖÆ¡£¾¡¹ÜÓÐÕâÁ½ÖÖÏÞÖÆ£¬°ëË«¹¤¹ÜµÀÈÔÊÇ×î³£ÓõÄIPCÐΠ 
ʽ¡£  
    ¹ÜµÀÊÇÓɵ÷ÓÃpipeº¯Êý¶ø´´½¨µÄ¡£  
        #include  <unistd.h>  
        int  pipe(int filedes[2]) ;  
·µ»Ø£ºÈô³É¹¦Îª0£¬³ö´íΪ-1  
¾­ÓɲÎÊýfiledes·µ»ØÁ½¸öÎļþÃèÊö·û£»filedes[0]ÊÇΪ¶Á¶ø´ò¿ª£¬filedes[1]ÊÇ  
Ϊд¶ø´ò¿ªµÄ¡£filedes[1]µÄÊä³öÊÇfiledes[0]µÄÊäÈë¡£  
ÓÐÁ½ÖÖ·½·¨À´Ãè»­Ò»¸ö¹ÜµÀ£¬Èçͼ14.2ÖÐËùʾ¡£×ó°ëͼÏÔʾÁ˹ܵÀµÄÁ½¶ËÔÚÒ»¸ö½ø  
ÉõÖÁ  
        ¸ü³ÙÒ»µãÓëIPCÓйصÄPosix¿ÉÄÜ»¹²»»áÖÆ¶¨³öÀ´¡£  
ÎÒÃÇÒѽ«ÓëIPCÓйصÄÌÖÂÛ·Ö³ÉÁ½Õ¡£ÔÚ±¾ÕÂÖУ¬ÎÒÃÇÌÖÂÛ¾­µäµÄIPC£»¹ÜµÀ¡¢FIF  
O¡¢ÏûÏ¢¶ÓÁС¢ÐźÅÁ¿ÒÔ¼°¹²Ïí´æ´¢Æ÷¡£ÔÚÏÂÒ»ÕÂÖУ¬ÎÒÃǽ«¹Û²ìSVR4ºÍ4.3+BSD¹²  
֧ͬ³ÖµÄIPCµÄijЩ¸ß¼¶ÌØÕ÷£¬°üÀ¨£»Á÷¹ÜµÀºÍÃüÃûµÄÁ÷¹ÜµÀ£¬ÒÔ¼°ÓÃÕâЩ¸ü¸ß¼¶  
ÐÎʽIPC£¬ÎÒÃÇ¿ÉÒÔ×öµÄһЩÊÂÇé¡£  
14.2 ¹ÜµÀ  
¹ÜµÀÊÇUnix IPCµÄ×îÀÏÐÎʽ£¬²¢ÇÒËùÓÐUnixϵͳ¶¼Ìṩ´ËÖÖͨÐÅ»úÖÆ£¬¹ÜµÀÓÐÁ½ÖÖ  
ÏÞÖÆ£»  
1. ËüÃÇÊǰëË«¹¤µÄ¡£Êý¾ÝÖ»ÔÚÒ»¸ö·½ÏòÁ÷¶¯¡£  
2. ËüÃÇÖ»ÄÜÔÚ¾ßÓй«¹²×æÏȵĽø³ÌÖ®¼äʹÓá£Í¨³££¬Ò»¸ö¹ÜµÀÓÉÒ»¸ö½ø³Ì´´½¨£¬  
È»ºó¸Ã½ø³Ìµ÷ÓÃfork£¬´Ëºó¸¸¡¢×Ó½ø³ÌÖ®¼ä¾Í¿ÉÓ¦ÓøùܵÀ¡£  
ÎÒÃǽ«»á¿´µ½Á÷¹ÜµÀ£¨15.2½Ú£©Ã»ÓеÚÒ»ÖÖÏÞÖÆ£¬FIFO£¨14.5½Ú£©ºÍÃüÃûÁ÷¹ÜµÀ£¨  
15.5½Ú£©ÔòûÓеڶþÖÖÏÞÖÆ¡£¾¡¹ÜÓÐÕâÁ½ÖÖÏÞÖÆ£¬°ëË«¹¤¹ÜµÀÈÔÊÇ×î³£ÓõÄIPCÐΠ 
ʽ¡£  
    ¹ÜµÀÊÇÓɵ÷ÓÃpipeº¯Êý¶ø´´½¨µÄ¡£  
        #include  <unistd.h>  
        int  pipe(int filedes[2]) ;  
·µ»Ø£ºÈô³É¹¦Îª0£¬³ö´íΪ-1  
¾­ÓɲÎÊýfiledes·µ»ØÁ½¸öÎļþÃèÊö·û£»filedes[0]ÊÇΪ¶Á¶ø´ò¿ª£¬filedes[1]ÊÇ  
Ϊд¶ø´ò¿ªµÄ¡£filedes[1]µÄÊä³öÊÇfiledes[0]µÄÊäÈë¡£  
ÓÐÁ½ÖÖ·½·¨À´Ãè»­Ò»¸ö¹ÜµÀ£¬Èçͼ14.2ÖÐËùʾ¡£×ó°ëͼÏÔʾÁ˹ܵÀµÄÁ½¶ËÔÚÒ»¸ö½ø  
ͼ14.4  ´Ó¸¸½ø³Ìµ½×Ó½ø³ÌµÄ¹ÜµÀ  
¶ÔÓÚ´Ó×Ó½ø³Ìµ½¸¸½ø³ÌµÄ¹ÜµÀ£¬¸¸½ø³Ì¹Ø±Õ fd[1]£¬×Ó½ø³Ì¹Ø±Õfd[0]¡£  
µ±¹ÜµÀµÄÒ»¶Ë±»¹Ø±Õºó£¬ÏÂÁй涨Æð×÷Óã»  
1. µ±¶ÁÒ»¸öд¶ËÒѱ»¹Ø±ÕµÄ¹ÜµÀʱ£¬ÔÚËùÓÐÊý¾Ý¶¼±»¶ÁÈ¡ºó£¬read·µ»Ø0£¬ÒÔָʾ  
´ïµ½ÁËÎļþ½áÊø´¦¡££¨´Ó¼¼Êõ·½Ã濼ÂÇ£¬ÔڹܵÀµÄд¶Ë»¹Óнø³Ìʱ£¬¾Í²»»á²úÉúÎÄ  
¼þµÄ½áÊø¡£¿ÉÒÔ¸´ÖÆÒ»¸ö¹ÜµÀµÄÃèÊö·û£¬Ê¹µÃÓжà¸ö½ø³Ì¾ßÓÐд´ò¿ªÎļþÃèÊö·û¡£  
µ«ÊÇ£¬Í¨³£Ò»¸ö¹ÜµÀÖ»ÓÐÒ»¸ö¶Á½ø³Ì£¬Ò»¸öд½ø³Ì¡£ÔÚÏÂÒ»½Ú½éÉÜFIFOʱ£¬ÎÒÃǻᠠ
¿´µ½¶ÔÓÚÒ»¸öµ¥Ò»µÄFIFO³£³£Óжà¸öд½ø³Ì£©¡£  
2. Èç¹ûдһ¸ö¶Á¶ËÒѱ»¹Ø±ÕµÄ¹ÜµÀ£¬Ôò²úÉúÐźÅSIGPIPE¡£Èç¹ûºöÂÔ¸ÃÐźŻòÕß²¶  
×½¸ÃÐźŲ¢´ÓÆä´¦Àí³ÌÐò·µ»Ø£¬ÔòWrite³ö´í·µ»Ø£¬errnoÉèÖÃΪEPIPE¡£  
ÔÚд¹ÜµÀʱ£¬³£ÊýPIPE_BUF¹æ¶¨Á˺ËÖйܵÀ»º´æÆ÷µÄ´óС¡£Èç¹û¶Ô¹ÜµÀ½øÐÐwrite  
µ÷Ó㬶øÇÒÒªÇóдµÄ×Ö½ÚÊýСÓÚµÈÓÚPIPE_BUF£¬Ôò´Ë²Ù×÷²»»áÓëÆäËü½ø³Ì¶Ôͬһ¹Ü  
µÀ£¨»òFIFO£©µÄwrite²Ù×÷´©²å½øÐС£µ«ÊÇ£¬ÈôÓжà¸ö½ø³Ìͬʱдһ¸ö¹ÜµÀ£¨»òFI  
FO£©£¬¶øÇÒij¸ö»òijЩ½ø³ÌÒªÇóдµÄ×Ö½ÚÊý³¬¹ýPIPE_BUF×Ö½ÚÊý£¬ÔòÊý¾Ý¿ÉÄÜ»áÓë  
ÆäËüд²Ù×÷µÄÊý¾ÝÏà´©²å¡£  
ʵÀý  
    ³ÌÐò14.1Öд´½¨ÁËÒ»¸ö´Ó¸¸½ø³Ìµ½×Ó½ø³ÌµÄ¹ÜµÀ£¬²¢ÇÒ¸¸½ø³Ì¾­ÓɸùܵÀÏò×Ó  
½ø³Ì´«ËÍÊý¾Ý¡£  
#include        "ourhdr.h"  
int  
main(void)  
{  
        int             n, fd[2];  
        pid_t   pid;  
        char    line[MAXLINE];  
        if (pipe(fd) < 0)  
                err_sys("pipe error");  
        if ( (pid = fork()) < 0)  
                err_sys("fork error");  
        else if (pid > 0) {             /* parent */  
                close(fd[0]);  
                write(fd[1], "hello world\n", 12);  
        } else {                                /* child */  
                close(fd[1]);  
                n = read(fd[0], line, MAXLINE);  
                write(STDOUT_FILENO, line, n);  
        }  
        exit(0);  
}  
³ÌÐò14.1  ¾­ÓɹܵÀ¸¸½ø³ÌÏò×Ó½ø³Ì´«ËÍÊý¾Ý  
ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÎÒÃÇÖ±½Ó¶Ô¹ÜµÀÃèÊö·ûµ÷ÓÃreadºÍwrite¡£¸üΪÓÐÒæµÄÊǽ«¹ÜµÀ  
ÃèÊö·û¸´ÖÆÎª±ê×¼ÊäÈëºÍ±ê×¼Êä³ö¡£ÔÚ´ËÖ®ºóͨ³£×Ó½ø³Ìµ÷ÓÃexec£¬Ö´ÐÐÁíÒ»µÀ³Ì  
Ðò£¬¿ª´Ó±ê×¼ÊäÈ루ÒÑ´´½¨µÄ¹ÜµÀ£©»ò½«Êý¾ÝдÖÁÆä±ê×¼Êä³ö£¨¹ÜµÀ£©¡£  
ʵÀý  
ÈÃÎÒÃDZàдһµÀ³ÌÐò£¬Æä¹¦ÄÜÊÇÿ´ÎÒ»Ò³ÏÔʾÒѲúÉúµÄÊä³ö¡£ÒѾ­ÓкܶàUnix¹«Óà 
³ÌÐò¾ßÓзÖÒ³¹¦ÄÜ£¬Òò´ËÎÒÃÇÎÞÐèÔÙ¹¹ÔìÒ»¸öеķÖÒ³³ÌÐò£¬¶øÊǵ÷ÓÃÓû§×îϲ°®  
µÄ·ÖÒ³³ÌÐò¡£ÎªÁ˱ÜÃâÏȽ«ËùÓÐÊý¾Ýдµ½Ò»¸öÁÙʱÎļþÖУ¬È»ºóÔÙµ÷ÓÃϵͳÖÐÓйؠ 
³ÌÐòÏÔʾ¸ÃÎļþ£¬ÎÒÃÇÏ£Íû½«Êä³öͨ¹ý¹ÜµÀÖ±½ÓË͵½·ÖÒ³³ÌÐò¡£Îª´Ë£¬ÏÈ´´½¨Ò»¸ö  
¹ÜµÀ£¬Ò»¸ö×Ó½ø³Ì£¬Ê¹×Ó½ø³ÌµÄ±ê×¼ÊäÈë³ÉΪ¹ÜµÀµÄ¶Á¶Ë£¬È»ºóexecÓû§Ï²°®µÄ·Ö  
Ò³³ÌÐò¡£³ÌÐò£±£´.£²ÏÔʾÁËÈçºÎʵÏÖÕâЩ²Ù×÷¡££¨±¾ÀýÒªÇóÔÚÃüÁîÐÐÖÐÓÐÒ»¸ö²Î  
Êý˵Ã÷ÒªÏÔʾµÄÎļþµÄÃû³Æ¡£Í¨³££¬ÕâÖÖÀàÐ͵ijÌÐòÒªÇóÔÚÖÕ¶ËÉÏÏÔʾµÄÊý¾ÝÒѾ­  
ÔÚ´æ´¢Æ÷ÖС££©  
#include        <sys/wait.h>  
#include        "ourhdr.h"  
#define DEF_PAGER       "/usr/bin/more"         /* default pager program */  
int  
main(int argc, char *argv[])  
{  
        int             n, fd[2];  
        pid_t   pid;  
        char    line[MAXLINE], *pager, *argv0;  
        FILE    *fp;  
        if (argc != 2)  
                err_quit("usage: a.out <pathname>");  
        if ( (fp = fopen(argv[1], "r")) == NULL)  
                err_sys("can't open %s", argv[1]);  
        if (pipe(fd) < 0)  
                err_sys("pipe error");  
        if ( (pid = fork()) < 0)  
                err_sys("fork error");  
        else if (pid > 0) {  
       /* parent */  
                close(fd[0]);           /* close read end */  
                        /* parent copies argv[1] to pipe */  
                while (fgets(line, MAXLINE, fp) != NULL) {  
                        n = strlen(line);  
                        if (write(fd[1], line, n) != n)  
                                err_sys("write error to pipe");  
                }  
                if (ferror(fp))  
                        err_sys("fgets error");  
                close(fd[1]);   /* close write end of pipe for reader */  
                if (waitpid(pid, NULL, 0) < 0)  
                        err_sys("waitpid error");  
                exit(0);  
        } else {  
               /* child */  
                close(fd[1]);   /* close write end */  
                if (fd[0] != STDIN_FILENO) {  
                        if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)  
                                err_sys("dup2 error to stdin");  
                        close(fd[0]);   /* don't need this after dup2 */  
                }  
                        /* get arguments for execl() */  
                if ( (pager = getenv("PAGER")) == NULL)  
                        pager = DEF_PAGER;  
                if ( (argv0 = strrchr(pager, '/')) != NULL)  
                        argv0++;                /* step past rightmost slash */  
                else  
                        argv0 = pager;  /* no slash in pager */  
                if (execl(pager, argv0, (char *) 0) < 0)  
                        err_sys("execl error for %s", pager);  
        }  
}  
³ÌÐò14.2  ½«Îļþ¸´ÖƵ½·ÖÒ³³ÌÐò  
ÔÚµ÷ÓÃfork֮ǰÏÈ´´½¨Ò»¸öpipe¡£forkÖ®ºó¸¸½ø³Ì¹Ø±ÕÆä¶Á¶Ë£¬×Ó½ø³Ì¹Ø±ÕÆäд¶Ë  
¡£×Ó½ø³ÌÈ»ºóµ÷ÓÃdup2£¬Ê¹Æä±ê×¼ÊäÈë³ÉΪ¹ÜµÀµÄ¶Á¶Ë¡£µ±Ö´ÐзÖÒ³³ÌÐòʱ£¬Æä±ê  
×¼ÊäÈ뽫ÊǹܵÀµÄ¶Á¶Ë¡£  
µ±ÎÒÃǽ«Ò»¸öÃèÊö·û¸´ÖƵ½ÁíÒ»¸öʱ£¨ÔÚ×Ó½ø³ÌÖУ¬fd[0]¸´ÖƵ½±ê×¼ÊäÈ룩£¬Ó¦  
µ±×¢Òâ¸ÃÃèÊö·ûµÄÖµ²¢²»ÒѾ­ÊÇËùÏ£ÍûµÄÖµ¡£Èç¹û¸ÃÃèÊö·ûÒѾ­¾ßÓÐËùÏ£ÍûµÄÖµ£¬  
²¢ÇÒÎÒÃÇÏȵ÷ÓÃdup2£¬È»ºócloseÔò½«¹Ø±ÕÔڴ˽ø³ÌÖÐÖ»Óиõ¥¸öÃèÊö·ûËù´ú±íµÄ  
´ò¿ªÎļþ¡££¨Çë»ØÒä3.12½ÚÖÐËùÊö£¬µ±dup2ÖеÄÁ½¸ö²ÎÊýÖµÏàµÈʱµÄ²Ù×÷¡££©ÔÚ±¾  
³ÌÐòÖУ¬Èç¹ûshellûÓдò¿ª±ê×¼ÊäÈ룬ÄÇô³ÌÐò¿ªÊ¼´¦µÄfopenÓ¦ÒÑʹÓÃÃèÊö·û0  
£¬Ò²¾ÍÊÇ×îСĩʹÓõÄÃèÊö·û£¬ËùÒÔfd[0]¾ö²»»áµÈÓÚ±ê×¼ÊäÈë¡£¾¡¹ÜÈç´Ë£¬Ö»Òª  
Ïȵ÷ÓÃdup2£¬È»ºócloseÒÔ¸´ÖÆÒ»¸öÃèÊö·ûµ½ÁíÒ»¸ö£¬×÷ΪһÖÖ±£»¤ÐԵıà³Ì´ëÊ©  
£¬ÎÒÃÇ×ÜÊÇÏȽ«Á½¸öÃèÊö·û½øÐбȽϡ£  
Çë×¢Ò⣬ÎÒÃÇÊÇÈçºÎʹÓû·¾³±äÁ¿PAGER¶ø»ñµÃÓû§·ÖÒ³³ÌÐòÃû³ÆµÄ¡£Èç¹ûÕâÖÖ²Ù  
×÷ûÓгɹ¦£¬ÔòʹÓÃϵͳĬÈÏÖµ¡£ÕâÊÇ»·¾³±äÁ¿µÄ³£¼ûÓ÷¨¡£  
ʵÀý  
Çë»ØÒä8.8½ÚÖеÄÎå¸öº¯ÊýTELL_WAIT¡¢TELL_PARENT¡¢TELL_CHILD¡¢WAIT_PARENTÒÔ  
¼°WAIT_CHILD¡£ÔÚ³ÌÐò10.17ÖУ¬ÎÒÃÇÌṩÁËÒ»¸öʹÓÃÐźŵÄʵÏÖ¡£³ÌÐò14.3ÔòÊÇ  
Ò»¸öʹÓùܵÀµÄʵÏÖ¡£  
Èçͼ14.5Ëùʾ£¬ÎÒÃÇÔÚfork֮ǰ´´½¨ÁËÁ½¸ö¹ÜµÀ¡£  
ͼ14.5  ÓÃÁ½¸ö¹ÜµÀʵÏÖ¸¸-×Ó½ø³ÌµÄͬ²½  
¸¸½ø³ÌÔÚµ÷ÓÃTELL_CHILDʱ¾­ÓÉÉÏÒ»¸ö¹ÜµÀдһ¸ö×Ö·û"P"£¬×Ó½ø³ÌÔÚµ÷ÓÃTELL_P  
ARENTʱ£¬¾­ÓÉÏÂÒ»¸ö¹ÜµÀдһ¸ö×Ö·û"C"¡£ÏàÓ¦µÄWAIT_XXXº¯Êýµ÷ÓÃread¶ÁÒ»¸ö×Ö  
·û£¬Ã»ÓжÁµ½×Ö·ûʱ×èÈû£¨Ë¯Ãߵȴý£©¡£  
Çë×¢Ò⣬ÿһ¸ö¹ÜµÀ¶¼ÓÐÒ»¸ö¶îÍâµÄ¶ÁÈ¡½ø³Ì£¬ÕâûÓйØÏµ¡£Ò²¾ÍÊÇ˵³ýÁË×Ó½ø³Ì  
´Ópfd1[0]¶ÁÈ¡£¬¸¸½ø³ÌÒ²ÓÐÉÏÒ»¸ö¹ÜµÀµÄ¶Á¶Ë¡£ÒòΪ¸¸½ø³Ì²¢Ã»ÓÐÖ´ÐжԸùܵÀ  
µÄ¶Á²Ù×÷£¬ËùÒÔÕâ²»»á²úÉúÈκÎÓ°Ïì¡£  
#include        "ourhdr.h"  
static int      pfd1[2], pfd2[2];  
void  
TELL_WAIT()  
{  
        if (pipe(pfd1) < 0 || pipe(pfd2) < 0)  
                err_sys("pipe error");  
}  
void  
TELL_PARENT(pid_t pid)  
{  
        if (write(pfd2[1], "c", 1) != 1)  
                err_sys("write error");  
}  
void  
WAIT_PARENT(void)  
{  
        char    c;  
        if (read(pfd1[0], &c, 1) != 1)  
                err_sys("read error");  
        if (c != 'p')  
                err_quit("WAIT_PARENT: incorrect data");  
}  
void  
TELL_CHILD(pid_t pid)  
{  
        if (write(pfd1[1], "p", 1) != 1)  
                err_sys("write error");  
}  
void  
WAIT_CHILD(void)  
{  
        char    c;  
        if (read(pfd2[0], &c, 1) != 1)  
                err_sys("read error");  
        if (c != 'c')  
                err_quit("WAIT_CHILD: incorrect data");  
}  
³ÌÐò14.3  Ê¹¸¸¡¢×Ó½ø³Ìͬ²½µÄÀý³Ì  
14.3 popenºÍpcloseº¯Êý  
ÒòΪ³£¼ûµÄ²Ù×÷ÊÇ´´½¨Ò»¸öÁ¬µ½ÁíÒ»¸ö½ø³ÌµÄ¹ÜµÀ£¬È»ºó¶ÁÆäÊä³ö»òÏòÆä·¢ËÍÊäÈë  
£¬ËùÒÔ±ê×¼I/O¿âΪʵÏÖÕâЩ²Ù×÷ÌṩÁËÁ½¸öº¯ÊýpopenºÍpclose¡£ÕâÁ½¸öº¯ÊýʵÏÖ  
µÄ²Ù×÷ÊÇ£»´´½¨Ò»¸ö¹ÜµÀ£¬forkÒ»¸ö×Ó½ø³Ì£¬¹Ø±Õ¹ÜµÀµÄ²»Ê¹Óöˣ¬execÒ»¸öshe  
llÒÔÖ´ÐÐÃüÁµÈ´ýÃüÁîÖÕÖ¹¡£  
        #include  <stdio.h>  
        FILE *popen(const  char  *cmdstring,  const  char  *type);  
·µ»Ø£ºÈô³É¹¦ÎªÎļþÖ¸Õ룬³ö´íΪNULL  
        int  pclose(FILE  *fp);  
                                                                ·µ»Ø£ºcmdstringµ  
ÖÕֹ״̬£¬³ö´íΪ-1  
º¯Êýpopen ÏÈ×öfork£¬È»ºóexecÒÔÖ´ÐÐcmdstring£¬²¢ÇÒ·µ»ØÒ»¸ö±ê×¼I/OÎļþÖ¸Õë  
¡£Èç¹ûtypeÊÇ"r"£¬ÔòÎļþÖ¸ÕëÁ¬µ½cmdstringµÄ±ê×¼Êä³ö£¨Í¼14.6£©  
ͼ14.6  fp=popen(command , "r")µÄ½á¹û  
Èç¹ûtype ÊÇ "w",ÔòÎļþÖ¸ÕëÁ¬½Óµ½cmdstring µÄ±ê×¼ÊäÈ루ͼ14.7£©¡£  
ͼ14.7  fp=popen(command,"w")µÄ½á¹û  
ÓÐÒ»ÖÖ·½·¨¿ÉÒÔ°ïÖúÎÒÃǼÇסpopen×îºóÒ»¸ö²ÎÊý¼°Æä×÷Óã¬ÕâÖÖ·½·¨¾ÍÊÇÓëfope  
n½øÐÐÀà±È¡£Èç¹ûtypeÊÇ"r",Ôò·µ»ØµÄÎļþÖ¸ÕëÊǿɶÁµÄ£¬Èç¹ûtypeÊÇ"w"£¬ÔòÊǿɠ 
дµÄ¡£  
pcloseº¯Êý¹Ø±Õ±ê×¼I/OÁ÷£¬µÈ´ýÃüÁîÖ´ÐнáÊø£¬È»ºó·µ»ØshellµÄÖÕֹ״̬¡££¨ÎÒ  
ÃÇÔøÔÚ8.6½Ú¶ÔÖÕֹ״̬½øÐйý˵Ã÷£¬systemº¯Êý£¨8.12½Ú£©Ò²·µ»ØÖÕֹ״̬¡££©  
Èç¹ûshell²»Äܱ»Ö´ÐУ¬Ôòpclose·µ»ØµÄÖÕֹ״̬ÓëshellÖ´ÐÐexit£¨127£©Ò»Ñù¡£  
   
cmdstring ÓÉBourne shellÒÔÏÂÁз½Ê½Ö´ÐУ»  
sh -c cmdstring  
Õâ±íʾshell½«À©Õ¹cmdstringÖеÄÈκÎÌØÊâ×Ö·û¡£ÀýÈ磬ÎÒÃÇ¿ÉÒÔʹÓã»  
fp=popen("ls *.c" , "r")£»  
»òÕß  
fp=popen("cmd 2>&1" , "r");  
·µ»Ø£ºÈô³É¹¦ÎªÎļþÖ¸Õ룬³ö´íΪNULL  
        int  pclose(FILE  *fp);  
                                                                ·µ»Ø£ºcmdstringµ  
ÖÕֹ״̬£¬³ö´íΪ-1  
º¯Êýpopen ÏÈ×öfork£¬È»ºóexecÒÔÖ´ÐÐcmdstring£¬²¢ÇÒ·µ»ØÒ»¸ö±ê×¼I/OÎļþÖ¸Õë  
¡£Èç¹ûtypeÊÇ"r"£¬ÔòÎļþÖ¸ÕëÁ¬µ½cmdstringµÄ±ê×¼Êä³ö£¨Í¼14.6£©  
ͼ14.6  fp=popen(command , "r")µÄ½á¹û  
Èç¹ûtype ÊÇ "w",ÔòÎļþÖ¸ÕëÁ¬½Óµ½cmdstring µÄ±ê×¼ÊäÈ루ͼ14.7£©¡£  
ͼ14.7  fp=popen(command,"w")µÄ½á¹û  
ÓÐÒ»ÖÖ·½·¨¿ÉÒÔ°ïÖúÎÒÃǼÇסpopen×îºóÒ»¸ö²ÎÊý¼°Æä×÷Óã¬ÕâÖÖ·½·¨¾ÍÊÇÓëfope  
n½øÐÐÀà±È¡£Èç¹ûtypeÊÇ"r",Ôò·µ»ØµÄÎļþÖ¸ÕëÊǿɶÁµÄ£¬Èç¹ûtypeÊÇ"w"£¬ÔòÊǿɠ 
дµÄ¡£  
pcloseº¯Êý¹Ø±Õ±ê×¼I/OÁ÷£¬µÈ´ýÃüÁîÖ´ÐнáÊø£¬È»ºó·µ»ØshellµÄÖÕֹ״̬¡££¨ÎÒ  
ÃÇÔøÔÚ8.6½Ú¶ÔÖÕֹ״̬½øÐйý˵Ã÷£¬systemº¯Êý£¨8.12½Ú£©Ò²·µ»ØÖÕֹ״̬¡££©  
Èç¹ûshell²»Äܱ»Ö´ÐУ¬Ôòpclose·µ»ØµÄÖÕֹ״̬ÓëshellÖ´ÐÐexit£¨127£©Ò»Ñù¡£  
   
cmdstring ÓÉBourne shellÒÔÏÂÁз½Ê½Ö´ÐУ»  
sh -c cmdstring  
Õâ±íʾshell½«À©Õ¹cmdstringÖеÄÈκÎÌØÊâ×Ö·û¡£ÀýÈ磬ÎÒÃÇ¿ÉÒÔʹÓã»  
fp=popen("ls *.c" , "r")£»  
»òÕß  
fp=popen("cmd 2>&1" , "r");  
POSIX.1ûÓÐ˵Ã÷popen¡¢pclose,ÒòΪËüÃÇÓëshellÓн»»¥×÷Ó㬶øshell ÊÇÓÉPOS  
IX.2˵Ã÷µÄ¡£ÎÒÃǶÔÕâÁ½¸öº¯ÊýµÄ˵Ã÷ÓëPOSIX.2µÄ  Draft11.2(11.2²Ý°¸)ÏàÒ»Ö  
¡£¸ÃPOSIX.2²Ý°¸¶ÔÕâÁ½¸öº¯ÊýµÄ˵Ã÷ÓëÒÔǰµÄʵÏÖÓÐÐ©Çø±ð¡£  
ʵÀý#include    <sys/wait.h>  
#include        "ourhdr.h"  
#define PAGER   "${PAGER:-more}" /* environment variable, or default */  
int  
main(int argc, char *argv[])  
{  
        char    line[MAXLINE];  
        FILE    *fpin, *fpout;  
        if (argc != 2)  
                err_quit("usage: a.out <pathname>");  
        if ( (fpin = fopen(argv[1], "r")) == NULL)  
                err_sys("can't open %s", argv[1]);  
        if ( (fpout = popen(PAGER, "w")) == NULL)  
                err_sys("popen error");  
                /* copy argv[1] to pager */  
        while (fgets(line, MAXLINE, fpin) != NULL) {  
                if (fputs(line, fpout) == EOF)  
                        err_sys("fputs error to pipe");  
        }  
        if (ferror(fpin))  
                err_sys("fgets error");  
        if (pclose(fpout) == -1)  
                err_sys("pclose error");  
        exit(0);  
}  
³ÌÐò14.4  ÓÃpopenÏò·ÖÒ³³ÌÐò´«ËÍÎļþ  
ÈÃÎÒÃÇÓÃpopenÖØÐ´³ÌÐò14.2£¬Æä½á¹ûÊdzÌÐò14.4¡£Ê¹ÓÃpopen¼õÉÙÁËÐèÒª±àдµÄ´ú  
ÂëÁ¿¡£  
shellÃüÁî${PAGER:-more}µÄÒâ˼ÊÇ£»Èç¹ûshell±äÁ¿PAGERÒѾ­¶¨Ò壬ÇÒÆäÖµ·Ç¿Õ  
£¨nonnull£©£¬ÔòʹÓÃÆäÖµ£¬·ñÔòʹÓÃ×Ö·û´®more¡£  
ʵÀý-popenº¯Êý  
³ÌÐò14.5ÊÇÎÒÃDZàдµÄpopenºÍpclose°æ±¾¡£ËäÈ»popenµÄºËÐIJ¿·ÖÓë±¾ÕÂÖÐÒÔǰÓà 
¹ýµÄ´úÂëÀàËÆ£¬µ«ÊÇÔö¼ÓÁ˺ܶàÐèÒª¿¼ÂǵÄϸ½Ú¡£Ê×ÏÈÿ´Îµ÷ÓÃpopenʱ£¬Ó¦µ±¼Ç  
סËù´´½¨µÄ×Ó½ø³ÌµÄ½ø³ÌID£¬ÒÔ¼°ÆäÎļþÃèÊö·û»òFILEÖ¸Õë¡£ÎÒÃÇÑ¡ÔñÔÚÊý×échi  
ldpidÖб£´æ×Ó½ø³ÌID£¬²¢ÓÃÎļþÃèÊö·û×÷ΪÆäϱꡣÓÚÊÇ£¬µ±ÒÔFILEÖ¸Õë×÷Ϊ²Î  
Êýµ÷ÓÃpcloseʱ£¬ÎÒÃǵ÷Óñê×¼I/Oº¯ÊýfilenoÒԵõ½ÎļþÃèÊö·û£¬È»ºóÈ¡µÃ×Ó½ø  
³ÌID£¬²¢ÓÃÓÚµ÷ÓÃwaitpid¡£ÒòΪһ¸ö½ø³Ì¿ÉÄܵ÷ÓÃpopen¶à´Î£¬ËùÒÔÎÒÃÇÔÚ¶¯Ì¬·Ö  
ÅächildpidÊý×éʱ£¨µÚÒ»´Îµ÷ÓÃpopenʱ£©£¬Æä³¤¶È¿ÉÒÔÈÝÄÉÓëÎļþÃèÊö·ûÊýÏàͬ  
µÄ½ø³ÌÊý¡£  
µ÷ÓÃpipe¡¢forkÒÔ¼°ÎªÃ¿¸ö½ø³Ì¸´ÖÆÏàÓ¦µÄÎļþÃèÊö·û£¬ÕâЩ²Ù×÷Óë±¾ÕÂÇ°ÃæËùÊö  
µÄÀàËÆ¡£  
POSIX.2ÒªÇó×Ó½ø³Ì¹Ø±ÕÔÚÒÔǰµ÷ÓÃpopenʱÐγɣ¬µ±Ç°ÈԾɴò¿ªµÄËùÓÐI/OÁ÷¡£Îª  
´Ë£¬ÎÒÃÇÔÚ×Ó½ø³ÌÖдÓÍ·Öð¸ö¼ì²échildpidÊý×éµÄ¸÷ÔªËØ£¬¹Ø±ÕÈԾɴò¿ªµÄÈÎÒ»Ãè  
Êö·û¡£  
ÈôpcloseµÄµ÷ÓÃÕßÒѾ­ÎªÐźÅSIGCHLDÉèÖÃÁËÒ»¸öÐźŴ¦Àí³ÌÐò£¬Ôòwaitpid½«·µ»Ø  
Ò»¸ö³ö´íºÅEINTR¡£ÒòΪÔÊÐíµ÷ÓÃÕß²¶×½´ËÐźţ¨»òÕßÈÎºÎÆäËü¿ÉÄÜÖжÏwaitpidµ÷  
ÓõÄÐźţ©£¬ËùÒÔµ±waitpid±»Ò»¸ö²¶×½µ½µÄÐźÅÖжÏʱ£¬ÎÒÃÇÖ»ÊÇÔٴε÷ÓÃwait  
pid¡£  
        Èç¹ûÒ»¸öÐźÅÖжÏÁËwait£¬ pcloseµÄÔçÆÚ°æ±¾·µ»ØEINTR³ö´íºÅ¡£  
        pcloseµÄÔçÆÚ°æ±¾ÔÚwaitÆÚ¼ä£¬×èÈû»òºöÂÔÐźÅSIGINT¡¢SIGQUITÒÔ¼°SI  
GHUP¡£  
        POSIX.2Ôò²»ÔÊÐíÕâÒ»µã¡£  
#include        <sys/wait.h>  
#include        <errno.h>  
#include        <fcntl.h>  
#include        "ourhdr.h"  
static pid_t    *childpid = NULL;  
                                                /* ptr to array allocated at run  
time */  
static int              maxfd;  /* from our open_max(), {Prog openmax} */  
#define SHELL   "/bin/sh"  
FILE *  
popen(const char *cmdstring, const char *type)  
{  
        int             i, pfd[2];  
        pid_t   pid;  
        FILE    *fp;  
                        /* only allow "r" or "w" */  
        if ((type[0] != 'r' && type[0] != 'w') || type[1] != 0) {  
                errno = EINVAL;         /* required by POSIX.2 */  
                return(NULL);  
        }  
        if (childpid == NULL) {         /* first time through */  
                                /* allocate zeroed out array for child pids */  
                maxfd = open_max();  
                if ( (childpid = calloc(maxfd, sizeof(pid_t))) == NULL)  
                        return(NULL);  
        }  
        if (pipe(pfd) < 0)  
                return(NULL);   /* errno set by pipe() */  
        if ( (pid = fork()) < 0)  
                return(NULL);   /* errno set by fork() */  
        else if (pid == 0) {  
* child */  
                if (*type == 'r') {  
                if ( (fp = fdopen(pfd[0], type)) == NULL)  
                        return(NULL);  
        } else {  
                close(pfd[0]);  
                if ( (fp = fdopen(pfd[1], type)) == NULL)  
                        return(NULL);  
        }  
        childpid[fileno(fp)] = pid;     /* remember child pid for this fd */  
        return(fp);  
}  
int  
pclose(FILE *fp)  
{  
        int             fd, stat;  
        pid_t   pid;  
        if (childpid == NULL)  
                return(-1);             /* popen() has never been called */  
        fd = fileno(fp);  
        if ( (pid = childpid[fd]) == 0)  
                return(-1);             /* fp wasn't opened by popen() */  
        childpid[fd] = 0;  
        if (fclose(fp) == EOF)  
                return(-1);  
        while (waitpid(pid, &stat, 0) < 0)  
                if (errno != EINTR)  
                        return(-1);     /* error other than EINTR from waitpid()  
*/  
        return(stat);   /* return child's termination status */  
}  
³ÌÐò14.5  popenºÍpcloseº¯Êý  
ʵÀý  
¿¼ÂÇÒ»¸öÓ¦ÓóÌÐò£¬ËüÏò±ê×¼Êä³öдһ¸öÌáʾ£¬È»ºó´Ó±ê×¼ÊäÈë¶Á1ÐС£Ê¹ÓÃpope  
n,ÎÒÃÇ¿ÉÒÔÔÚÓ¦ÓóÌÐòºÍÊäÈëÖ®¼ä²åÈëÒ»µÀ³ÌÐòÒÔ¶ÔÊäÈë½øÐб任´¦Àí¡£Í¼14.8ÏÔ  
ʾÁ˽ø³ÌµÄ°²ÅÅ¡£  
ͼ14.8  ÓÃpopen±ä»»ÊäÈë  
#include        <ctype.h>  
#include        "ourhdr.h"  
int  
main(void)  
{  
        int             c;  
        while ( (c = getchar()) != EOF) {  
                if (isupper(c))  
                        c = tolower(c);  
                if (putchar(c) == EOF)  
                        err_sys("output error");  
                if (c == '\n')  
                        fflush(stdout);  
        }  
        exit(0);  
}  
³ÌÐò14.6  ¹ýÂ˳ÌÐò£¬½«´óд×Ö·û±ä»»³ÉСд×Ö·û  
#include        <sys/wait.h>  
#include        "ourhdr.h"  
int  
main(void)  
{  
        char    line[MAXLINE];  
        FILE    *fpin;  
        if ( (fpin = popen("myuclc", "r")) == NULL)  
                err_sys("popen error");  
        for ( ; ; ) {  
                fputs("prompt> ", stdout);  
                fflush(stdout);  
                if (fgets(line, MAXLINE, fpin) == NULL) /* read from pipe */  
                        break;  
                if (fputs(line, stdout) == EOF)  
                        err_sys("fputs error to pipe");  
        }  
        if (pclose(fpin) == -1)  
                err_sys("pclose error");  
        putchar('\n');  
        exit(0);  
}  
³ÌÐò14.7  µ÷Óôóд/Сд¹ýÂ˳ÌÐòÒÔ¶ÁÈ¡ÃüÁî  
¶ÔÊäÈë½øÐеı任¿ÉÄÜÊÇ·¾¶ÃûµÄÀ©³ä£¬»òÕßÊÇÌṩһÖÖÀúÊ·»úÖÆ£¨¼ÇסÒÔǰÊäÈë  
µÄÃüÁ¡£  
³ÌÐò14.6ÊÇÒ»¸ö¼òµ¥µÄ¹ýÂ˳ÌÐò£¬ËüÖ»Êǽ«ÊäÈë¸´ÖÆµ½Êä³ö£¬ÔÚ¸´ÖÆÊ±½«ÈÎÒ»´ó  
д×Ö·û±ä»»ÎªÐ¡Ð´×Ö·û¡£ÔÚдÁËÒ»ÐÐÖ®ºó£¬ÎÒÃǶԱê×¼Êä³ö½øÐÐÁËË¢Ç壨ÓÃfflus  
h£©£¬ÆäÀíÓɽ«ÔÚÏÂÒ»½Ú½éÉÜЭͬ½ø³ÌʱÌÖÂÛ¡£  
ÎÒÃǶԸùýÂ˳ÌÐò½øÐбàÒ룬Æä¿ÉÖ´ÐÐÄ¿±ê´úÂë´æ·ÅÔÚÎļþmyuclcÖУ¬È»ºóÔÚ³ÌÐò  
14.7ÖÐÓÃpopenµ÷ÓÃËüÃÇ¡£  
ÒòΪ±ê×¼Êä³öͨ³£Êǰ´ÐнøÐлº³åµÄ£¬¶øÌáʾ²¢²»°üº¬ÐÂÐзû£¬ËùÒÔÔÚдÁËÌáʾ֮  
ºó£¬ÐèÒªµ÷ÓÃfflush¡£  
14.4 Ð­Í¬½ø³Ì  
Unix¹ýÂ˳ÌÐò´Ó±ê×¼ÊäÈë¶ÁÈ¡Êý¾Ý£¬¶ÔÆä½øÐÐÊʵ±´¦Àíºóдµ½±ê×¼Êä³ö¡£¼¸¸ö¹ýÂË  
½ø³Ìͨ³£ÔÚshell¹ÜµÀÃüÁîÖÐÏßÐÔµØÁ¬½Ó¡£µ±Í¬Ò»µÀ³ÌÐò²úÉúij¸ö¹ýÂ˳ÌÐòµÄÊäÈë  
£¬Í¬Ê±ÓÖ¶ÁÈ¡¸Ã¹ýÂ˳ÌÐòµÄÊä³öʱ£¬Ôò¸Ã¹ýÂ˳ÌÐò¾Í³ÉΪЭͬ½ø³Ì¡£  
KornShellÌṩÁËЭͬ½ø³Ì¡£Bourne shellºÍC shell²¢Ã»ÓÐÌṩ½«½ø³ÌÁ¬½ÓÆðÀ´°´  
Эͬ½ø³Ì·½Ê½¹¤×÷µÄ·½·¨¡£Ð­Í¬½ø³Ìͨ³£ÔÚshellµÄºǫ́ÔËÐУ¬Æä±ê×¼ÊäÈëºÍ±ê×¼  
Êä³öͨ¹ý¹ÜµÀÁ¬½Óµ½ÁíÒ»µÀ³ÌÐò¡£ËäȻҪÇó³õʼ»¯Ò»¸öЭͬ½ø³Ì£¬²¢½«ÆäÊäÈëºÍÊä  
³öÁ¬½Óµ½ÁíÒ»¸ö½ø³ÌµÄshellÓï·¨ÊÇÊ®·ÖÆæÌØµÄ£¨ÏêϸÇé¿ö¼ûBolskyºÍKorn[1989]  
ÖеÄpp.66-66£©,µ«ÊÇЭͬ½ø³ÌµÄ¹¤×÷·½Ê½ÔÚC³ÌÐòÖÐÒ²ÊǷdz£ÓÐÓõġ£  
popenÌṩÁ¬µ½ÁíÒ»¸ö½ø³ÌµÄ±ê×¼ÊäÈë»ò±ê×¼Êä³öµÄÒ»¸öµ¥ÐйܵÀ£¬¶ø¶ÔÓÚЭͬ½ø  
³Ì£¬ÔòËüÓÐÁ¬µ½ÁíÒ»¸ö½ø³ÌµÄÁ½¸öµ¥ÐйܵÀ--Ò»¸ö½Óµ½Æä±ê×¼ÊäÈ룬ÁíÒ»¸öÔòÀ´´Ó  
±ê×¼Êä³ö¿ªÊ¼¡£ÎÒÃÇÏÈÒª½«Êý¾Ýдµ½Æä±ê×¼ÊäÈ룬¾­Æä´¦Àíºó£¬ÔÙ´ÓÆä±ê×¼Êä³ö¶Á  
È¡Êý¾Ý¡£  
ʵÀý  
ÈÃÎÒÃÇͨ¹ýÒ»¸öʵÀýÀ´¹Û²ìЭͬ½ø³Ì¡£½ø³ÌÏÈ´´½¨Á½¸ö¹ÜµÀ£ºÒ»¸öÊÇЭͬ½ø³ÌµÄ±ê  
×¼ÊäÈ룬ÁíÒ»¸öÊÇЭͬ½ø³ÌµÄ±ê×¼Êä³ö¡£Í¼14.9ÏÔʾÁËÕâÖÖ°²ÅÅ¡£  
ͼ14.9  Çý¶¯Ò»¸öЭͬ½ø³Ì--дÆä±ê×¼ÊäÈ룬¶ÁÆä±ê×¼Êä³ö  
³ÌÐò14.8ÊÇÒ»¸ö¼òµ¥µÄЭͬ½ø³Ì£¬Ëü´ÓÆä±ê×¼ÊäÈë¶ÁÁ½¸öÊý£¬¼ÆËãËüÃǵĺͣ¬È»ºó  
½«½á¹ûдÖÁ±ê×¼Êä³ö¡£  
#include "ourhdr.h"  
int  
main(void)  
{  
 int  n, int1, int2;  
 char line[MAXLINE];  
 while ( (n = read(STDIN_FILENO, line, MAXLINE)) > 0) {  
  line[n] = 0;  /* null terminate */  
  if (sscanf(line, "%d%d", &int1, &int2) == 2) {  
   sprintf(line, "%d\n", int1 + int2);  
   n = strlen(line);  
   if (write(STDOUT_FILENO, line, n) != n)  
    err_sys("write error");  
  } else {  
   if (write(STDOUT_FILENO, "invalid args\n", 13) != 13)  
    err_sys("write error");  
  }  
 }  
 exit(0);  
}  
³ÌÐò14.8  ¼ÓÁ½¸öÊýµÄ¼òµ¥Â˲¨Æ÷  
¶Ô´Ë³ÌÐò½øÐбàÒ룬½«Æä¿ÉÖ´ÐÐÄ¿±ê´úÂë´æÈëÃûΪadd2µÄÎļþ¡£  
³ÌÐò14.9ÔÚ´ÓÆä±ê×¼ÊäÈë¶ÁÈëÁ½¸öÊýÖ®ºóµ÷ÓÃadd2Эͬ½ø³Ì¡£´ÓЭͬ½ø³ÌËÍÀ´µÄÖµ  
Ôòдµ½Æä±ê×¼Êä³ö¡£  
#include <signal.h>  
#include "ourhdr.h"  
static void sig_pipe(int);  /* our signal handler */  
int  
main(void)  
{  
 int  n, fd1[2], fd2[2];  
 pid_t pid;  
 char line[MAXLINE];  
 if (signal(SIGPIPE, sig_pipe) == SIG_ERR)  
  err_sys("signal error");  
 if (pipe(fd1) < 0 || pipe(fd2) < 0)  
  err_sys("pipe error");  
 if ( (pid = fork()) < 0)  
  err_sys("fork error");  
 else if (pid > 0) {       /* parent */  
  close(fd1[0]);  
  close(fd2[1]);  
  while (fgets(line, MAXLINE, stdin) != NULL) {  
   n = strlen(line);  
   if (write(fd1[1], line, n) != n)  
    err_sys("write error to pipe");  
   if ( (n = read(fd2[0], line, MAXLINE)) < 0)  
    err_sys("read error from pipe");  
   if (n == 0) {  
    err_msg("child closed pipe");  
    break;  
   }  
   line[n] = 0; /* null terminate */  
   if (fputs(line, stdout) == EOF)  
    err_sys("fputs error");  
  }  
  if (ferror(stdin))  
   err_sys("fgets error on stdin");  
  exit(0);  
 } else {         /* child */  
  close(fd1[1]);  
  close(fd2[0]);  
  if (fd1[0] != STDIN_FILENO) {  
   if (dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO)  
    err_sys("dup2 error to stdin");  
   close(fd1[0]);  
  }  
  if (fd2[1] != STDOUT_FILENO) {  
   if (dup2(fd2[1], STDOUT_FILENO) != STDOUT_FILENO)  
    err_sys("dup2 error to stdout");  
   close(fd2[1]);  
  }  
  if (execl("./add2", "add2", (char *) 0) < 0)  
   err_sys("execl error");  
 }  
}  
static void  
sig_pipe(int signo)  
{  
 printf("SIGPIPE caught\n");  
 exit(1);  
}  
³ÌÐò14.9  Çý¶¯add2¹ýÂ˳ÌÐòµÄ³ÌÐò  
ÔÚ³ÌÐòÖд´½¨ÁËÁ½¸ö¹ÜµÀ£¬¸¸¡¢×Ó½ø³Ì¸÷×ԹرÕËüÃDz»ÐèʹÓõĶ˿ڡ£´´½¨Á½¸ö¹Ü  
µÀµÄÀíÓÉÊÇ£»Ò»¸öÓÃ×÷ΪЭͬ½ø³ÌµÄ±ê×¼ÊäÈ룬ÁíÒ»¸öÔòÓÃ×÷ΪËüµÄ±ê×¼Êä³ö¡£È»  
ºóÔÚµ÷ÓÃexecl֮ǰ£¬×Ó½ø³Ìµ÷ÓÃdup2ʹ¹ÜµÀÃèÊö·ûÒÆÖÁÆä±ê×¼ÊäÈëºÍÊä³ö¡£  
Èô±àÒëºÍÔËÐгÌÐò14.9£¬ËüÈçËùÏ£ÍûµÄÄÇÑù½øÐй¤×÷¡£½øÒ»²½¿¼ÂÇ£¬ÔÚ³ÌÐò14.9Õý  
µÈ´ýÎÒÃǵÄÊäÈëʱ£¬Èôkill add2Эͬ½ø³Ì£»È»ºóÊäÈëÁ½¸öÊý£»µ±³ÌÐò14.9¶Ô¹ÜµÀ  
½øÐÐд²Ù×÷ʱ£¬ÓÉÓڸùܵÀÎÞ¶Á½ø³Ì£¬ÓÚÊǵ÷ÓÃÐźŴ¦Àí³ÌÐò£¨¼ûÁ·Ï°14.4£©¡£  
ÔÚ³ÌÐò15.1ÖУ¬ÎÒÃǽ«ÌṩÕâһʵÀýµÄÁíÒ»¸ö°æ±¾£¬ËüʹÓÃÒ»¸öȫ˫¹¤¹ÜµÀ¶ø²»ÊÇ  
Á½¸ö°ëË«¹¤¹ÜµÀ¡£  
ʵÀý  
ÔÚЭͬ½ø³Ìadd2£¨³ÌÐò14.8£©ÖУ¬ÎÒÃÇʹÓÃÁËUnix I/O:readºÍwrite¡£Èç¹ûÎÒÃÇʹ  
Óñê×¼I/O¸Äд¸ÃЭͬ½ø³Ì£¬Æäºó¹ûÊÇÊ²Ã´ÄØ£¿³ÌÐò14.10¾ÍÊÇÕâ¸öа汾¡£  
#include "ourhdr.h"  
int  
main(void)  
{  
 int  int1, int2;  
 char line[MAXLINE];  
 while (fgets(line, MAXLINE, stdin) != NULL) {  
  if (sscanf(line, "%d%d", &int1, &int2) == 2) {  
   if (printf("%d\n", int1 + int2) == EOF)  
    err_sys("printf error");  
  } else {  
   if (printf("invalid args\n") == EOF)  
    err_sys("printf error");  
  }  
 }  
 exit(0);  
}  
³ÌÐò14.10  ¼ÓÁ½¸öÊýµÄÂ˲¨Æ÷£¬Ê¹Óñê×¼I/O  
Èô³ÌÐò14.9µ÷ÓôËеÄЭͬ½ø³Ì£¬ÔòËü¾Í²»ÔÙ¹¤×÷¡£ÎÊÌâ³öÔÚϵͳĬÈϵıê×¼I/O  
»º´æ»úÖÆÉÏ¡£µ±³ÌÐò14.10±»µ÷ÓÃʱ£¬¶Ô±ê×¼ÊäÈëµÄµÚÒ»¸öfgetsÒýÆð±ê×¼I/O¿â·Ö  
ÅäÒ»¸ö»º´æ£¬²¢Ñ¡Ôñ»º´æµÄÀàÐÍ¡£ÒòΪ±ê×¼ÊäÈëÊǸö¹ÜµÀ£¬ËùÒÔisattyΪ¼Ù£¬ÓÚÊÇ  
±ê×¼I/O¿âÓÉϵͳĬÈÏÊÇÈ«»º³åµÄ¡£¶Ô±ê×¼Êä³öÒ²ÓÐͬÑùµÄ´¦Àí¡£µ±add2´ÓÆä±ê×¼  
ÊäÈë¶ÁÈ¡¶ø·¢Éú¶ÂÈûʱ£¬³ÌÐò14.9ÔڴӹܵÀ¶ÁʱҲ·¢Éú¶ÂÈû£¬ÓÚÊDzúÉúÁËËÀËø¡£  
ÎÒÃǶԽ«ÒªÖ´ÐУ¨exec£©µÄÕâÑùÒ»¸öЭͬ½ø³Ì¿ÉÒÔ¼ÓÒÔ¿ØÖÆ¡£ÔÚ³ÌÐò14.10ÖеÄwh  
ileÑ­»·Ö®Ç°¼ÓÉÏÏÂÃæ4ÐС£  
    if ( setvbuf(stdin ,NULL, _IOLBF, O) !=0 )  
       err_sys("setvbuf error")£»  
    if ( setvbuf(stdout,NULL,_IOLBF,O)!=0 )  
       err_sys("setvbuf error")£»  
ÕâʹµÃµ±ÓÐÒ»ÐпÉÓÃʱ£¬fgets¼´·µ»Ø£¬Ê¹µÃµ±Êä³öÒ»ÐÂÐзûʱ£¬printf¼´Ö´ÐÐff  
lush²Ù×÷¡£¶Ôsetvbuf½øÐÐÁËÕâЩÏÔʽµ÷Óã¬Ê¹µÃ³ÌÐò14.10ÄÜÕý³£¹¤×÷¡£  
Èç¹ûÎÒÃDz»ÄÜÐÞ¸ÄÕâÑùµÄЭͬ½ø³Ì£¬ÔòÐèʹÓÃÆäËü¼¼Êõ¡£ÀýÈ磬Èç¹ûÔÚÎÒÃǵijÌÐò  
ÖÐʹÓÃawk(1)´úÌæadd2×÷ΪЭͬ½ø³Ì£¬ÔòÏÂÁÐÃüÁîÐв»Äܹ¤×÷£»  
#£¡/bin/awk/ -f  
{print $1+$2}  
²»Äܹ¤×÷µÄÔ­Òò»¹ÊDZê×¼I/OµÄ»º³å»úÖÆÎÊÌâ¡£µ«ÊÇ£¬ÔÚÕâÖÖÇé¿öÏÂÎÒÃDz»Äܸı䠠
awkµÄ¹¤×÷·½Ê½£¨³ý·ÇÎÒÃÇÓÐawkµÄÔ´´úÂ룩¡£  
¶ÔÕâÖÖÎÊÌâµÄÒ»°ã½â¾ö·½·¨ÊÇʹ±»µ÷Óã¨ÔÚ±¾ÀýÖÐÊÇawk£©µÄЭͬ½ø³ÌÈÏΪËüµÄ±ê  
×¼ÊäÈëºÍÊä³öÊÇÁ¬µ½Ò»¸öÖÕ¶Ë¡£ÕâʹµÃÔÚЭͬ½ø³ÌÖеıê×¼I/OÀý³Ì¶ÔÕâÁ½¸öI/OÁ÷  
½øÐÐÐлº´æ£¬ÕâÀàËÆÓÚÎÒÃÇÔÚÇ°ÃæËù×öµÄÏÔʽsetvbufµ÷Óá£ÔÚµÚÊ®¾ÅÕÂÖУ¬ÎÒÃÇ  
½«ÓÃαÖÕ¶ËʵÏÖÕâÒ»µã¡£  
14.5  FIFO  
FIFOÓÐʱ±»³ÆÎªÃüÃû¹ÜµÀ¡£¹ÜµÀÖ»ÄÜÓÉÏà¹Ø½ø³ÌʹÓã¬ËüÃǹ²Í¬µÄ׿ÏȽø³Ì´´½¨ÁË  
¹ÜµÀ¡£µ«ÊÇ£¬Í¨¹ýFIFO£¬²»Ïà¹ØµÄ½ø³ÌÒ²Äܽ»»»Êý¾Ý¡£  
ÔÚÊ®ËÄÕÂÖУ¬ÒѾ­Ìá¼°FIFOÊÇÒ»ÖÖÎļþÀàÐÍ¡£Stat½á¹¹£¨4.2½Ú£©³ÉÔ±st_modeµÄ±à  
ÂëÖ¸Ã÷ÎļþÊÇ·ñÊÇFIFOÀàÐÍ¡£ÎÒÃÇ¿ÉÒÔÓÃS_ISFIFOºê¶Ô´Ë½øÐвâÊÔ¡£  
´´½¨Ò»¸öFIFOÀàËÆÓÚ´´½¨Ò»¸öÎļþ¡£È·Êµ£¬Ò»¸öFIFOµÄ·¾¶Ãû´æÔÚÓÚÎļþϵͳÖС£  
   
 #include  <sys/types.h>  
 #include  <sys/stat.h>  
 int mkfifo(const char *pathname, mode_t mode);  
         ·µ»Ø£ºÈô³É¹¦Îª0£¬³ö´íΪ-1  
mkfifoº¯ÊýÖÐmode²ÎÊýµÄ¹æ¸ñ˵Ã÷Óëopenº¯ÊýÖеÄmodeÏàͬ£¨¼û3.3½Ú£©¡£ÐÂFIFO  
µÄÓû§ºÍ×éµÄËùÓÐȨÓëÎÒÃÇÔÚ4.6½ÚËùÊöµÄÏàͬ¡£  
Ò»µ©ÒѾ­ÓÃmkfifo´´½¨ÁËÒ»¸öFIFO£¬ÎÒÃǾͿÉÓÃopen´ò¿ªËü¡£ È·Êµ£¬Ò»°ãµÄÎļþ  
I/Oº¯Êý£¨close,read,write,unlinkµÈ£©¶¼¿ÉÓÃÓÚFIFO¡£  
      mkfifoÊÇPOSIX.1Ê×ÏÈÌá³öµÄ¡£SVR3ÓÃmknod£¨2£©ÏµÍ³µ÷Óô´½¨FIFO¡£¶øÔÚ  
SVR4ÖУ¬mkfifoµ÷ÓÃmknod´´½¨FIFO¡£  
        POSIX.2ÒѾ­½¨ÒéÁËÒ»¸ömkfifo(1)ÃüÁî¡£SVR4ºÍ4.3+BSDÏÖÔÚÖ§³Ö´ËÃüÁî  
¡£ÓÚ  
        ÊÇ£¬ÓÃÒ»ÌõshellÃüÁî¾Í¿ÉÒÔ´´½¨Ò»¸öFIFO£¬È»ºóÓÃÒ»°ãµÄshell I/OÖØÐ  
¶¨Ïò¶Ô  
        Æä½øÐдæÈ¡¡£  
µ±´ò¿ªÒ»¸öFIFOʱ£¬·Ç×èÈû±êÖ¾£¨O_NONBLOCK£©²úÉúÏÂÁÐÓ°Ï죺  
1. ÔÚÒ»°ãÇé¿öÖУ¨Ã»ÓÐ˵Ã÷O_NONBLOCK£©£¬Ö»¶Á´ò¿ªÒª×èÈûµ½Ä³¸öÆäËü½ø³ÌΪд  
´ò¿ª´ËFIFO¡£ÀàËÆ£¬ÎªÐ´¶ø´ò¿ªÒ»¸öFIFOÒª×èÈûµ½Ä³¸öÆäËü½ø³ÌΪ¶Á¶ø´ò¿ªËü¡£  
2. Èç¹ûÖ¸¶¨ÁËO_NONBLOCK£¬ÔòÖ»¶Á´ò¿ªÁ¢¼´·µ»Ø¡£µ«ÊÇ£¬Èç¹ûûÓнø³ÌÒѾ­Îª¶Á  
¶ø´ò¿ªÒ»¸öFIFO£¬ÄÇôֻд´ò¿ª½«³ö´í·µ»Ø£¬ÆäerrnoÊÇENXIO¡£  
ÀàËÆÓڹܵÀ£¬Èôдһ¸öÉÐÎÞ½ø³ÌΪ¶Á¶ø´ò¿ªµÄFIFO£¬Ôò²úÉúÐźÅSIGPIPE¡£Èôij¸ö  
FIFOµÄ×îºóÒ»¸öд½ø³Ì¹Ø±ÕÁ˸ÃFIFO£¬Ôò½«Îª¸ÃFIFOµÄ¶Á½ø³Ì²úÉúÒ»¸öÎļþ½áÊø±ê  
Ö¾¡£  
Ò»¸ö¸ø¶¨µÄFIFOÓжà¸öд½ø³ÌÊdz£¼ûµÄ¡£Õâ¾ÍÒâζÕâÈç¹ûÎÒÃDz»Ï£Íû¶à¸ö½ø³ÌËùд  
µÄÊý¾Ý»¥Ïà´©²å£¬Ôò Ð迼ÂÇÔ­×Óд²Ù×÷¡£ÕýÈç¶ÔÓڹܵÀÒ»Ñù£¬³£ÊýPIPE_BUF˵Ã÷  
Á˿ɱ»Ô­×Óдµ½FIFOµÄ×î´óÊý¾ÝÁ¿¡£  
FIFOÓÐÁ½ÖÖÓÃ;¡£  
1. FIFOÓÉshellÃüÁîʹÓÃÒԱ㽫Êý¾Ý´ÓÒ»Ìõ¹ÜµÀÏß´«Ë͵½ÁíÒ»Ìõ£¬Îª´ËÎÞÐè´´½¨ÖР 
¼äÁÙʱÎļþ¡£  
2. FIFOÓÃÓÚ¿Í»§-·þÎñÕßÓ¦ÓóÌÐòÖУ¬ÒÔÔÚ¿Í»§ºÍ·þÎñÕßÖ®¼ä´«µÝÊý¾Ý¡£  
ÎÒÃǸ÷ÓÃÒ»¸öÀý×ÓÀ´ËµÃ÷ÕâÁ½ÖÖÓÃ;¡£  
ʵÀý-ÓÃFIFO¸´ÖÆÊä³öÁ÷  
FIFO¿É±»ÓÃÓÚ¸´ÖÆ´®ÐйܵÀÃüÁîÖ®¼äµÄÊä³öÁ÷£¬ÓÚÊÇÒ²¾Í²»ÐèҪдÊý¾Ýµ½Öмä´ÅÅÌ  
ÎļþÖУ¨ÀàËÆÓÚʹÓùܵÀÒÔ±ÜÃâÖмä´ÅÅÌÎļþ£©¡£¹ÜµÀÖ»ÄÜÓÃÓÚ½ø³Ì¼äµÄÏßÐÔÁ¬½Ó  
£¬È»¶ø£¬ÒòΪFIFO¾ßÓÐÃû×Ö£¬ËùÒÔËü¿ÉÓÃÓÚ·ÇÏßÐÔÁ¬½Ó¡£  
¿¼ÂÇÕâÑùÒ»¸ö²Ù×÷¹ý³Ì£¬ËüÐèÒª´¦ÀíÒ»¸ö¾­¹ý¹ýÂ˵ÄÊäÈëÁ÷Á½´Î¡£Í¼14.10±íʾÁË  
ÕâÖÖ°²ÅÅ¡£  
ʹÓÃFIFOÒÔ¼°Unix³ÌÐòtee(1)£¬ÎÒÃǾͿÉÒÔʵÏÖÕâÑùµÄ¹ý³Ì¶øÎÞÐèʹÓÃÁÙʱÎļþ¡£  
£¨tee³ÌÐò½«Æä±ê×¼ÊäÈëͬʱ¸´ÖƵ½Æä±ê×¼Êä³öÒÔ¼°ÆäÃüÁîÐÐÖаüº¬µÄÃüÃûÎļþÖР 
¡££©  
    mkfifo fifo1  
    prog3<fifo1&  
    prog1<infile 1 tee fifo1 | prog2  
ͼ14.10  ´¦ÀíÒ»¸ö¾­¹ý¹ýÂ˵ÄÊäÈëÁ÷Á½´Î  
ÎÒÃÇ´´½¨FIFO£¬È»ºóÔÚºǫ́Æô¶¯prog3,Ëü´ÓFIFO¶ÁÊý¾Ý¡£È»ºó£¬ÎÒÃÇÆô¶¯progl,Óà 
tee½«ÆäÊä³ö·¢Ë͵½FIFOºÍprog2¡£Í¼14.11 ÏÔʾÁËÓйذ²ÅÅ¡£  
ͼ14.11  Ê¹ÓÃFIFOºÍtee½«Ò»¸öÁ÷·¢Ë͵½Á½¸ö²»Í¬µÄ½ø³Ì  
ʵÀý-¿Í»§-·þÎñÕßʹÓÃFIFO½øÐÐͨÐÅ  
FIFOµÄÁíÒ»¸öÓ¦ÓÃÊÇÔÚ¿Í»§ºÍ·þÎñÕßÖ®¼ä´«ËÍÊý¾Ý¡£Èç¹ûÓÐÒ»¸ö·þÎñÕߣ¬ËüÓëºÜ¶à  
¿Í»§Óйأ¬Ã¿¸ö¿Í»§¶¼¿É½«ÆäÇëÇóдµ½Ò»¸ö¸Ã·þÎñÕß´´½¨µÄÖÚËùÖÜÖªµÄFIFOÖС££¨  
"ÖÚËùÖÜÖª"µÄÒâ˼ÊÇ£»ËùÓÐÐèÓë·þÎñÕßÁªÏµµÄ¿Í»§¶¼ÖªµÀ¸ÃFIFOµÄ·¾¶Ãû¡££©Í¼1  
4.12ÏÔʾÁËÕâÖÖ°²ÅÅ¡£ÒòΪ¶ÔÓÚ¸ÃFIFOÓжà¸öд½ø³Ì£¬¿Í»§·¢Ë͸ø·þÎñÕßµÄÇëÇóÆä  
³¤¶ÈҪСÓÚPIPE_BUF×Ö½Ú¡£ÕâÑù¾ÍÄܱÜÃâ¿Í»§¸÷´Îд֮¼äµÄ´©²å¡£  
ͼ14.12  ¿Í»§ÓÃ-FIFOÏò·þÎñÕß·¢ËÍÇëÇó  
ÔÚÕâÖÖÀàÐ͵Ŀͻ§-·þÎñÕßͨÐÅÖÐʹÓÃFIFOµÄÎÊÌâÊÇ£º·þÎñÕßÈçºÎ½«»Ø´ðËͻظ÷¸ö  
¿Í»§¡£²»ÄÜʹÓõ¥¸öFIFOµÄÎÊÌâÊÇ£º·þÎñÕßÈçºÎ½«»Ø´ðËͻظ÷¸ö¿Í»§¡£ÒòΪ·þÎñÕß  
»á·¢³ö¶Ô¸÷¸ö¿Í»§ÇëÇóµÄÏìÓ¦£¬¶øÇëÇóÕßÈ´²»¿ÉÄÜÖªµÀʲôʱºòÈ¥¶Á²ÅÄÜǡǡµÃµ½  
¶ÔËüµÄÏìÓ¦¡£Ò»ÖÖ½â¾ö·½·¨ÊÇÿ¸ö¿Í»§¶¼ÔÚÆäÇëÇóÖз¢ËÍÆä½ø³ÌID¡£È»ºó·þÎñÕßΪ  
ÿ¸ö¿Í»§´´½¨Ò»¸öFIFO£¬ËùʹÓõÄ·¾¶ÃûÊÇÒÔ¿Í»§µÄ½ø³ÌIDΪ»ù´¡µÄ¡£ÀýÈ磬·þÎñ  
Õß¿ÉÒÔÓÃÃû×Ö/tmp/serv1.xxxxx´´½¨FIFO£¬ÆäÖÐxxxxx±»´ú»»³É¿Í»§µÄ½ø³ÌID¡£Í¼  
14.13ÏÔʾÁËÕâÖÖ°²ÅÅ¡£  
ͼ14.13  ¿Í»§-·þÎñÕßÓÃFIFO½øÐÐͨÐÅ  
ÕâÖÖ°²ÅÅ¿ÉÒÔ¹¤×÷£¬µ«Ò²ÓÐһЩ²»×ãÖ®´¦¡£ÆäÖÐÖ®Ò»ÊÇ·þÎñÕß²»ÄÜÅжÏÒ»¸ö¿Í»§ÊÇ  
·ñ±ÀÀ£ÖÕÖ¹£¬Õâ¾ÍʹµÃ¿Í»§×¨ÓõÄFIFO»áÒÅÁôÔÚÎļþϵͳÖС£ÁíÒ»¸öÊÇ·þÎñÕß±ØÐë  
²¶×½SIGPIPEÐźţ¬ÒòΪ¿Í»§ÔÚ·¢ËÍÒ»¸öÇëÇóºóûÓжÁÈ¡ÏìÓ¦¾Í¿ÉÄÜÖÕÖ¹£¬ÓÚÊÇÁô  
ÏÂÒ»¸öÓÐд½ø³Ì£¨·þÎñÕߣ©¶øÎÞ¶Á½ø³ÌµÄ¿Í»§×¨ÓÃFIFO¡£  
°´ÕÕͼ14.13ÖеݲÅÅ£¬Èç¹û·þÎñÕßÒÔÖ»¶Á·½Ê½´ò¿ªÖÚËùÖÜÖªµÄFIFO£¨ÒòΪËüÖ»Ðè  
¶Á¸ÃFIFO£©£¬Ôòÿ´Î¿Í»§Êý´Ó1±ä³É0£¬·þÎñÕ߾ͽ«ÔÚFIFOÖжÁµ½Ò»¸öÎļþ½áÊø±ê¼Ç  
¡£ÎªÊ¹·þÎñÕßÃâÓÚ´¦ÀíÕâÖÖÇé¿ö£¬Ò»ÖÖ³£¼ûµÄ¼¼ÇÉÊÇʹ·þÎñÕßÒÔ¶Á-д·½Ê½´ò¿ª¸Ã  
FIFO£¨¼ûÁ·Ï°14.10£©¡£  
14.6  ÏµÍ³V IPC  
ÈýÖÖϵͳV IPC-ÏûÏ¢¶ÓÁС¢ÐźÅÁ¿ÒÔ¼°¹²Ïí´æ´¢Æ÷Ö®¼äÓкܶàÏàËÆÖ®´¦¡£ÔÚÒÔϸ÷  
½Ú˵Ã÷ÕâЩIPCµÄ¸÷×ÔÌØÊ⹦ÄÜ֮ǰ£¬ÎÒÃÇÏÈÔÚ±¾½Ú½éÉÜËüÃǵÄÀàËÆÌØÕ÷¡£  
        ÕâÈýÖÖIPCÔ´×ÔÓÚ1970ÄêµÄÒ»ÖÖ³ÆÎª"Columbus Unix"µÄUnixÄÚ²¿°æ±¾¡£ºó  
À´  
        ËüÃDZ»¼Óµ½SVÉÏ¡£  
14.6.1 ±êʶ·ûºÍ¹Ø¼ü×Ö  
ÿ¸öÔÚºËÖеÄIPC½á¹¹£¨ÏûÏ¢¶ÓÁС¢ÐźÅÁ¿»ò¹²Ïí´æ´¢¶Î£©¶¼ÓÃÒ»¸ö·Ç¸ºÕûÊýµÄ±ê  
ʶ·û¼ÓÒÔÒýÓá£ÀýÈ磬ΪÁ˶ÔÒ»¸öÏûÏ¢¶ÓÁз¢ËÍ»òÈ¡ÏûÏ¢£¬ÎÒÃÇÖ»ÐèÖªµÀÆä¶ÓÁбꠠ
ʶ·û¡£ÓëÎļþÃèÊö·û²»Í¬£¬IPC±êʶ·û²»ÊÇСµÄÕûÊý¡£µ±Ò»¸öIPC½á¹¹±»´´½¨£¬ÒÔºó  
ÓÖ±»É¾³ýʱ£¬ÓëÕâÖֽṹÏà¹ØµÄ±êʶ·ûÁ¬Ðø¼Ó1£¬Ö±ÖÁ´ïµ½Ò»¸öÕûÐÍÊýµÄ×î´óÕýÖµ  
£¬È»ºóÓÖ»Ø×ªµ½0¡££¨¼´Ê¹ÔÚIPC½á¹¹±»É¾³ýºóÒ²¼Çס¸ÃÖµ£¬Ã¿´ÎʹÓô˽ṹʱÔòÔö  
1£¬¸ÃÖµ±»³ÆÎª"²ÛʹÓÃ˳ÐòºÅ"¡£ËüÔÚipc_perm½á¹¹ÖУ¬ÎÒÃǽ«ÔÚÏÂÒ»½Ú˵Ã÷´Ë½á  
¹¹¡££©  
ÎÞÂÛºÎʱÔÚ´´½¨IPC½á¹¹Ê±£¨µ÷ÓÃmsgget¡¢semget»òshmget£©,¶¼Ó¦Ö¸¶¨Ò»¸ökey£¨  
¹Ø¼ü×Ö£©£¬¹Ø¼ü×ÖµÄÊý¾ÝÀàÐÍÓÉϵͳ¹æ¶¨Îªkey_t£¬Í¨³£ÔÚÍ·Îļþ<sys/types.h>ÖР 
±»¹æ¶¨Îª³¤ÕûÐÍ¡£¹Ø¼ü×ÖÓɺ˱任³É±êʶ·û¡£  
ÓжàÖÖ·½·¨Ê¹¿Í»§ºÍ·þÎñÕßÔÚͬһIPC½á¹¹ÉÏ»áºÏ¡£  
1. ·þÎñÕß¿ÉÒÔÖ¸¶¨¹Ø¼ü×ÖIPC_PRIVATE´´½¨Ò»¸öÐÂIPC½á¹¹£¬½«·µ»ØµÄ±êʶ·û´æ·Å  
ÔÚij´¦£¨ÀýÈçÒ»¸öÎļþ£©ÒÔ±ã¿Í»§È¡Ó᣹ؼü×ÖIPC_PRIVATE±£Ö¤·þÎñÕß´´½¨Ò»¸ö  
ÐÂIPC½á¹¹¡£ÕâÖÖ¼¼ÊõµÄȱµãÊÇ£»·þÎñÕßÒª½«ÕûÐͱêʶ·ûдµ½ÎļþÖУ¬È»ºó¿Í»§ÔÚ  
´ËºóÓÖÒª¶ÁÎļþÈ¡µÃ´Ë±êʶ·û¡£  
IPC_PRIVATE¹Ø¼ü×ÖÒ²¿ÉÓÃÓÚ¸¸¡¢×Ó¹ØÏµ½ø³Ì¡£¸¸½ø³ÌÖ¸¶¨IPC_PRIVATE´´½¨Ò»¸öР 
IPC½á¹¹£¬Ëù·µ»ØµÄ±êʶ·ûÔÚforkºó¿ÉÓÉ×Ó½ø³ÌʹÓá£×Ó½ø³Ì¿É½«´Ë±êʶ·û×÷Ϊex  
ecº¯ÊýµÄÒ»¸ö²ÎÊý´«¸øÒ»¸öгÌÐò¡£  
2. ÔÚÒ»¸ö¹«ÓÃÍ·ÎļþÖж¨ÒåÒ»¸ö¿Í»§ºÍ·þÎñÕß¶¼ÈϿɵĹؼü×Ö¡£È»ºó·þÎñÕßÖ¸¶¨  
´Ë¹Ø¼ü×Ö´´½¨Ò»¸öеÄIPC½á¹¹¡£ÕâÖÖ·½·¨µÄÎÊÌâÊǸùؼü×Ö¿ÉÄÜÒÑÓëÒ»¸öIPC½á¹¹  
Ïà½áºÏ£¬ÔÚ´ËÇé¿öÏ£¬getº¯Êý£¨msgget,semget»òshmget£©³ö´í·µ»Ø¡£·þÎñÕß±ØÐë  
´¦ÀíÕâÒ»´íÎó£¬É¾³ýÒÑ´æÔÚµÄIPC½á¹¹£¬È»ºóÊÔ×ÅÔÙ´´½¨Ëü¡£  
3. ¿Í»§ºÍ·þÎñÕßÈÏͬһ¸ö·¾¶ÃûºÍ¿ÎÌâID£¨¿ÎÌâIDÊÇÔÚ0~255Ö®¼äµÄ×Ö·ûÖµ£©£¬È»  
ºóµ÷Óú¯Êýftok½«ÕâÁ½¸öÖµ±ä»»ÎªÒ»¸ö¹Ø¼ü×Ö¡££¨º¯ÊýftokÔÚÊÖ²áÒ³stdipc£¨3£©  
ÖÐ˵Ã÷¡££©È»ºóÔÚ·½·¨2ÖÐʹÓô˹ؼü×Ö¡£ftokÌṩµÄΨһ·þÎñ¾ÍÊÇÓÉÒ»¸ö·¾¶Ãû  
ºÍ¿ÎÌâID²úÉúÒ»¸ö¹Ø¼ü×Ö¡£ÒòΪ¿Í»§ºÍ·þÎñÕßµäÐ͵ØÖÁÉÙ¹²ÏíÒ»¸öÍ·Îļþ£¬ËùÒÔÒ»  
¸ö±È½Ï¼òдµÄ·½·¨ÊDZÜÃâʹÓÃftok£¬¶øÖ»ÊÇÔÚ¸ÃÍ·ÎļþÖдæ·ÅÒ»¸ö´ó¼Ò¶¼ÖªµÀµÄ¹Ø  
¼ü×Ö¡£ÕâÑù×ö»¹±ÜÃâÁËʹÓÃÁíÒ»¸öº¯Êý¡£  
Èý¸ögetº¯Êý£¨msgget,semgetºÍshmget£©¶¼ÓÐÁ½¸öÀàËÆµÄ²ÎÊýkeyºÍÒ»¸öÕûÐ͵Äfl  
ag¡£ÈçÈôÂú×ãÏÂÁÐÌõ¼þ£¬Ôò´´½¨Ò»¸öеÄIPC½á¹¹£¨Í¨³£ÓÉ·þÎñÕß´´½¨£©£»  
1. keyÊÇIPC_PRIVATE£¬»ò  
2. keyµ±Ç°Ä©ÓëÌØ¶¨ÀàÐ͵ÄIPC½á¹¹Ïà½áºÏ£¬flagÖÐÖ¸¶¨ÁËIPC_CREATλ¡£Îª·ÃÎÊÏÖ  
´æµÄ¶ÓÁУ¨Í¨³£Óɿͻ§½øÐУ©£¬key±ØÐëµÈÓÚ´´½¨¸Ã¶ÓÁÐʱËùÖ¸¶¨µÄ¹Ø¼ü×Ö£¬²¢ÇÒ  
²»Ó¦Ö¸¶¨IPC_CREAT¡£  
    ×¢Ò⣬ΪÁË·ÃÎÊÒ»¸öÏÖ´æ¶ÓÁУ¬¾ö²»ÄÜÖ¸¶¨IPC_PRIVATE×÷Ϊ¹Ø¼ü×ÖÒòΪÕâÊÇ  
Ò»¸öÌØÊâµÄ¼üÖµ£¬Ëü×ÜÊÇÓÃÓÚ´´½¨Ò»¸öжÓÁС£ÎªÁË·ÃÎÊÒ»¸öÓÃIPC_PRIVATE¹Ø¼ü  
×Ö´´½¨µÄÏÖ´æ¶ÓÁУ¬Ò»¶¨ÒªÖªµÀÓë¸Ã¶ÓÁÐÏà½áºÏµÄ±êʶ·û£¬È»ºóÔÚÆäËüIPCµ÷ÓÃÖР 
£¨ÀýÈçmsgsnd¡¢msgrcv£©Ê¹Óøñêʶ·û¡£  
Èç¹ûÎÒÃÇÏ£Íû´´½¨Ò»¸öÐÂIPC½á¹¹£¬±£Ö¤²»ÊÇÒýÓþßÓÐͬһ±êʶ·ûµÄÒ»¸öÏÖÐÐIPC½á  
¹¹£¬ÄÇôÎÒÃDZØÐëÔÚflagÖÐͬʱָ¶¨IPC_CREATºÍIPC_EXCLλ¡£ÕâÑù×öÁËÒÔºó£¬Èç  
¹ûIPC½á¹¹ÒѾ­´æÔھͻáÔì³É³ö´í£¬·µ»ØEEXIST£¨ÕâÓëÖ¸¶¨ÁËO_CREATºÍO_EXCL±êÖ¾  
µÄopenÏàÀàËÆ£©¡£  
14.6.2 Ðí¿ÉȨ½á¹¹  
ϵͳV IPCΪÿһ¸öIPC½á¹¹ÉèÖÃÁËÒ»¸öipc_perm½á¹¹¡£¸Ã½á¹¹¹æ¶¨ÁËÐí¿ÉȨºÍÊôÖ÷  
¡£  
 struct  ipc_perm {  
  uid_t  uid;     ËùÓÐÕßµÄÓÐЧÓû§id  
  gid_t  gid;     ËùÓÐÕßµÄÓÐЧ×éid  
  uid_t  cuid;      ´´½¨ÕßµÄÓÐЧÓû§id  
  gid_t  cgid;     ´´½¨ÕßµÄÓÐЧ×éid  
  mode_t  mode;     ·ÃÎÊ·½Ê½  
  ulong  seq;     ²ÛʹÓÃÐòÁкŠ 
  key_t  key;      ¹Ø¼ü×Ö  
 }  
ÔÚ´´½¨IPC½á¹¹Ê±£¬³ýseqÒÔÍâµÄËùÓÐ×ֶζ¼¸³³õÖµ¡£ÒԺ󣬿ÉÒÔµ÷ÓÃmsgctl¡¢sem  
ctl»òshmctlÐÞ¸Äuid¡¢gidºÍmode×ֶΡ£ÎªÁ˸ıäÕâЩֵ£¬µ÷Óýø³Ì±ØÐë»òÕßÊÇIP  
C½á¹¹µÄ´´½¨Õߣ¬»òÕßÊdz¬¼¶Óû§¡£¸ü¸ÄÕâЩ×Ö¶ÎÀàËÆÓÚ¶ÔÎļþµ÷ÓÃchownºÍchmod  
¡£  
mode×ֶεÄÖµÀàËÆÓÚÔÚͼ4.4ÖÐËùʾµÄÖµ£¬µ«ÊǶÔÓÚÈκÎIPC½á¹¹¶¼²»´æÔÚÖ´ÐÐÐí¿É  
Ȩ¡£ÁíÍ⣬ÏûÏ¢¶ÓÁк͹²Ïí´æ´¢Ê¹ÓÃÊõÓï"¶Á"ºÍ"д"£¬¶øÐźÅÁ¿ÔòÓÃÊõÓï"¶Á"ºÍ"  
¸ü¸Ä"¡£Í¼14.14ÖжÔÿÖÖIPC˵Ã÷ÁËÁùÖÖÐí¿ÉȨ¡£  
ͼ14.14  ÏµÍ³V IPCÐí¿ÉȨ  
14.6.3 ½á¹¹ÏÞÖÆ  
ÈýÖÖÐÎʽµÄϵͳV IPC¶¼ÓÐÎÒÃÇ¿ÉÄÜ»áÓöµ½µÄÄÚÔÚÏÞÖÆ¡£ÕâЩÏÞÖÆµÄ´ó¶àÊýÊÇ¿ÉÒÔ  
ͨ¹ýÖØÐÂÅäÖöø¼ÓÒÔ¸ü¸ÄµÄ¡£µ±Ðð˵ÿÖÖIPCʱ£¬ÎÒÃǶ¼»áÖ¸³öËüµÄÏÞÖÆ  
    ÔÚSVR4ÖУ¬ÕâЩֵ£¬ÒÔ¼°ËüÃǵÄ×îС¡¢×î´óÖµ¶¼ÔÚÎļþ/etc/conf/cf.d/mtun  
eÖС£  
14.6.4 ÓÅ¡¢È±µã  
ϵͳV IPCµÄÖ÷ÒªÎÊÌâÊÇ£»IPC½á¹¹ÊÇÔÚϵͳ·¶Î§ÄÚÆð×÷Óõģ¬Ã»ÓзÃÎʼÆÊý¡£ÀýÈç  
£¬ÈçÈôÎÒÃÇ´´½¨ÁËÒ»¸öÏûÏ¢¶ÓÁУ¬ÔڸöÓÁÐÖзÅÈëÁ˼¸ÔòÏûÏ¢£¬È»ºóÖÕÖ¹£¬µ«ÊǸà 
ÏûÏ¢¶ÓÁм°ÆäÄÚÈݲ¢²»±»É¾³ý¡£ËüÃÇÓàÁôÔÚϵͳÖÐÖ±ÖÁ£»ÓÉij¸ö½ø³Ìµ÷ÓÃmsgrcv»ò  
msgctl¶ÁÏûÏ¢»òɾ³ýÏûÏ¢¶ÓÁУ»Ä³¸ö½ø³ÌÖ´ÐÐipcrm(1)ÃüÁîɾ³ýÏûÏ¢¶ÓÁУ»»òÓÉÕý  
ÔÚÔÙÆô¶¯µÄϵͳɾ³ýÏûÏ¢¶ÓÁС£½«´ËÓë¹ÜµÀpipeÏà±È£¬ÄÇôµ±×îºóÒ»¸ö·ÃÎʹܵÀµÄ  
½ø³ÌÖÕֹʱ£¬¹ÜµÀ¾Í±»ÍêÈ«µØÉ¾³ýÁË¡£¶ÔÓÚFIFO¶øÑÔËäÈ»µ±×îºóÒ»¸öÒýÓÃFIFOµÄ½ø  
³ÌÖÕֹʱÆäÃû×ÖÈÔ±£ÁôÔÚϵͳÖУ¬Ö±ÖÁÏÔʽµØÉ¾³ýËü£¬µ«ÊÇÁôÔÚFIFOÖеÄÊý¾ÝÈ´ÔÚ  
´Ëʱȫ²¿É¾³ý¡£  
ϵͳV IPCµÄÁíÒ»¸öÎÊÌâÊÇ£»ÕâЩIPC½á¹¹²¢²»°´Ãû×ÖΪÎļþϵͳËùÖª¡£ÎÒÃDz»ÄÜÓà 
µÚ3¡¢4ÕÂÖÐËùÊöµÄº¯ÊýÀ´´æÈ¡ËüÃÇ»òÐÞ¸ÄËüÃǵÄÌØÐÔ¡£ÎªÁËÖ§³ÖËüÃDz»µÃ²»Ôö¼ÓÁË  
Ê®¸öÒÔÉÏȫеÄϵͳµ÷Óã¨msgget¡¢semop¡¢shmatµÈ£©¡£ÎÒÃDz»ÄÜÓÃlsÃüÁî¼ûµ½Ëü  
ÃÇ£¬²»ÄÜÓÃrmÃüÁîɾ³ýËüÃÇ£¬²»ÄÜÓÃchmodÃüÁî¸ü¸ÄËüÃǵĴæÈ¡È¨¡£ÓÚÊÇ£¬Ò²²»µÃ  
²»Ôö¼ÓÁËȫеÄÃüÁîipcsºÍ ipcrm¡£  
ÒòΪÕâЩIPC²»Ê¹ÓÃÎļþÃèÊö·û£¬ËùÒÔÎÒÃDz»ÄܶÔËüÃÇʹÓöà·ת½ÓI/Oº¯Êý£ºsel  
ectºÍpoll¡£Õâ¾ÍʹµÃÄÑÓÚÔÚÒ»´ÎʹÓöà¸öIPC½á¹¹£¬ÄÑÓÚÓÃÎļþ»òÉ豸I/OÀ´Ê¹Óà 
ÈκÎÒ»¸öIPC½á¹¹¡£ÀýÈ磬ûÓÐijÖÖÐÎʽµÄæһµÈ´ýÑ­»·£¬ÎÒÃǾͲ»ÄÜʹһ¸ö·þÎñ  
ÕߵȴýÒ»¸öÏûÏ¢·ÅÔÚÁ½¸öÏûÏ¢¶ÓÁÐÖеÄÈÎÒ»¸öÉÏ¡£  
Andrade¡¢CargesÒÔ¼°Kovach[1989]¶ÔʹÓÃϵͳV IPCµÄÒ»¸öʵ¼ÊÊÂÎñ´¦Àíϵͳ½øÐР 
ÁË×ÛÊö¡£ËûÃÇÈÏΪϵͳV IPCʹÓõÄÃû×ֿռ䣨±êʶ·û£©ÊÇÒ»¸öÓÅµã¶ø²»ÊÇÎÒÃÇÔÚ  
Ç°ÃæËù˵µÄÎÊÌ⣬ÀíÓÉÊÇʹÓñêʶ·ûʹһ¸ö½ø³ÌֻҪʹÓõ¥¸öº¯Êýµ÷Óã¨msgsnd£©  
¾ÍÄܽ«Ò»¸öÏûÏ¢·¢Ë͵½Ò»¸ö¶ÓÁУ¬¶øÆäËüÐÎʽµÄIPCÔòͨ³£ÒªÇóopen,writeºÍclos  
e¡£ÕâÖÖÂÛ¾ÝÊDz»ÕæÊµµÄ¡£ÎªÁ˱ÜÃâʹÓÃÒ»¸ö¹Ø¼ü×ֺ͵÷ÓÃmsgget£¬¿Í»§×ÜÒªÒÔij  
ÖÖ·½Ê½»ñµÃ·þÎñÕß¶ÓÁеıêʶ·û¡£·ÖÅɸøÌض¨¶ÓÁеıêʶ·ûÈ¡¾öÓÚÔÚ´´½¨¸Ã¶ÓÁÐʱ  
£¬ÓжàÉÙÏûÏ¢¶ÓÁÐÒѾ­´æÔÚ£¬È¡¾öÓÚ×ÔºË×Ô¾ÙÒÔÀ´£¬ÔÚºËÖн«·ÖÅ䏸жÓÁеıíÏî  
ÒѾ­Ê¹ÓÃÁ˶àÉٴΡ£ÕâÊÇÒ»¸ö¶¯Ì¬Öµ£¬²»Äܱ»²Â²â»òÊÂÏÈ´æ·ÅÔÚÒ»¸öÍ·ÎļþÖС£Õý  
ÈçÎÒÃÇÔÚ14.6.1ÖÐËùÊö£¬ÖÁÉÙ·þÎñÕßÓ¦½«·ÖÅ䏸¶ÓÁеıêʶ·ûдµ½Ò»¸öÎļþÖÐÒԱ㠠
¿Í»§¶ÁÈ¡¡£  
ÕâЩ×÷ÕßÁоٵÄÏûÏ¢¶ÓÁÐµÄÆäËüÓŵãÊÇ£º£¨a£©ËüÃÇÊǿɿ¿µÄ£¨b£©Á÷ÊÇÊܵ½¿ØÖƵĠ 
£¬£¨c£©ÃæÏò¼Ç¼£¬£¨d£©¿ÉÒÔÓ÷ÇÏȽøÏȳö·½Ê½´¦Àí¡£ÕýÈçÎÒÃÇÔÚ12.4½ÚÖÐËù¼û£¬  
Á÷Ò²¾ßÓÐËùÓÐÕâЩÓŵ㣬ËäÈ»ÔÚÏòÒ»¸öÁ÷·¢ËÍÊý¾Ý֮ǰ£¬ÐèÒªÒ»¸öopen£¬ÔÚ½áÊøÊ±  
ÐèÒªÒ»¸öclose¡£Í¼14.15¶ÔÕâЩ²»Í¬ÐÎʽµÄIPCµÄÄ³Ð©ÌØÕ÷½øÐÐÁ˱Ƚϡ£  
ͼ14.15  ²»Í¬ÐÎʽIPCÖ®¼äÌØÕ÷µÄ±È½Ï  
£¨ÎÒÃǽ«ÔÚµÚÊ®ÎåÕ¶ÔUnixÁ÷ºÍÊý¾Ý±¨Ì×½Ó¿Ú½øÐмòҪ˵Ã÷¡££©±íÖеÄ"ÎÞÁ¬½Ó"£¬  
ÎÒÃÇÖ¸µÄÊÇÎÞÐèÏȵ÷ÓÃijÖÖÐÎʽµÄopen£¬¾ÍÄÜ·¢ËÍÏûÏ¢µÄÄÜÁ¦¡£ÕýÈçǰÊö£¬ÒòΪÐè  
ÒªÓÐijÖÖ¼¼ÊõÒÔ»ñµÃ¶ÓÁбêʶ·û£¬ËùÒÔÎÒÃDz¢²»ÈÏΪÏûÏ¢¶ÓÁоßÓÐÎÞÁ¬½ÓÌØÐÔ¡£Òò  
ΪËùÓÐÕâЩÐÎʽµÄIPC¶¼ÏÞÖÆÓÃÔÚµ¥Ö÷»úÉÏ£¬ËùÒÔËüÃǶ¼Êǿɿ¿µÄ¡£µ±ÏûϢͨ¹ýÍø  
Âç´«ËÍʱ£¬¶ªÊ§ÏûÏ¢µÄ¿ÉÄÜÐÔ¾ÍÒª¼ÓÒÔ¿¼ÂÇ¡£Á÷¿ØÖƵÄÒâ˼ÊÇ£ºÈç¹ûϵͳ×ÊÔ´¶Ìȱ  
£¨»º´æ£©»òÕßÈç¹û½ÓÊÕ½ø³Ì²»ÄÜÔÙ½ÓÊÕ¸ü¶àÏûÏ¢£¬Ôò·¢Ëͽø³Ì¾ÍҪ˯Ãß¡£µ±Á÷¿ØÖÆ  
Ìõ¼þÏûʧʱ£¬·¢Ëͽø³ÌÓ¦×Ô¶¯µØ±»»½ÐÑ¡£  
ÔÚͼ14.15ÖÐÎÒÃÇûÓбíʾµÄÒ»¸öÌØÕ÷ÊÇ£ºIPCÉèÊ©ÄÜ·ñ×Ô¶¯µØÎªÃ¿¸ö¿Í»§×Ô¶¯µØ´´  
½¨Ò»¸öµ½·þÎñÕßµÄΨһÁ¬½Ó¡£ÎÒÃǽ«ÔÚµÚÊ®ÎåÕÂÖÐ˵Ã÷£¬Á÷ÒÔ¼°UnixÁ÷Ì×½Ó¿ÚÌṩ  
ÕâÖÖÄÜÁ¦¡£  
ÏÂÃæÈý½Ú˳´Î¶ÔÈýÖÖÐÎʽµÄϵͳV IPC½øÐÐÏêϸ˵Ã÷¡£  
14.7ÏûÏ¢¶ÓÁÐ(Message Queues)  
    ÏûÏ¢¶ÓÁÐÊÇÏûÏ¢µÄÁ´½Ó±í,´æ·ÅÔÚºËÄÚ²¢ÓÉÏûÏ¢¶ÓÁбêʶ·û±êʶ¡£ÎÒÃǽ«³ÆÏû  
Ï¢¶ÓÁÐΪ"¶ÓÁÐ"£¬Æä±êʶ·ûΪ"¶ÓÁÐID"¡£msgget´´½¨Ò»¸öжÓÁлò´ò¿ªÒ»¸öÏÖ´æµÄ  
¶ÓÁС£msgsnd½«ÐÂÏûÏ¢Ìí¼Óµ½¶ÓÁÐβ¶Ë¡£Ã¿¸öÏûÏ¢°üº¬ÓÐÒ»¸öÕý³¤ÕûÐÍÀàÐÍ×ֶΣ¬  
Ò»¸ö·Ç¸º³¤¶ÈÒÔ¼°Êµ¼ÊÊý¾Ý×Ö½Ú£¨¶ÔÓ¦ÓÚ³¤¶È£©£¬ËùÓÐÕâЩ¶¼ÔÚ½«ÏûÏ¢Ìí¼Óµ½¶ÓÁР 
ʱ£¬´«Ë͸ømsgsnd¡£ÓÃmsgrcv´Ó¶ÓÁÐÖÐÈ¡ÏûÏ¢¡£ÎÒÃDz¢²»Ò»¶¨ÒªÒÔÏȽøÏȳö´ÎÐòÈ¡  
ÏûÏ¢¡£ÎÒÃÇ¿ÉÒÔ°´ÏûÏ¢µÄÀàÐÍ×Ö¶ÎÈ¡ÏûÏ¢¡£  
ÿ¸ö¶ÓÁж¼ÓÐÒ»¸ömsqid_ds½á¹¹ÓëÆäÏà¹Ø¡£´Ë½á¹¹¹æ¶¨Á˶ÓÁеĵ±Ç°×´Ì¬¡£  
 struct msqid_ds {  
  struct ipc_perm  msg_perm ;   ²Î¼û14.6.2 ½Ú  
  struct msg  *msg_first;    Ö¸Ïò¶ÓÁÐÖеÚÒ»ÌõÏûÏ¢µÄÖ¸Õë  
  struct msg  *msg_last;    Ö¸Ïò¶ÓÁÐÖÐ×îºóÒ»ÌõÏûÏ¢µÄÖ¸Õë  
  ulong   msg_cbytest;    ¶ÓÁÐÖеĵ±Ç°×ֽںŠ 
  ulong     msg_qnum;    ¶ÓÁÐÖеÄÏûÏ¢Êý  
  ulong   msg_qbytes;    ¶ÓÁÐÖеÄ×î´ó×Ö½ÚÊý  
  pid_t   msg_lspid;    ×îºómsgsnd()µÄpid  
  pid_t  msg_lrpid;    ×îºómsgrcv()µÄpid  
  time_t  msg_stime    ×îºómsgsnd()ʱ¼ä  
  time_t  msg_rtime    ×îºómsgrcv()ʱ¼ä  
  time_t  msg_ctime;    ×îºó¸ü¸Äʱ¼ä  
 };  
Á½¸öÖ¸ÕëmsgfirstºÍmsglast·Ö±ðÖ¸ÏòÏàÓ¦ÏûÏ¢ÔÚºËÄڵĴæ·ÅλÖã¬ËùÒÔËüÃǶÔÓà 
»§½ø³Ì¶øÑÔÊÇÎÞ¼ÛÖµµÄ¡£½á¹¹µÄÆäËû³ÉÔ±ÊÇ×Ô¶¨ÒåµÄ¡£  
  Í¼14.16ÁгöÁËÓ°ÏìÏûÏ¢¶ÓÁеÄϵͳÏÞÖÆ£¨14¡£6¡£3½Ú£©¡£  
ͼ14.6Ó°ÏìÏûÏ¢¶ÓÁеÄϵͳÏÞÖÆ  
  µ÷ÓõĵÚÒ»¸öº¯Êýͨ³£ÊÇmsgget£¬Æä¹¦ÄÜÊÇ´ò¿ªÒ»¸öÏÖ´æ¶ÓÁлò´´½¨Ò»¸öжÓÁР 
¡£  
 #include <sys/types.h>  
 #include  <sys/ipc.h>  
 #include  <sys/msg.h>  
 int msgget(key_t  key, int flag);  
        ·µ»Ø£ºÈô³É¹¦ÎªÏûÏ¢¶ÓÁÐID£¬³ö´íΪ-1  
 ÔÚ14.6½ÚÖУ¬ÎÒÃÇ˵Ã÷Á˽«key±ä»»³ÉÒ»¸ö±êʶ·ûµÄ¹æÔò£¬²¢ÇÒÌÖÂÛÊÇ·ñ´´½¨Ò»¸ö  
жÓÁлò·ÃÒ»¸öÏÖ´æ¶ÓÁС£µ±´´½¨Ò»¸öжÓÁÐʱ£¬³õʼ»¯msqid-ds½á¹¹µÄÏÂÁгÉÔ±  
¡Ã  
   ¡¤ipc-perm½á¹¹°´14.6.2½ÚÖÐËùÊö½øÐгõʼ»¯¡£¸Ã½á¹¹ÖÐmode°´flag£»ÖеÄÏà  
Ó¦Ðí¿ÉȨλÉèÖá£ÕâЩÐí¿ÉȨÓÃͼ14.14Öеij£ÊýÖ¸¶¨  
   ¡¤ msg_qnum,msg_lspid¡¢msg_lrpid¡¢msg_stimeºÍmsg_rtime¶¼ÉèÖÃΪ0¡£  
   ¡¤ msg_ctimeÉèÖÃΪµ±Ç°Ê±¼ä¡£  
   ¡¤ msg_gbytesÉèÖÃΪϵͳÏÞÖÆÖµ¡£  
ÈôÖ´Ðгɹ¦£¬Ôò·µ»Ø·Ç¸º¶ÓÁÐID¡£´Ëºó£¬´ËÖµ¾Í¿É±»ÓÃÓÚÆäËüÈý¸öÏûÏ¢¶ÓÁк¯Êý¡£  
   
msgctlº¯Êý¶Ô¶ÓÁÐÖ´ÐжàÖÖ²Ù×÷¡£ËüÒÔ¼°ÁíÍâÁ½¸öÓëÐźÅÁ¿ºÍ¹²Ïí´æ´¢Óйصĺ¯Êý  
(semctlºÍshmctl)ÊÇϵͳV IPCµÄÀàËÆÓÚioctlµÄº¯Êý£¨Ò༴À¬»øÍ°º¯Êý£©¡£  
#include <sys/types.h>  
#include <sys/ipc.h>  
#include <sys/msg.h>  
int msgctl(int msqid, int cmd, struct msqid_ds  *buf);  
       ·µ»Ø£ºÈô³É¹¦Îª0£¬³ö´íΪ-1  
cmd²ÎÊýÖ¸¶¨¶ÔÓÚÓÉmsqid¹æ¶¨µÄ¶ÓÁÐÒªÖ´ÐеÄÃüÁ  
    IPC_STAT  È¡´Ë¶ÓÁеÄmsqid_ds½á¹¹£¬²¢½«Æä´æ·ÅÔÚbufÖ¸ÏòµÄ½á¹¹ÖС£  
    IPC_SET   °´ÓÉbufÖ¸ÏòµÄ½á¹¹ÖеÄÖµ£¬ÉèÖÃÓë´Ë¶ÓÁÐÏà¹ØµÄ½á¹¹ÖеÄÏÂÁÐËÄ  
¸ö×Ö¶Îmsg_perm.uid¡¢msg_perm.gid¡¢msg_perm;modeºÍmsg_qbytes¡£´ËÃüÁîÖ»ÄÜ  
ÓÉÏÂÁÐÁ½ÖÖ½ø³ÌÖ´ÐУºÒ»ÖÖ½ø³ÌÊÇÆäÓÐЧÓû§IDµÈÓÚmsg_perm.   cuid»òmsg_per  
m.uid;ÁíÒ»ÖÖ½ø³ÌÊǾßÓг¬¼¶Óû§ÌØÈ¨µÄ½ø³Ì¡£Ö»Óг¬¼¶Óû§²ÅÄÜÔö¼Ómsg_qbyte  
sµÄÖµ  
    IPC-RMID  ´ÓϵͳÖÐɾ³ý¸ÃÏûÏ¢¶ÓÁÐÒÔ¼°ÈÔÔڸöÓÁÐÉϵÄËùÓÐÊý¾Ý¡£ÕâÖÖɾ³ý  
ÊÇÁ¢¼´ÉúЧµÄ¡£ÈÔÔÚʹÓÃÕâÒ»ÏûÏ¢¶ÓÁÐµÄÆäËü½ø³ÌÔÚËüÃÇÏÂÒ»´ÎÊÔͼ¶Ô´Ë¶ÓÁнøÐР 
²Ù×÷ʱ£¬½«³ö´í·µ»Ø£¬´íÎóºÅΪEIDRM¡£´ËÃüÁîÖ»ÄÜÓÉÏÂÁÐÁ½ÖÖ½ø³ÌÖ´ÐУºÒ»ÖÖ½ø  
³ÌÊÇÆäÓÐЧÓû§IDµÈÓÚmsg_perm.cuid»òmsg_perm.uid;ÁíÒ»ÖÖ½ø³ÌÊǾßÓг¬¼¶Óû§  
ÌØÈ¨µÄ½ø³Ì¡£  
ÎÒÃǽ«»á¿´µ½ÕâÈýÌõÃüÁIPC_STAT¡¢IPC_SETºÍIPC_RMID£©Ò²ÓÃÓÚÐźÅÁ¿ºÍ¹²Ïí  
´æ´¢¡£  
µ÷ÓÃmsgsnd½«Êý¾Ý·Åµ½ÏûÏ¢¶ÓÁÐÉÏ¡£  
#include <sys/types.h>  
#include <sys/ipc.h>  
#include <sys/msg.h>  
int msgsnd(int msqid, const void *ptr, size_t nbytes, int flag);  
       ·µ»Ø£ºÈô³É¹¦Îª0£¬³ö´íΪ-1  
ÕýÈçÎÒÃÇÔÚÇ°ÃæÌá¼°µÄ£¬Ã¿¸öÏûÏ¢¶¼ÓÉÈý²¿·Ö×é³É£¬ËüÃÇÊÇ£ºÕý³¤ÕûÐÍÀàÐÍ×ֶΡ¢  
·Ç¸º³¤¶È£¨nbytes£©ÒÔ¼°Êµ¼ÊÊý¾Ý×Ö½Ú£¨¶ÔÓ¦ÓÚ³¤¶È£©¡£ÏûÏ¢×ÜÊÇ·ÅÔÚ¶ÓÁÐβ¶Ë¡£  
   
PtrÖ¸ÏòÒ»¸ö³¤ÕûÐÍÊý£¬Ëü°üº¬ÁËÕýÕûÐÍÏûÏ¢ÀàÐÍ£¬ÔÚÆäºóÁ¢¼´¸úËæÁËÏûÏ¢Êý¾Ý¡£  
£¨ÈônbytesÊÇ0£¬ÔòÎÞÏûÏ¢Êý¾Ý¡££©ÈôÎÒÃÇ·¢Ë͵Ä×ÏûÏ¢ÊÇ512×Ö½Ú£¬Ôò¿É¶¨ÒåÏ  
Áнṹ£º  
struct mymesg {  
 long mtypes;   ÕýµÄÏûÏ¢ÀàÐÍ  
 char mtext[512];  ÏûÏ¢Êý¾Ý£¬³¤¶ÈΪnbytes  
};  
ÓÚÊÇ£¬ptr¾ÍÊÇÒ»¸öÖ¸Ïòmymesg½á¹¹µÄÖ¸Õë¡£½ÓÊÕÕß¿ÉÒÔʹÓÃÏûÏ¢ÀàÐÍÒÔ·ÇÏȽøÏÈ  
³öµÄ´ÎÐòÈ¡ÏûÏ¢¡£  
    flagµÄÖµ¿ÉÒÔÖ¸¶¨ÎªIPC_NOWAIT¡£ÕâÀàËÆÓÚÎļþI/OµÄ·Ç×èÈûI/O±êÖ¾£¨¼û12.  
2£©¡£ÈôÏûÏ¢¶ÓÁÐÒÑÂú£¨»òÕßÊǶÓÁÐÖеÄÏûÏ¢×ÜÊýµÈÓÚϵͳÏÞÖÆÖµ£¬»ò¶ÓÁÐÖеÄ×Ö  
½Ú×ÜÊýµÈÓÚϵͳÏÞÖÆÖµ£©£¬ÔòÖ¸¶¨IPC_NOWAIT  
ʹµÃmsgsndÁ¢¼´³ö´í·µ»Ø£¬³ö´íºÅÊÇEAGAIN¡£ÈçÈôûÓÐÖ¸¶¨IPC_NOWAIT£¬Ôò½ø³Ì×è  
ÈûÖ±µ½£¨a£©Óпռä¿ÉÒÔÈÝÄÉÒª·¢Ë͵ÄÏûÏ¢£¬£¨b£©´ÓϵͳÖÐɾ³ýÁ˴˶ÓÁУ¬»ò£¨c  
£©²¶×½µ½Ò»¸öÐźţ¬²¢´ÓÐźŴ¦Àí³ÌÐò·µ»Ø¡£ÔÚµÚ¶þÖÖÇé¿ö£¬·µ»Ø³ö´íºÅEIDRM£¨  
"±êÖ¾·û±»É¾³ý"£©£¬×îºóÒ»ÖÖÇé¿öÔò·µ»Ø³ö´íºÅEINTR¡£  
×¢Ò⣬¶ÔÏûÏ¢¶ÓÁÐɾ³ýµÄ´¦ÀíÊDz»ºÜµÃÌåµÄ¡£ÒòΪ¶Ôÿ¸öÏûÏ¢¶ÓÁв¢Ã»ÓÐÉèÖÃÒ»¸ö  
ÒýÓüÆÊýÆ÷£¨¶Ô´ò¿ªÎļþÔòÓÐÕâÖÖ¼ÆÊýÆ÷£©£¬ËùÒÔɾ³ýÒ»¸ö¶ÓÁÐʹµÃÈÔÔÚʹÓÃÕâÒ»  
¶ÓÁеĽø³ÌÔÚÏ´ζԶÓÁнøÐвÙ×÷ʱ²úÉú³ö´í·µ»Ø¡£ÐźÅÁ¿»ú¹¹Ò²ÒÔͬÑù·½Ê½´¦Àí  
Æäɾ³ý¡£É¾³ýÒ»¸öÎļþÔòÒªµÈµ½Ê¹ÓøÃÎļþµÄ×îºóÒ»¸ö½ø³Ì¹Ø±ÕÁËËü£¬²Åɾ³ýÎļþ  
µÄÄÚÈÝ¡£  
Msgrcv´Ó¶ÓÁÐÖÐÈ¡ÓÃÏûÏ¢  
#include <sys/types.h>  
#include <sys/ipc.h>  
#include <sys/msg.h>  
int msgrcv(int msqid, void *ptr, size_t nbytes, long type, int flag);  
       ·µ»Ø£ºÈô³É¹¦ÎªÏûÏ¢Êý¾Ý²¿·ÖµÄ³¤¶È£¬³ö´íΪ-1  
    ÈçͬmsgsndÖÐÒ»Ñù£¬ptr²ÎÊýÖ¸ÏòÒ»¸ö³¤ÕûÐÍÊý£¨·µ»ØµÄÏûÏ¢ÀàÐÍ´æ·ÅÔÚÆäÖР 
£©£¬¸úËæÆäºóµÄÊÇ´æ·Åʵ¼ÊÏûÏ¢Êý¾ÝµÄ»º´æ¡£nbytes˵Ã÷Êý¾Ý»º´æµÄ³¤¶È¡£Èô·µ»Ø  
µÄÏûÏ¢´óÓÚnbytes£¬¶øÇÒÔÚflagÖÐÉèÖÃMSG_  
NOERROR£¬Ôò¸ÃÏûÏ¢¾Í±»½Ø¶Ì¡££¨ÔÚÕâÖÖÇé¿öÏ£¬²»Í¨ÖªÎÒÃÇÏûÏ¢½Ø¶ÌÁË¡££©Èç¹û  
ûÓÐÉèÖÃÕâÒ»±êÖ¾£¬¶øÏûÏ¢ÓÖÌ«³¤£¬Ôò³ö´í·µ»Ø£¬³ö´íºÅÊÇEIBIG£¨ÏûÏ¢ÈÔÁôÔÚ¶Ó  
ÁÐÖУ©¡£  
   ²ÎÊýtypeʹÎÒÃÇ¿ÉÒÔÖ¸¶¨ÏëÒªÄÄÒ»ÖÖÏûÏ¢:  
   type== ·µ»Ø¶ÓÁÐÖеĵÚÒ»¸öÏûÏ¢¡£  
   type>0 ·µ»Ø¶ÓÁÐÖÐÏûÏ¢ÀàÐÍΪtypeµÄµÚÒ»¸öÏûÏ¢¡£  
   type<0 ·µ»Ø¶ÓÁÐÖÐÏûÏ¢ÀàÐÍֵСÓÚ»òµÈÓÚtype¾ø¶ÔÖµ£¬¶øÇÒÔÚÕâÖÖÏûÏ¢ÖУ¬Æä  
ÀàÐÍÖµÓÖ×îСµÄÏûÏ¢¡£  
·Ç0typeÓÃÓÚÒÔ·ÇÏȽøÏȳö´ÎÐò¶ÁÏûÏ¢¡£ÀýÈ磬ÈôÓ¦ÓóÌÐò¶ÔÏûÏ¢¸³ÓÅÏÈȨ£¬ÄÇô  
type¾Í¿ÉÒÔÊÇÓÅÏÈȨֵ¡£Èç¹ûÒ»¸öÏûÏ¢¶ÓÁÐÓɶà¸ö¿Í»§ºÍÒ»¸ö·þÎñÕßʹÓã¬ÄÇôt  
ype×ֶοÉÒÔÓÃÀ´°üº¬¿Í»§½ø³ÌID¡£  
    ÎÒÃÇ¿ÉÒÔÖ¸¶¨flagֵΪIPC_NOWAIT£¬Ê¹²Ù×÷²»×èÈû¡£ÕâÔì³ÉÈç¹ûûÓÐËùÖ¸¶¨Àà  
Ð͵ÄÏûÏ¢£¬Ôòms  
-grcv³ö´í·µ»Ø£¬³ö´íºÅΪENOMSG¡£Èç¹ûûÓÐÖ¸¶¨IPC_NOWAIT£¬Ôò½ø³Ì×èÈûÖ±ÖÁ£¨  
a£©ÓÐÁËÖ¸¶¨ÀàÐ͵ÄÏûÏ¢£¬£¨b£©´ÓϵͳÖÐɾ³ýÁ˴˶ÓÁУ¨·µ»Ø³ö´íºÅEIDRM£©£¬»ò  
£¨c£©²¶×½µ½Ò»¸öÐźŲ¢´ÓÐźŴ¦Àí³ÌÐò·µ»Ø£¨·µ»Ø³ö´íºÅEINTR£©¡£  
ʵÀýÒ»ÏûÏ¢¶ÓÁжÔÁ÷¹ÜµÀµÄʱ¼ä±È½Ï  
    ÈçÈôÐèÒªÔÚ¿Í»§ºÍ·þÎñÕßÖ®¼äµÄË«ÏòÊý¾ÝÁ÷£¬ÎÒÃÇ¿ÉÒÔʹÓÃÏûÏ¢¶ÓÁлòÁ÷¹ÜµÀ  
¡££¨ÎÒÃÇÔÚ15.2½éÉÜÁ÷¹ÜµÀ£¬ËüÓë¹ÜµÀÀàËÆ£¬µ«ÊÇÊÇȫ˫¹¤µÄ¡££©  
    Í¼14.17ÏÔʾÁËÔÚÁ½¸ö²»Í¬ÏµÍ³ÉÏÕâÁ½ÖÖ¼¼ÊõÔÚʱ¼ä·½ÃæµÄ±È½Ï¡£²âÊÔ³ÌÐòÏÈ  
´´½¨IPCͨµÀ£¬µ÷ÓÃfork£¬È»ºó´Ó¸¸½ø³ÌÏò×Ó½ø³Ì·¢ËÍ20mbytesÊý¾Ý¡£Êý¾Ý·¢Ë͵Ġ 
·½Ê½ÊÇ£º¶ÔÓÚÏûÏ¢¶ÓÁУ¬µ÷ÓÃ10£¬000´Îmsgsnd£¬Ã¿¸öÏûÏ¢³¤¶ÈΪ20£¬000bytes£»  
¶ÔÓÚÁ÷¹ÜµÀ£¬µ÷ÓÃ10£¬000´Îwrite,ÿ´Îд20£¬000bytes¡£Ê±¼ä¶¼ÒÔÃëΪµ¥Î»¡£  
ͼ14.17 ÏûÏ¢¶ÓÁкÍÁ÷¹ÜµÀµÄʱ¼ä±È½Ï  
ÔÚSPARCÉÏ£¬Á÷¹ÜµÀÊÇÓÃUnixÓòÌ×½Ó¿ÚʵÏֵġ£ÔÚSVR4֮ϣ¬pipeº¯ÊýÌṩÁ÷¹ÜµÀ  
£¨Ê¹ÓÃÎÒÃÇÔÚ12.4ÖÐËùÊöµÄÁ÷»úÖÆ£©¡£  
    ´ÓÕâЩÊý×ÖÖпɼû£¬ÏûÏ¢¶ÓÁÐÔ­À´µÄʵʩĿµÄÊÇÌṩ±ÈÒ»°ãIPC¸ü¸ßËٶȵĽø  
³ÌͨÐÅ·½·¨£¬µ«ÏÖÔÚÓëÆäËüÐÎʽµÄIPCÏà±È£¬ÔÚËÙ¶È·½ÃæÒѾ­Ã»ÓÐʲô²î±ðÁË¡££¨  
ÔÚÔ­À´ÊµÊ©ÏûÏ¢¶ÓÁÐʱ£¬Î¨Ò»µÄÆäËüÐÎʽµÄIPCÊǰëË«¹¤¹ÜµÀ¡££©µ±ÎÒÃÇ¿¼Âǵ½Ê¹  
ÓÃÏûÏ¢¶ÓÁоßÓеÄÎÊÌâʱ£¨14.6.4£©£¬ÎÒÃǵóöµÄ½áÂÛÊÇ£¬ÔÚеÄÓ¦ÓóÌÐòÖв»Ó¦  
µ±ÔÙʹÓÃËüÃÇ¡£  
14.8 ÐźÅÁ¿£¨Semaphores£©  
    ÐźÅÁ¿ÓëÎÒÃÇÒѾ­½éÉܹýµÄIPC»ú¹¹£¨¹ÜµÀ¡¢FIFOÒÔ¼°ÏûÏ¢Áжӣ©²»Í¬¡£ËüÊÇ  
Ò»¸ö¼ÆÊýÆ÷£¬ÓÃÓÚ¶à½ø³Ì¶Ô¹²ÏíÊý¾Ý¶ÔÏóµÄ´æÈ¡¡£ÎªÁË»ñµÃ¹²Ïí×ÊÔ´£¬½ø³ÌÐèÒªÖ´  
ÐÐÏÂÁвÙ×÷£º  
1. ²âÊÔ¿ØÖƸÃ×ÊÔ´µÄÐźÅÁ¿¡£  
2. Èô´ËÐźÅÁ¿µÄֵΪÕý£¬Ôò½ø³Ì¿ÉÒÔʹÓøÃ×ÊÔ´¡£½ø³Ì½«ÐźÅÁ¿Öµ¼õ1£¬±íʾËüʹ  
ÓÃÁËÒ»¸ö×ÊÔ´µ¥Î»¡£  
3. Èô´ËÐźÅÁ¿µÄֵΪ0£¬Ôò½ø³Ì½øÈë˯Ãß״̬£¬Ö±ÖÁÐźÅÁ¿Öµ´óÓÚ0¡£Èô½ø³Ì±»»½  
ÐѺó£¬Ëü·µ»ØÖÁ²½Öè1¡£  
µ±½ø³Ì²»ÔÙʹÓÃÓÉÒ»¸öÐÅÏ¢Á¿¿ØÖƵĹ²Ïí×ÊԴʱ£¬¸ÃÐźÅÁ¿ÖµÔö1¡£Èç¹ûÓнø³ÌÕý  
ÔÚ˯Ãߵȴý´ËÐźÅÁ¿£¬Ôò»½ÐÑËüÃÇ¡£  
¡¡¡¡ÎªÁËÕýÈ·µØÊµÏÖÐÅÏ¢Á¿£¬ÐźÅÁ¿ÖµµÄ²âÊÔ¼°¼õ1²Ù×÷Ó¦µ±ÊÇÔ­×Ó²Ù×÷¡£Îª´Ë£¬  
ÐźÅÁ¿Í¨³£ÊÇÔÚºËÄÚʵÏֵġ£  
    ³£ÓõÄÐźÅÁ¿ÐÎʽ±»³ÆÖ®ÎªË«Ì¬ÐźÅÁ¿¡£Ëü¿ØÖƵ¥¸ö×ÊÔ´£¬Æä³õÊÔֵΪ1¡£µ«  
ÊÇ£¬Ò»°ã¶øÑÔ£¬ÐźÅÁ¿µÄ³õÖµ¿ÉÒÔÊÇÈÎÒ»ÕýÖµ£¬¸Ãֵ˵Ã÷ÓжàÉÙ¸ö¹²Ïí×ÊÔ´µ¥Î»¿É  
¹©¹²ÏíÓ¦Óᣠ 
²»ÐÒµÄÊÇ£¬ÏµÍ³VµÄÐźÅÁ¿Óë´ËÏà±ÈÒª¸´ÔӵöࡣÈýÖÖÌØÐÔÔì³ÉÁËÕâÖÖ²¢·Ç±ØÒªµÄ  
¸´ÔÓÐÔ¡£  
1. Ò»¸öÐźÅÁ¿²¢·ÇÊÇÒ»¸ö·Ç¸ºÖµ¡£´úÖ®ÒÔÎÒÃDZØÐ轫һ¸öÐźÅÁ¿¶¨ÒåΪº¬ÓÐÒ»¸ö  
»ò¶à¸öÐźÅÁ¿ÖµµÄ¼¯ºÏ¡£µ±´´½¨Ò»¸öÐźÅÁ¿Ê±£¬ÎÒÃÇÒªÖ¸¶¨¸Ã¼¯ºÏÖеĸ÷¸öÖµ  
2. ´´½¨ÐÅÏ¢Á¿£¨semget£©Óë¶ÔÆä¸³³õÖµ£¨semctl£©·Ö¿ª¡£ÕâÊÇÒ»¸öÖÂÃüµÄÈõµã£¬  
ÒòΪÎÒÃDz»ÄÜÔ­×ӵش´½¨Ò»¸öÐźÅÁ¿¼¯ºÏ£¬²¢ÇҶԸü¯ºÏÖеÄËùÓÐÖµ¸³³õÖµ¡£  
3. ¼´Ê¹Ã»Óнø³ÌÕýÔÚʹÓø÷ÖÖÐÎʽµÄϵͳV IPCËüÃÇÈÔÈ»ÊÇ´æÔڵģ¬ËùÒÔ²»µÃ²»Îª  
ÕâÖÖ³ÌÐòµ£ÐÄ£¬ËüÔÚÖÕֹʱ²¢Ã»ÓÐÊÍ·ÅÒѾ­·ÖÅ䏸ËüµÄÐźÅÁ¿¡£½«ÔÚÏÂÃæËµÃ÷µÄ"  
undo"¹¦ÄܾÍÊǼٶ¨Òª´¦ÀíÕâÖÖÇé¿öµÄ¡£  
    ºËΪÿ¸öÐźÅÁ¿ÉèÖÃÁËÒ»¸ösemid_ds½á¹¹¡£  
   struct semid_ds {  
    struct ipc_perm  sem_perm;   ¼û14.6.2½Ú  
    struct sem  *sem_base;    Ö¸Ïò¼¯ÖеĵÚÒ»¸öÐźÅÁ¿  
    ushort   sem_nsems;    ¼¯ÖеÄÐźÅÁ¿Êý  
    time_t   sem_otime;    ×îºósemop()ʱ¼ä  
    time_t  sem_ctime;    ×îºó¸ü¸Äʱ¼ä  
   }£»  
¡¡¡¡¶ÔÓû§¶øÑÔ£¬sem_baseÖ¸ÕëÊÇûÓмÛÖµµÄ£¬ËüÖ¸ÏòºËÄÚµÄsem½á¹¹Êý×飬¸ÃÊý  
×éÖаüº¬ÁËsem_nsems¸öÔªËØÃ¿¸öÔªËØ£¬¸÷¶ÔÓ¦ÓÚ¼¯ºÏÖеÄÒ»¸öÐźÅÁ¿Öµ¡£  
struct sem {  
 ushort  semval;      ÐźÅÁ¿Öµ£¬×ÜÊÇ>=0  
 pid_t  sempid;      ×îºó²Ù×÷µÄpid  
 ushort  semncnt;      µÈ´ýsemval>currvalµÄ½ø³ÌÊý  
 ushort  semzcnt;      µÈ´ýsemval=0µÄ½ø³ÌÊý  
};  
    Í¼14.18ÁгöÁËÓ°ÏìÐźÅÁ¿¼¯ºÏµÄϵͳÏÞÖÆ£¨¼û14.6.3£©  
ͼ14.18  Ó°ÏìÐźÅÁ¿µÄϵͳÏÞÖÆ  
Òªµ÷ÓõĵÚÒ»¸öº¯ÊýÊÇsemgetÒÔ»ñµÃÒ»¸öÐźÅÁ¿£É£Ä¡£  
#include <sys/types.h>  
 #include  <sys/ipc.h>  
 #include  <sys/sem.h>  
 int semget(key_t  key, int nsems, int flag);  
        ·µ»Ø£ºÈô³É¹¦·µ»ØÐźÅÁ¿ID£¬³ö´íΪ-1  
    ÔÚ14.6.1ÖУ¬ÎÒÃÇ˵Ã÷Á˽«key±ä»»Îª±êʶ·ûµÄ¹æÔò£¬ÌÖÂÛÁËÊÇ·ñ´´½¨Ò»¸öР 
¼¯ºÏ£¬»òÊÇÒýÓÃÒ»¸öÏÖ´æµÄ¼¯ºÏ¡£µ«´´½¨Ò»¸öм¯ºÏʱ£¬¶Ôsemid_ds½á¹¹µÄÏÂÁгɠ 
Ô±¸³³õÖµ£º  
l °´14.6.2½ÚÖÐËùÊö£¬¶Ôipc_perm½á¹¹¸³³õÖµ¡£¸Ã½á¹¹ÖеÄmode±»ÉèÖÃΪflagÖеĠ 
ÏàÓ¦Ðí¿ÉȨλ¡£ÕâЩÐí¿ÉȨÊÇÓÃͼ14.14Öеij£ÊýÉèÖõġ£  
l sem_otimeÉèÖÃΪ0¡£  
l sem_ctimeÉèÖÃΪµ±Ç°Ê±¼ä¡£  
l sem_nsem¡¡ÉèÖÃΪnsems¡£  
nsemsÊǸü¯ºÏÖеÄÐźÅÁ¿Êý¡£Èç¹ûÊÇ´´½¨Ð¼¯ºÏ£¨µäÐ͵ØÔÚ·þÎñÕßÖУ©£¬ÎÒÃDZؠ 
ÐëÖ¸¶¨nsems¡£Èç¹ûÒýÓÃÒ»¸öÏÖ´æµÄ¼¯ºÏ£¨Ò»¸ö¿Í»§£©£¬Ôò½«nsemsÖ¸¶¨Îª0¡£  
semctlº¯Êý°üº¬Á˶àÖÖÐźÅÁ¿²Ù×÷¡£  
#include <sys/types.h>  
 #include  <sys/ipc.h>  
 #include  <sys/sem.h>  
 int semctl(int semid, int semnum, int cmd, union semun arg);  
×¢Ò⣬×îºóÒ»¸ö²ÎÊýÊǸöÁªºÏ£¨union£©£¬¶ø·ÇÖ¸ÏòÒ»¸öunionµÄÖ¸Õë¡£  
 union semun {  
  int      l;   ÓÃÓÚSETVAL  
  struct  semid_ds   *bf;   ÓÃÓÚIPC_STATºÍIPC_SET  
  ushort    *array;  ÓÃÓÚGETALLºÍSETALL  
 };  
Cmd²ÎÊýÖ¸¶¨ÏÂÁÐÊ®ÖÖÃüÁîÖеÄÒ»ÖÖ£¬Ê¹ÆäÔÚsemidÖ¸¶¨µÄÐźÅÁ¿¼¯ºÏÉÏÖ´ÐдËÃüÁî  
¡£ÆäÖÐÓÐÎåÌõÃüÁîÊÇÕë¶ÔÒ»¸öÌØ¶¨µÄÐźÅÁ¿ÖµµÄ£¬ËüÃÇÓÃsemnumÖ¸¶¨¸Ã¼¯ºÏÖеÄÒ»  
¸ö³ÉÔ±¡£SemnumÖµÔÚ0ºÍnsems-1Ö®¼ä£¨°üÀ¨0ºÍnsem-1£©¡£  
IPC_STAT¡¡¡¡¶Ô´Ë¼¯ºÏÈ¡semid_ds½á¹¹£¬²¢´æ·ÅÔÚÓÉarg.bufÖ¸ÏòµÄ½á¹¹ÖС£  
IPC_SET¡¡¡¡ °´ÓÉarg.bufÖ¸ÏòµÄ½á¹¹ÖеÄÖµÉèÖÃÓë´Ë¼¯ºÏºÍÏà¹Ø½á¹¹ÖеÄÏÂÁÐÈý  
¸ö  
            ×Ö¶ÎÖµ£ºsem_perm,sem_perm.gidºÍsem_perm.mode¡£´ËÃüÁîÖ»ÄÜÓÉÏ  
ÁР 
¡¡¡¡¡¡¡¡¡¡¡¡Á½ÖÖ½ø³ÌÖ´ÐУºÒ»ÖÖ½ø³ÌÊÇÆäÓÐЧÓû§IDµÈÓÚsem_perm.cuid»òsem_  
   
            perm.uid;ÁíÒ»ÖÖ½ø³ÌÊǾßÓг¬¼¶Óû§ÌØÈ¨µÄ½ø³Ì¡£  
IPC_RMIK¡¡¡¡´ÓϵͳÖÐɾ³ý¸ÃÐźÅÁ¿¼¯ºÏ¡£ÕâÖÖɾ³ýÊÇÁ¢¼´µÄ¡£ÈÔÔÚʹÓôËÐźÅÁ¿  
µÄ  
¡¡¡¡¡¡¡¡¡¡¡¡ÆäËü½ø³ÌÔÚËüÃÇÏ´ÎÒâͼ¶Ô´ËÐźÅÁ¿½øÐвÙ×÷ʱ£¬½«³ö´í·µ»Ø£¬´íÎó  
ºÅ  
            ÊÇEIDRM¡£´ËÃüÁîÖ»ÄÜÓÉÏÂÁÐÁ½ÖÖ½ø³ÌÖ´ÐУºÒ»ÖÖ½ø³ÌÊǾßÓÐЧÓû§  
ID  
            µÈÓÚsem_perm.cuid»òsem_perm.uid£»ÁíÒ»ÖÖ½ø³ÌÊǾßÓг¬¼¶Óû§ÌØ  
Ȩ  
            µÄ½ø³Ì¡£  
GETVAL     ·µ»Ø³ÉÔ±semnumµÄsemvalÖµ¡£  
SETVAL     ÉèÖóÉÔ±semnumµÄsemvalÖµ¡£¸ÃÖµÓÉarg.valÖ¸¶¨¡£  
SETVAL     ·µ»Ø³ÉÔ±semnumµÄsempidÖµ¡£  
GETNCNT    ·µ»Ø³ÉÔ±semunmµÄsemncntÖµ¡£  
GETZCNT    ·µ»Ø³ÉÔ±semnumµÄsemzcntÖµ¡£  
GETALL     È¡¸Ã¼¯ºÏÖÐËùÓÐÐźÅÁ¿µÄÖµ£¬²¢½«ËüÃÇ´æ·ÅÔÚÓÉarg.arrayÖ¸ÏòµÄÊý×é  
ÖС£  
SETALL     °´arg.arrayÖ¸ÏòµÄÊý×éÖеÄÖµÉèÖøü¯ºÏÖÐËùÓÐÐźÅÁ¿µÄÖµ¡£  
¶ÔÓÚ³ýGETALLÒÔÍâµÄËùÓÐGETÃüÁsemctlº¯Êý¶¼·µ»ØÏàÓ¦Öµ¡£ÆäËüÃüÁîµÄ·µ»ØÖµ  
Ϊ0¡£º¯Êýsemop×Ô¶¯Ö´ÐÐÔÚÐźÅÁ¿¼¯ºÏÉϵIJÙ×÷Êý×é¡£  
---------------------------------------  
#include <sys/types.h>  
 #include  <sys/ipc.h>  
 #include  <sys/sem.h>  
 int semop(int semid, struct sembuf semoparray[], size_t nops);  
        ·µ»Ø£ºÈô³É¹¦Îª0£¬³ö´íΪ-1  
---------------------------------------  
semoparrayÊÇÒ»¸öÖ¸Õ룬ËüÖ¸ÏòÒ»¸öÐźÅÁ¿²Ù×÷Êý×é¡£  
 struct sembuf {  
  ushort  sem_num;   ÔÚset(0,1,¡­,nsems-1)ÖеijÉÔ±Êý  
  short   sem_op;   ²Ù×÷£¨¸º£¬0»òÕý£©  
  short  sem_flg;   IPC_NOWAIT, SEM_UNDO  
 };  
nops¹æ¶¨ÔÚ¸ÃÊý×éÖвÙ×÷µÄÊýÁ¿£¨ÔªËØÊý£©¡£  
¶Ô¼¯ºÏÖÐÿ¸ö³ÉÔ±µÄ²Ù×÷ÓÉÏàÓ¦µÄsem_op¹æ¶¨¡£´ËÖµ¿ÉÒÔÊǸºÖµ¡¢0»òÕýÖµ¡££¨ÔÚ  
ÏÂÃæµÄÌÖÂÛÖУ¬ÎÒÃǽ«Ìáµ½ÐźÅÁ¿µÄ"undo"±êÖ¾¡£´Ë±êÖ¾¶ÔÓ¦ÓÚÏàÓ¦sem_flg³ÉÔ±  
µÄSEM_UNDOλ¡££©  
1. ×îÒ×ÓÚ´¦ÀíµÄÇé¿öÊÇsem_opΪÕý¡£Õâ¶ÔÓ¦ÓÚ·µ»Ø½ø³ÌÕ¼ÓõÄ×ÊÔ´¡£sem_opÖµ¼Ó  
µ½ÐźÅÁ¿µÄÖµÉÏ¡£Èç¹ûÖ¸¶¨ÁËundo±êÖ¾£¬ÔòÒ²´Ó¸Ã½ø³ÌµÄ´ËÐźÅÁ¿µ÷ÕûÖµÖмõÈ¥s  
em_op¡£  
2. Èôsem_opΪ¸º£¬Ôò±íʾҪ»ñÈ¡ÓɸÃÐźÅÁ¿¿ØÖƵÄ×ÊÔ´¡£  
ÈçÈô¸ÃÐźÅÁ¿µÄÖµ´óÓÚ»òµÈÓÚsem_opµÄ¾ø¶ÔÖµ£¨¾ßÓÐËùÐèµÄ×ÊÔ´£©£¬Ôò´ÓÐźÅÁ¿Öµ  
ÖмõÈ¥sem_opµÄ¾ø¶ÔÖµ¡£Õâ±£Ö¤ÐźÅÁ¿µÄ½á¹ûÖµ´óÓÚ»òµÈÓÚ0¡£Èç¹ûÖ¸¶¨ÁËundo±ê  
Ö¾£¬Ôòsem_opµÄ¾ø¶ÔÖµÒ²¼Óµ½¸Ã½ø³ÌµÄ´ËÐźÅÁ¿µ÷ÕûÖµÉÏ¡£  
Èç¹ûÐźÅÁ¿ÖµÐ¡ÓÚsem_opµÄ¾ø¶ÔÖµ£¨×ÊÔ´²»ÄÜÂú×ãÒªÇ󣩣º  
a) ÈôÖ¸¶¨ÁËIPC_NOWAIT£¬Ôò³ö´í·µ»Ø£¬³ö´íºÅµÄEAGAIN;  
b) Èôĩָ¶¨IPC_NOWAIT£¬Ôò¸ÃÐźÅÁ¿µÄsemncntÖµ¼Ó1£¨ÒòΪ½«½øÈë˯Ãß״̬£©£¬  
È»ºóµ÷Óýø³Ì±»¹ÒÆðÖ±ÖÁÏÂÁÐʼþÖ®Ò»·¢Éú£º  
i. ´ËÐźÅÁ¿±ä³É´óÓÚ»òµÈÓÚsem_opµÄ¾ø¶ÔÖµ£¨Ò²¾ÍÊÇ£¬Ä³¸ö½ø³ÌÒÑÊÍ·ÅÁËijЩ×Ê  
Ô´£©¡£´ËÐźÅÁ¿µÄsemncntÖµ¼õ1£¨ÒòΪÒѽáÊøµÈ´ý£©,²¢ÇÒ´ÓÐźÅÁ¿ÖµÖмõÈ¥sem_  
opµÄ¾ø¶ÔÖµ¡£Èç¹ûÖ¸¶¨ÁËundo±êÖ¾,Ôòsem_opµÄ¾ø¶ÔÖµÒ²¼Óµ½¸Ã½ø³ÌµÄ´ËÐźÅÁ¿µ÷  
ÕûÖµÉÏ¡£  
ii. ´ÓϵͳÖÐɾ³ýÁË´ËÐźÅÁ¿¡£ÔÚ´ËÇé¿öÏ£¬º¯Êý³ö´í·µ»Ø£¬³ö´íºÅΪERMID¡£  
iii. ½ø³Ì²¶×½µ½Ò»¸öÐźţ¬²¢´ÓÐźŴ¦Àí³ÌÐò·µ»Ø£¬ÔÚ´ËÇé¿öÏ£¬´ËÐźÅÁ¿µÄse  
mncntÖµ¼õ1£¨ÒòΪ²»Ôٵȴý£©£¬²¢ÇÒº¯Êý³ö´í·µ»Ø£¬³ö´íºÅΪEINTR.  
3.  Èôsem_opΪ0£¬Õâ±íʾϣÍûµÈ´ýµ½¸ÃÐźÅÁ¿Öµ±ä³É0¡£  
Èç¹ûÐźÅÁ¿Öµµ±Ç°ÊÇ0£¬Ôò´Ëº¯ÊýÁ¢¼´·µ»Ø¡£  
Èç¹ûÐźÅÁ¿Öµ·Ç0£º  
a) ÈôÖ¸¶¨ÁËIPC_NOWAIT£¬Ôò³ö´í·µ»Ø£¬³ö´íºÅÊÇEAGAIN£»  
b) Èôĩָ¶¨IPC_NOWAIT£¬Ôò¸ÃÐźÅÁ¿µÄsemncntÖµ¼Ó1£¨ÒòΪ½«½øÈë˯Ãß״̬£©£¬  
È»ºóµ÷Óýø³Ì±»¹ÒÆð£¬Ö±ÖÁÏÂÁÐʼþÖ®Ò»·¢Éú£º  
i. ´ËÐźÅÁ¿Öµ±ä³É0¡£´ËÐźÅÁ¿µÄsemzcntÖµ¼õ1£¨ÒòΪÒѽáÊøµÈ´ý£©¡£  
ii. ´ÓϵͳÖÐɾ³ýÁË´ËÐźÅÁ¿¡£ÔÚ´ËÇé¿öÏ£¬º¯Êý³ö´í·µ»Ø£¬³ö´íºÅΪERMID¡£  
iii. ½ø³Ì²¶×½µ½Ò»¸öÐźţ¬²¢´ÓÐźŴ¦Àí³ÌÐò·µ»Ø¡£ÔÚ´ËÇé¿öÏ£¬´ËÐźÅÁ¿µÄse  
mzentÖµ¼õ1£¨ÒòΪ²»Ôٵȴý£©£¬²¢ÇÒº¯Êý³ö´í·µ»Ø£¬³ö´íºÅΪEINTR.  
      semop¾ßÓÐÔ­×ÓÐÔ£¬ÒòΪËü»òÕßÖ´ÐÐÊý×éÖеÄËùÓвÙ×÷£¬»òÕßÒ»¸öÒ²²»×ö¡£  
   
ÔÚexitʱµÄÐźÅÁ¿µ÷Õû  
ÕýÈçÎÒÃÇÔÚÇ°ÃæÌáµ½µÄ£¬Èç¹ûÔÚ½ø³ÌÖÕֹʱ£¬ËüÕ¼ÓÃÁ˾­ÓÉÐźÅÁ¿·ÖÅäµÄ×ÊÔ´£¬ÄÇ  
ô¾Í»á³ÉΪһ¸öÎÊÌâ¡£ÎÞÂÛºÎʱֻҪÎÒÃÇΪÐźÅÁ¿²Ù×÷Ö¸¶¨ÁËSEM_UNDO±êÖ¾£¬È»ºó  
·ÖÅ䣨sem_opֵСÓÚ0£©£¬ÄÇôºË¾Í»á¼Çס¶ÔÓÚ¸ÃÌØ¶¨ÐźÅÁ¿£¬·ÖÅ䏸ÎÒÃǶàÉÙ×Ê  
Ô´£¨sem_opµÄ¾ø¶ÔÖµ£©¡£µ±¸Ã½ø³ÌÖÕֹʱ»òÕß×ÔÔ¸»òÕß²»×ÔÔ¸£¬ºË¶¼½«¼ìÑé¸Ã½ø³Ì  
ÊÇ·ñ»¹ÓÐÉÐδ´¦ÀíµÄÐźÅÁ¿µ÷ÕûÖµ£¬Èç¹ûÓУ¬Ôò°´µ÷ÕûÖµ¶ÔÏàÓ¦Á¿Öµ½øÐе÷Õû¡£  
ÈçÈôÎÒÃÇÓôøSETVAL»òSETALLÃüÁîµÄsemctlÉèÖÃÒ»ÐźÅÁ¿µÄÖµ£¬ÔòÔÚËùÓнø³ÌÖУ¬  
¶ÔÓÚ¸ÃÐźÅÁ¿µÄµ÷ÕûÖµ¶¼ÉèÖÃΪ0¡£  
ʵÀý-ÐźÅÁ¿ºÍ¼ÇÂ¼ËøµÄʱ¼ä±È½Ï  
Èç¹û¶à¸ö½ø³Ì¹²ÏíÒ»¸ö×ÊÔ´£¬ÔòÎÒÃÇ¿ÉʹÓÃÐźÅÁ¿»ò¼ÇÂ¼Ëø¡£¶ÔÕâÁ½ÖÖ¼¼ÊõÔÚʱ¼ä  
ÉϵIJî±ð½øÐбȽÏÊÇÓÐÒæµÄ¡£  
ÈôʹÓÃÐźÅÁ¿£¬ÔòÏÈ´´½¨Ò»¸ö°üº¬Ò»¸ö³ÉÔ±µÄÐźÅÁ¿¼¯ºÏ£¬È»ºó¶Ô¸ÃÐźÅÁ¿Öµ¸³³õ  
Öµ1¡£ÎªÁË·ÖÅä×ÊÔ´£¬ÒÔsem_opΪ-1µ÷ÓÃsemop£¬ÎªÁËÊÍ·Å×ÊÔ´£¬ÔòÒÔsem_opΪ+1µ÷  
ÓÃsemop¡£¶Ôÿ¸ö²Ù×÷¶¼Ö¸¶¨SEM_UNDO£¬ÒÔ´¦ÀíÔÚÄ©ÊÍ·Å×ÊÔ´Çé¿öϽø³ÌÖÕÖ¹µÄÇé  
¿ö¡£  
ÈôʹÓüÇÂ¼Ëø£¬ÔòÏÈ´´½¨Ò»¸ö¿ÕÎļþ£¬²¢ÇÒÓøÃÎļþµÄµÚÒ»¸ö×Ö½Ú£¨ÎÞÐè´æÔÚ£©×÷  
ÎªËø×Ö½Ú¡£ÎªÁË·ÖÅä×ÊÔ´£¬ÎÒÃÇÏȶԸÃ×Ö½Ú»ñµÃÒ»¸öÐ´Ëø£¬ÊͷŸÃ×ÊԴʱ£¬Ôò¶Ô¸Ã  
×Ö½Ú¿ªËø¡£¼ÇÂ¼ËøµÄÐÔÖʱ£Ö¤ÁË£¬µ±±£ÓÐÒ»¸öËøµÄ½ø³ÌÖÕֹʱ£¬ºË»á×Ô¶¯ÊͷŸÃËø  
¡£  
ͼ14.19ÏÔʾÁËÔÚÁ½¸ö²»Í¬ÏµÍ³ÉÏ£¬Ê¹ÓÃÕâÁ½ÖÖ²»Í¬¼¼Êõ½øÐÐËø²Ù×÷ËùÐèµÄʱ¼ä¡£  
ÔÚ¸÷ÖÖÇé¿öÖУ¬×ÊÔ´¶¼±»·ÖÅ䣬ȻºóÓÖÊÍ·Å10£¬000´Î¡£ÕâͬʱÓÉ3¸ö²»Í¬µÄ½ø³ÌÖ´  
ÐС£Í¼14.19ÖÐËùʾµÄʱ¼äÊÇ3¸ö½ø³ÌµÄ×ܼƣ¬µ¥Î»ÊÇÃë¡£  
ͼ14.19  ÐźÅÁ¿ËøºÍ¼ÇÂ¼ËøµÄʱ¼ä±È½Ï  
ÔÚSPARCÉÏ£¬¼ÇÂ¼ËøÓëÐźÅÁ¿ËøÏà±È£¬ÔÚϵͳʱ¼ä·½ÃæÒª¶àºÄÓÃ10%¡£ÔÚ80386ÉÏ£¬  
¶àºÄÓÃÔ¼50%¡£  
ËäÈ»£¬¼ÇÂ¼ËøÉÔÂýÓÚÐźÅÁ¿Ëø£¬Èç¹ûÖ»ÐèËøÒ»¸ö×ÊÔ´£¨ÀýÈç¹²Ïí´æ´¢¶Î£©²¢ÇÒ²»Ðè  
ҪʹÓÃϵͳVÐźÅÁ¿µÄËùÓл¨ÇεŦÄÜ£¬ÔòÄþ¿ÉʹÓüÇÂ¼Ëø¡£ÀíÓÉÊÇ£º(a)ʹÓüòÒ×  
 £¨b£©½ø³ÌÖÕֹʱ£¬»á´¦ÀíÈÎÒ»ÒÅÁôϵÄËø¡£  
14.9 ¹²Ïí´æ´¢£¨Shared Memory£©  
¹²Ïí´æ´¢ÔÊÐíÁ½¸ö»ò¶à¸ö½ø³Ì¹²ÏíÒ»¸ø¶¨µÄ´æ´¢Çø¡£ÒòΪÊý¾Ý²»ÐèÒªÔÚ¿Í»§ºÍ·þÎñ  
ÕßÖ®¼ä¸´ÖÆ£¬ËùÒÔÕâÊÇ×î¿ìµÄÒ»ÖÖIPC¡£Ê¹Óù²Ïí´æ´¢µÄΨһÇÏÃÅÊǶà¸ö½ø³ÌÖ®¼ä  
¶ÔÒ»¸ø¶¨´æ´¢ÇøµÄͬ²½´æÈ¡¡£Èô·þÎñÕß½«Êý¾Ý·ÅÈë¹²Ïí´æ´¢Çø£¬ÔòÔÚ·þÎñÕß×öÍêÕâ  
Ò»²Ù×÷֮ǰ£¬¿Í»§²»Ó¦µ±È¥È¡ÕâЩÊý¾Ý¡£Í¨³££¬ÐźÅÁ¿±»ÓÃÀ´ÊµÏÖ¶Ô¹²Ïí´æ´¢´æÈ¡  
µÄͬ²½¡££¨²»¹ýÕýÈçǰ½Ú×îºó²¿·ÖËùÊö£¬¼ÇÂ¼ËøÒ²¿ÉÓÃÓÚÕâÖÖ³¡ºÏ¡££©  
ºËΪÿ¸ö¹²Ïí´æ´¢¶ÎÉèÖÃÁËÒ»¸öshmid_ds½á¹¹¡£  
        struct shmid_ds {  
                struct ipc_perm  shm_perm;              ¼û14.6.2½Ú  
                struct anon_map          *shm_amp;              ÄÚºËÖеÄÖ¸Õë  
                int             shm_segsz;                              ¶Î³¤£¨×Ö  
Ú£©  
                ushort  shm_lkcnt;                              ¶Ô¶Î¼ÓËøµÄ´ÎÊý  
                pid_t   shm_lpid;                               ×îºóshmop()µÄpid  
                pid_t   shm_cpid;                               ´´½¨Õßpid  
                ulong   shm_nattch;                             µ±Ç°Á¬½ÓÊý  
                ulong   shm_cnattch;                            Ö»ÓÃÓÚshminfo  
                time_t  shm_atime;                              ×îºóÁ¬½Óʱ¼ä  
                time_t  shm_dtime;                              ×îºóÍѽÓʱ¼ä  
                time_t  shm_ctime;                              ×îºó¸ü¸Äʱ¼ä  
        };  
ͼ14.20  ÁгöÁËÓ°Ïì¹²Ïí´æ´¢µÄϵͳÏÞÖÆ£¨14.6.3½Ú£©¡£  
ͼ14.20  Ó°Ïì¹²Ïí´æ´¢µÄϵͳÏÞÖÆ  
µ÷ÓõĵÚÒ»¸öº¯Êýͨ³£ÊÇshmget£¬Ëü»ñµÃÒ»¸ö¹²Ïí´æ´¢±êʶ·û¡£  
#include <sys/types.h>  
        #include         <sys/ipc.h>  
        #include         <sys/shm.h>  
        int shmget(key_t key, int size, int flag);  
                                                                ·µ»Ø£ºÈô³É¹¦Îª¹²  
 ÄÚ´æID£¬³ö´íΪ-1  
ÔÚ14.6.1½ÚÖУ¬ÎÒÃÇ˵Ã÷Á˽«key±ä»»³ÉÒ»¸ö±êʶ·ûµÄ¹æÔò£¬ÒÔ¼°ÊÇ·ñÊÇ´´½¨Ò»¸ö  
й²Ïí´æ´¢¶Î»ò´æ·ÃÒ»¸öÏÖ´æµÄ¹²Ïí´æ´¢¶Î¡£µ±´´½¨Ò»¸öжÎʱ£¬³õʼ»¯shmid_d  
s½á¹¹µÄÏÂÁгÉÔ±£º  
l ipe_perm½á¹¹°´14.6.2½ÚÖÐËùÊö½øÐгõʼ»¯¡£¸Ã½á¹¹ÖеÄmode°´flagÖеÄÏàÓ¦Ðí  
¿ÉȨλÉèÖá£ÕâЩÐí¿ÉȨÓÃͼ14.14Öеij£ÊýÖ¸¶¨¡£  
l shm_lpid¡¢shm_nattach¡¢shm_atime¡¢ÒÔ¼°shm_dtime¶¼ÉèÖÃΪ0¡£  
l shm_ctimeÉèÖÃΪµ±Ç°Ê±¼ä¡£  
SizeÊǸù²Ïí´æ´¢¶ÎµÄ×îСֵ¡£Èç¹ûÕýÔÚ´´½¨Ò»¸öÐ¶Σ¨µäÐ͵ØÔÚ·þÎñÕßÖУ©£¬ÎÒ  
ÃDZØÐëÖ¸¶¨Æäsize¡£Èç¹ûÎÒÃÇÕýÔÚ´æ·ÃÒ»¸öÏÖ´æµÄ¶Î£¨Ò»¸ö¿Í»§£©£¬ÎÒÃǽ«sizeÖ¸  
¶¨Îª0¡£  
Shmcttº¯Êý¶Ô¹²Ïí´æ´¢¶ÎÖ´ÐжàÖÖ²Ù×÷¡£  
#include <sys/types.h>  
        #include         <sys/ipc.h>  
        #include         <sys/shm.h>  
        int shmctl(int shmid, int cmd, struct shmid_ds  *buf);  
                                                                ·µ»Ø£ºÈô³É¹¦Îª0£  
³ö´íΪ-1  
Cmd²ÎÊýÖ¸¶¨ÏÂÁÐ5ÖÖÃüÁîÖÐÒ»ÖÖ£¬Ê¹ÆäÔÚshmidÖ¸¶¨µÄ¶ÎÉÏÖ´ÐС£  
IPC_STAT    ¶Ô´Ë¶ÎÈ¡shmid_ds½á¹¹£¬²¢´æ·ÅÔÚÓÉbufÖ¸ÏòµÄ½á¹¹ÖС£  
IPC_SET     °´bufÖ¸ÏòµÄ½á¹¹ÖеÄÖµÉèÖÃÓë´Ë¶ÎÏà¹Ø½á¹¹ÖеÄÏÂÁÐÈý¸ö×ֶΣº s  
hm_perm.uid¡¢shm_perm.gidÒÔ¼°shm_perm.mode¡£´ËÃüÁîÖ»ÄÜÓÉÏÂÁÐÁ½ÖÖ½ø³ÌÖ´ÐР 
£ºÒ»ÖÖ½ø³ÌÊÇÆäÓÐЧÓû§IDµÈÓÚshm_perm.cuid»òshm_perm.uid£»ÁíÒ»ÖÖ½ø³ÌÊǾߠ 
Óг¬¼¶Óû§ÌØÈ¨µÄ½ø³Ì¡£  
IPC_RMID    ´ÓϵͳÖÐɾ³ý¸Ã¹²Ïí´æ´¢¶Î¡£ÒòΪÿ¸ö¹²Ïí´æ´¢¶ÎÓÐÒ»¸öÁ¬½Ó¼ÆÊý£¨  
shm_nattch ÔÚshmid_ds½á¹¹ÖУ©,ËùÒÔ³ý·ÇʹÓøöεÄ×îºóÒ»¸ö½ø³ÌÖÕÖ¹»òÓë¸Ã¶Î  
Íѽӣ¬·ñÔò²»»áʵ¼ÊÉÏɾ³ý¸Ã´æ´¢¶Î¡£²»¹Ü´Ë¶ÎÊÇ·ñÈÔÔÚʹÓ㬸öαêʶ·ûÁ¢¼´±»  
ɾ³ý,ËùÒÔ²»ÄÜÔÙÓÃshmatÓë¸Ã¶ÎÁ¬½Ó¡£´ËÃüÁîÖ»ÄÜÓÉÏÂÁÐÁ½ÖÖ½ø³ÌÖ´ÐÐ:Ò»ÖÖ½ø³Ì  
ÊÇÆäÓÐЧÓû§IDµÈÓÚshm_perm.cuid»òshm_perm.uid:ÁíÒ»ÖÖ½ø³ÌÊǾßÓг¬¼¶Óû§ÌØ  
ȨµÄ½ø³Ì¡£  
SHM_LOCK    ÔÚÄÚ´æÖÐËø×¡¹²Ïí´æ´¢¶Î¡£´ËÃüÁîÖ»ÄÜÓɳ¬¼¶Óû§Ö´ÐС£  
SHM_UNLOCK  ½âËø¹²Ïí´æ´¢¶Î¡£´ËÃüÁîÖ»ÄÜÓɳ¬¼¶Óû§Ö´ÐС£  
Ò»µ©´´½¨ÁËÒ»¸ö¹²Ïí´æ´¢¶Î£¬½ø³Ì¾Í¿Éµ÷ÓÃshmat½«ÆäÁ¬½Óµ½ËüµÄµØÖ·¿Õ¼äÖС£  
   
#include <sys/types.h>  
        #include         <sys/ipc.h>  
        #include         <sys/shm.h>  
        void *shmatt(int shmid, void *addr, int flag);  
                                                                ·µ»Ø£ºÈô³É¹¦ÎªÖ¸  
 ¹²ÏíÄÚ´æµÄÖ¸Õ룬³ö´íΪ-1  
¹²Ïí´æ´¢¶ÎÁ¬½Óµ½µ÷Óýø³ÌµÄÄĸöµØÖ·ÉÏÓëaddr²ÎÊýÒÔ¼°ÔÚflagÖÐÊÇ·ñÖ¸¶¨SHM_R  
NDλÓйء£  
1. Èç¹ûaddrÊÇ0£¬Ôò´Ë¶ÎÁ¬½Ó½Óµ½ÓÉϵͳºËÑ¡ÔñµÄµÚÒ»¸ö¿ÉÓõØÖ·ÉÏ¡£  
2. Èç¹ûaddr·Ç0£¬²¢ÇÒûÓÐÖ¸¶¨SHM_RND£¬Ôò´Ë¶ÎÁ¬½Óµ½addrËùÖ¸¶¨µÄµØÖ·ÉÏ¡£  
3. Èç¹ûaddr·Ç0£¬²¢ÇÒÖ¸¶¨ÁËSHM_RND£¬Ôò´Ë¶ÎÁ¬½Óµ½£¨addr_(addrÃþ³ýSHMLBA)£©  
Ëù±íʾµÄµØÖ·ÉÏ¡£SHM_RNDÃüÁîµÄÒâ˼ÊÇ£ºÈ¡Õû¡£SHMLBAµÄÒâ˼ÊÇ£ºµÍ±ß½çµØÖ·±¶  
ÊýÁ¿£¨low boundary address multiple£©,Ëü×ÜÊÇ2µÄ³Ë·½¡£¸ÃËãʽ×öµÄÊǽ«µØÖ·  
ÏòÏÂÈ¡×î½ü1¸öSHMLBAµÄ±¶Êý¡£  
³ý·ÇÎÒÃǼƻ®Ö»ÔÚÒ»ÖÖÓ²¼þÉÏÔËÐÐÓ¦ÓóÌÐò£¨ÕâÔÚµ±½ñÊDz»´ó¿ÉÄܵģ©£¬·ñÔò¾Í²»  
»áÖ¸¶¨¹²Ïí¶ÎËùÁ¬½Óµ½µÄµØÖ·¡£ËùÒÔÒ»°ãÓ¦Ö¸¶¨addrΪ0£¬ÒÔ±ãÓÉϵͳѡÔñµØÖ·¡£  
   
Èç¹ûÔÚflagÖÐÖ¸¶¨ÁËSHM_RDONLY룬ÔòÒÔÖ»¶Á·½Ê½Á¬½Ó´Ë¶Î¡£·ñÔòÒÔ¶Áд·½Ê½Á¬½Ó  
´Ë¶Î¡£  
ShmatµÄ·µ»ØÖµÊǸöÎËùÁ¬½ÓµÄʵ¼ÊµØÖ·£¬Èç¹û³ö´íÔò·µ»Ø-1¡£  
µ±¶Ô¹²Ïí´æ´¢¶ÎµÄ²Ù×÷ÒѾ­½áÊøÊ±£¬Ôòµ÷ÓÃshmdtÍѽӸöΡ£×¢Ò⣬Õâ²¢²»´Óϵͳ  
ÖÐɾ³ýÆä±êʶ·ûÒÔ¼°ÆäÊý¾Ý½á¹¹¡£¸Ã±êʶ·ûÈÔÈ»´æÔÚ£¬Ö±ÖÁij¸ö½ø³Ì£¨Ò»°ãÊÇ·þÎñ  
Õߣ©µ÷ÓÃshmctl£¨´øÃüÁîIPC_RMID£©ÌصØÉ¾³ýËü¡£  
#include <sys/types.h>  
        #include         <sys/ipc.h>  
        #include         <sys/shm.h>  
        int shmdt(void  *addr);  
                                                                ·µ»Ø£ºÈô³É¹¦Îª0£  
³ö´íΪ-1  
addr²ÎÊýÊÇÒÔǰµ÷ÓÃshmatʱµÄ·µ»ØÖµ¡£  
ʵÀý  
ϵͳºË½«ÒÔµØÖ·0Á¬½ÓµÄ¹²Ïí´æ´¢¶Î·ÅÔÚʲôλÖÃÉÏÊÇÓëϵͳÃÜÇÐÏà¹ØµÄ¡£³ÌÐò14  
.11´òӡһЩÐÅÏ¢£¬ËüÃÇÓëÒ»¸öÖ¸¶¨ÏµÍ³½«²»Í¬ÀàÐ͵ÄÊý¾Ý·ÅÔÚʲôλÖÃÓйء£ÔÚ  
Ò»¸öÌØ¶¨µÄϵͳÉÏÔËÐд˳ÌÐò¸ø³öÏÂÁÐÊä³ö£º  
        $ a.out  
        array[]  from 18f48 to 22b88  
        stack around     f7fffb2c  
        malloced from 24c28 to 3d2c8  
        shared memory attached from f77d0000 to f77e86a0  
#include        <sys/types.h>  
#include        <sys/ipc.h>  
#include        <sys/shm.h>  
#include        "ourhdr.h"  
#define ARRAY_SIZE       40000  
#define MALLOC_SIZE     100000  
#define SHM_SIZE        100000  
#define SHM_MODE        (SHM_R | SHM_W) /* user read/write */  
char    array[ARRAY_SIZE];      /* uninitialized data = bss */  
int  
main(void)  
{  
        int             shmid;  
        char    *ptr, *shmptr;  
        printf("array[] from %x to %x\n", &array[0], &array[ARRAY_SIZE]);  
        printf("stack around %x\n", &shmid);  
        if ( (ptr = malloc(MALLOC_SIZE)) == NULL)  
                err_sys("malloc error");  
        printf("malloced from %x to %x\n", ptr, ptr+MALLOC_SIZE);  
        if ( (shmid = shmget(IPC_PRIVATE, SHM_SIZE, SHM_MODE)) < 0)  
                err_sys("shmget error");  
        if ( (shmptr = shmat(shmid, 0, 0)) == (void *) -1)  
                err_sys("shmat error");  
        printf("shared memory attached from %x to %x\n",  
                                shmptr, shmptr+SHM_SIZE);  
        if (shmctl(shmid, IPC_RMID, 0) < 0)  
                err_sys("shmctl error");  
        exit(0);  
}  
³ÌÐò14.11  ´òÓ¡²»Í¬µÄÀàÐ͵ÄÊý¾ÝËù´æ·ÅµÄλÖà 
ͼ14.21ÏÔʾÁËÕâÖÖÇé¿ö£¬ÕâÓëͼ7.3ÖÐËùʾµÄµäÐÍ´æ´¢Çø²¼¾ÖÀàËÆ¡£×¢Ò⣬¹²Ïí´æ  
´¢¶Î½ô¿¿ÔÚջ֮ϡ£Êµ¼ÊÉÏ£¬ÔÚ¹²Ïí´æ´¢¶ÎºÍÕ»Ö®¼äÓдóÔ¼8mbytesµÄÄ©ÓõØÖ·¿Õ  
¼ä¡£  
ͼ14.21  ÔÚÒ»¸öÌØ¶¨ÏµÍ³ÉÏµÄ´æ´¢Çø²¼¾Ö  
ʵÀýÒ»  /dev/zeroµÄ´æ´¢Ó³Éä  
¹²Ïí´æ´¢¿ÉÓɲ»Ïà¹ØµÄ½ø³ÌʹÓᣵ«ÊÇ£¬Èç¹û½ø³ÌÊÇÓйØÏµµÄ£¬ÔòSVR4ÌṩÁËÒ»ÖÖ  
²»Í¬µÄ¼¼Êõ¡£  
É豸/dev/zeroÔÚ¶Áʱ£¬ÊÇ0×Ö½ÚµÄÎÞÏÞ×ÊÔ´¡£´ËÉ豸Ҳ½ÓÊÕдÏòËüµÄÈκÎÊý¾Ý£¬µ«  
ºöÂÔ´ËÊý¾Ý¡£ÎÒÃǶԴËÉ豸×÷ΪIPCµÄÐËȤÔÚÓÚ£¬µ±¶ÔÆä½øÐд洢ӳÉäʱ£¬Ëü¾ßÓР 
Ò»Ð©ÌØÊâÐÔÖÊ¡£  
l ´´½¨Ò»¸öδÃû´æ´¢Çø£¬Æä³¤¶ÈÊÇmmapµÄµÚ¶þ¸ö²ÎÊý£¬½«ÆäÈ¡ÕûΪϵͳÉϵÄ×î½üÒ³  
³¤¡£  
l ´æ´¢Çø¶¼³õʼ»¯Îª0¡£  
l Èç¹û¶à¸ö½ø³ÌµÄ¹²Í¬×æÏȽø³Ì¶ÔmmapÖ¸¶¨ÁËMAP_SHARED±êÖ¾£¬ÔòÕâЩ½ø³Ì¿É¹²Ïí  
´Ë´æ´¢Çø¡£  
³ÌÐò14.12ÊÇʹÓôËÌØÊâÉ豸µÄÒ»¸öÀý×Ó¡£Ëü´ò¿ª´Ë/dev/zeroÉ豸£¬È»ºóÖ¸¶¨Ò»¸ö  
³¤ÕûÐ͵Äsizeµ÷ÓÃmmap¡£×¢Ò⣬һµ©¸Ã´æ´¢Çø±»Ó³ÉäÁË£¬ÎÒÃǾÍÄܹرմËÉ豸¡£È»  
ºó£¬½ø³Ì´´½¨Ò»¸ö×Ó½ø³Ì¡£ÒòΪÔÚµ÷ÓÃmmapʱָ¶¨ÁËMAP_SHARED£¬ËùÒÔÒ»¸ö½ø³Ìд  
µ½´æ´¢Ó³ÕÕÇøµÄÊý¾Ý¿ÉÓÉÁíÒ»½ø³Ì¼ûµ½¡££¨Èç¹ûÎÒÃÇÒÑÖ¸¶¨MAP_PRIVATE£¬Ôò´Ë³Ì  
Ðò²»»á¹¤×÷¡££©  
È»ºó£¬¸¸¡¢×Ó½ø³Ì½»ÌæÔËÐУ¬Ê¹ÓÃ8.8½ÚÖеÄͬ²½º¯Êý¸÷×Ô¶Ô¹²Ïí´æ´¢Ó³ÉäÇøÖеĠ 
Ò»¸ö³¤ÕûÐÍÊý¼Ó1¡£´æ´¢Ó³ÉäÇøÓÉmmap³õʼ»¯Îª0¡£¸¸½ø³ÌÏȶÔËü½øÐÐÔö1²Ù×÷£¬Ê¹  
Æä³ÉΪ1£¬È»ºó×Ó½ø³Ì¶ÔÆä½øÐÐÔö1²Ù×÷£¬ÊÇÆä³ÉΪ2£¬È»ºó¸¸½ø³ÌʹÆä³ÉΪ3¡­¡­¡£  
×¢Ò⣬µ±ÎÒÃÇÔÚupdateº¯ÊýÖУ¬¶Ô³¤ÕûÐÍÖµÔö1ʱ£¬±ØÐëʹÓÃÀ¨ºÅ£»ÒòΪÎÒÃÇÔö¼Ó  
ÆäÖµ£¬¶ø²»ÊÇÖ¸Õë¡£  
#include        <sys/types.h>  
#include        <sys/mman.h>  
#include        <fcntl.h>  
#include        "ourhdr.h"  
É豸/dev/zeroÔÚ¶Áʱ£¬ÊÇ0×Ö½ÚµÄÎÞÏÞ×ÊÔ´¡£´ËÉ豸Ҳ½ÓÊÕдÏòËüµÄÈκÎÊý¾Ý£¬µ«  
ºöÂÔ´ËÊý¾Ý¡£ÎÒÃǶԴËÉ豸×÷ΪIPCµÄÐËȤÔÚÓÚ£¬µ±¶ÔÆä½øÐд洢ӳÉäʱ£¬Ëü¾ßÓР 
Ò»Ð©ÌØÊâÐÔÖÊ¡£  
l ´´½¨Ò»¸öδÃû´æ´¢Çø£¬Æä³¤¶ÈÊÇmmapµÄµÚ¶þ¸ö²ÎÊý£¬½«ÆäÈ¡ÕûΪϵͳÉϵÄ×î½üÒ³  
³¤¡£  
l ´æ´¢Çø¶¼³õʼ»¯Îª0¡£  
l Èç¹û¶à¸ö½ø³ÌµÄ¹²Í¬×æÏȽø³Ì¶ÔmmapÖ¸¶¨ÁËMAP_SHARED±êÖ¾£¬ÔòÕâЩ½ø³Ì¿É¹²Ïí  
´Ë´æ´¢Çø¡£  
³ÌÐò14.12ÊÇʹÓôËÌØÊâÉ豸µÄÒ»¸öÀý×Ó¡£Ëü´ò¿ª´Ë/dev/zeroÉ豸£¬È»ºóÖ¸¶¨Ò»¸ö  
³¤ÕûÐ͵Äsizeµ÷ÓÃmmap¡£×¢Ò⣬һµ©¸Ã´æ´¢Çø±»Ó³ÉäÁË£¬ÎÒÃǾÍÄܹرմËÉ豸¡£È»  
ºó£¬½ø³Ì´´½¨Ò»¸ö×Ó½ø³Ì¡£ÒòΪÔÚµ÷ÓÃmmapʱָ¶¨ÁËMAP_SHARED£¬ËùÒÔÒ»¸ö½ø³Ìд  
µ½´æ´¢Ó³ÕÕÇøµÄÊý¾Ý¿ÉÓÉÁíÒ»½ø³Ì¼ûµ½¡££¨Èç¹ûÎÒÃÇÒÑÖ¸¶¨MAP_PRIVATE£¬Ôò´Ë³Ì  
Ðò²»»á¹¤×÷¡££©  
È»ºó£¬¸¸¡¢×Ó½ø³Ì½»ÌæÔËÐУ¬Ê¹ÓÃ8.8½ÚÖеÄͬ²½º¯Êý¸÷×Ô¶Ô¹²Ïí´æ´¢Ó³ÉäÇøÖеĠ 
Ò»¸ö³¤ÕûÐÍÊý¼Ó1¡£´æ´¢Ó³ÉäÇøÓÉmmap³õʼ»¯Îª0¡£¸¸½ø³ÌÏȶÔËü½øÐÐÔö1²Ù×÷£¬Ê¹  
Æä³ÉΪ1£¬È»ºó×Ó½ø³Ì¶ÔÆä½øÐÐÔö1²Ù×÷£¬ÊÇÆä³ÉΪ2£¬È»ºó¸¸½ø³ÌʹÆä³ÉΪ3¡­¡­¡£  
×¢Ò⣬µ±ÎÒÃÇÔÚupdateº¯ÊýÖУ¬¶Ô³¤ÕûÐÍÖµÔö1ʱ£¬±ØÐëʹÓÃÀ¨ºÅ£»ÒòΪÎÒÃÇÔö¼Ó  
ÆäÖµ£¬¶ø²»ÊÇÖ¸Õë¡£  
#include        <sys/types.h>  
#include        <sys/mman.h>  
#include        <fcntl.h>  
#include        "ourhdr.h"  
#define NLOOPS          1000  
#define SIZE            sizeof(long)    /* size of shared memory area */  
static int      update(long *);  
int  
main()  
{  
        int             fd, i, counter;  
        pid_t   pid;  
        caddr_t area;  
        if ( (fd = open("/dev/zero", O_RDWR)) < 0)  
                err_sys("open error");  
        if ( (area = mmap(0, SIZE, PROT_READ | PROT_WRITE,  
                                                                        MAP_SHAR  
D, fd, 0)) == (caddr_t) -1)  
                err_sys("mmap error");  
        close(fd);              /* can close /dev/zero now that it's mapped */  
        TELL_WAIT();  
        if ( (pid = fork()) < 0) {  
                err_sys("fork error");  
        } else if (pid > 0) {                   /* parent */  
                for (i = 0; i < NLOOPS; i += 2) {  
                        if ( (counter = update((long *) area)) != i)  
ÒÔÎÒÃÇËùʾ·½Ê½Ê¹ÓÃ/dev/zeroµÄÓŵãÊÇ£»ÔÚµ÷ÓÃmmapÒÔ´´½¨Ó³ÉäÇøÖ®Ç°£¬ÎÞÐè´æ  
ÔÚÒ»¸öʵ¼ÊÎļþ¡£Ó³Éä/dev/zero×Ô¶¯´´½¨Ò»¸öÖ¸¶¨³¤¶ÈµÄÓ³ÉäÇø¡£ÕâÖÖ¼¼ÊõµÄȱ  
µãÊÇ£»ËüÖ»ÄÜÓÉÏà¹Ø½ø³ÌʹÓá£Èç¹ûÔÚÎ޹ؽø³ÌÖ®¼äÐèҪʹÓù²Ïí´æ´¢Çø£¬Ôò±ØÐë  
ʹÓÃshmXXXº¯Êý¡£  
ʵÀý-ÄäÃû´æ´¢Ó³Éä  
    4.3+BSDÌṩÁËÒ»ÖÖÀàËÆÓÚ/dev/zeroµÄÊ©É裬Ëü±»³ÆÎªÄäÃû´æ´¢Ó³É䡣ΪÁËʹ  
ÓÃÕâÖÖ¹¦ÄÜ£¬ÔÚµ÷ÓÃmmapʱָ¶¨MAP_ANON±êÖ¾£¬²¢½«ÃèÊö·ûÖ¸¶¨Îª-1¡£½á¹ûµÃµ½µÄ  
ÇøÓòÊÇÄäÃûµÄ£¨ÒòΪËü²¢²»Í¨¹ýÒ»¸öÎļþÃèÊö·ûÓëÒ»¸ö·¾¶ÃûÏà½áºÏ£©£¬²¢ÇÒ´´½¨  
Ò»¸ö´æ´¢Çø£¬Ëü¿ÉÓëºó´ú½ø³Ì¹²Ïí¡£  
ΪÁËÐ޸ijÌÐò14.12ʹÆäÓ¦ÓÃ4.3+BSDµÄÕâÖÖÌØÕ÷£¬ÎÒÃÇ×÷ÁËÁ½¸öÐ޸컣¨a£©É¾³ý  
open /dev/zeroºÍclose(fd)ÌõÓï¾ä£¬£¨b£©½«mmapµ÷ÓÃÐ޸ijÉÏÂÁÐÐÎʽ£»  
            if((area = mmap(o,SIZE,PROT_READ|PROT_ WRITE,  
                     MAP_ANON|MAP_SHARED,-1,0))= =(caddr_t)-1)  
Ôڴ˵÷ÓÃÖУ¬ÎÒÃÇÖ¸¶¨ÁËMAP_ANON±êÖ¾£¬²¢½«ÎļþÃèÊö·ûÉèÖÃΪ-1¡£³ÌÐò14.12µÄ  
ÆäÓಿ·ÖÔò²»¼Ó¸Ä±ä¡£  
14.10 ¿Í»§-·þÎñÕßÊôÐÔ  
ÏÂÃæÏêϸ˵Ã÷¿Í»§ºÍ·þÎñÕßµÄÊôÐÔ£¬ÕâЩÊôÐÔÊܵ½ËüÃÇÖ®¼äËùʹÓõÄIPCµÄ²»Í¬Àà  
Ð͵ÄÓ°Ïì¡£  
×î¼òµ¥µÄ¹ØÏµÀàÐÍÊÇʹ¿Í»§fork²¢Ö´ÐÐËùÏ£ÍûµÄ·þÎñÕß¡£ÔÚfork֮ǰÏÈ´´½¨Á½¸öµ¥  
Ïò¹ÜµÀÒÔ±ãʹÊý¾Ý¿ÉÔÚÁ½¸ö·½Ïò´«Ê䡣ͼ14.9ÊÇÕâÖÖÐÎʽµÄÒ»¸öÀý×Ó¡£±»Ö´Ðеķþ  
ÎñÕß¿ÉÄÜÊÇÉèÖÃ_Óû§_IDµÄ³ÌÐò£¬ÕâʹËü¾ßÓÐÁËÌØÈ¨¡£²é¿´¿Í»§µÄʵ¼ÊÓû§ID¾Í¿É  
ÒÔ¾ö¶¨¿Í»§µÄÉí·Ý¡££¨Çë»ØÒä8.9½Ú£¬´ÓÖпÉÁ˽⵽ÔÚexecǰºóʵ¼ÊÓû§IDºÍʵ¼Ê  
×éID²¢Ã»Óиı䡣£©  
ÔÚÕâÖÖ°²ÅÅÏ£¬ÎÒÃÇ¿ÉÒÔ¹¹ÖþÒ»¸ö"¿ª·ÅʽµÄ·þÎñÕß"¡££¨ÔÚ15.4½ÚÖÐÎÒÃÇÌṩÁËÕâ  
ÖÖ¿Í»§ºÍ·þÎñÕßµÄÒ»ÖÖʵÏÖ¡££©ËüΪ¿Í»§¿ª·ÅÎļþ¶ø²»Êǿͻ§µ÷ÓÃopenº¯Êý¡£ÕâÑù  
¾Í¿ÉÒÔÔö¼ÓÔÚÕý³£µÄUnixÓû§/×é/ÆäËûÐí¿ÉȨ֮ÉÏ»òÖ®ÍâµÄ¸½¼ÓµÄÐí¿ÉȨ¼ì²é¡£ÎÒ  
ÃǼٶ¨·þÎñÕßÊÇÉèÖÃ_Óû§_ID³ÌÐò£¬Õâ¸øÓèÁËËü¸½¼ÓµÄÐí¿ÉȨ£¨ºÜ¿ÉÄÜÊÇrootÐí¿É  
Ȩ£©¡£·þÎñÕßÓÿͻ§µÄʵ¼ÊÓû§IDÒÔ¾ö¶¨ÊÇ·ñ¸øÓèËü¶ÔËùÒªÇóµÄÎļþµÄ´æÈ¡¡£Ê¹Óà 
ÕâÖÖ·½Ê½£¬ÎÒÃÇ¿ÉÒÔ¹¹ÖþÒ»¸ö·þÎñÕߣ¬ËüÔÊÐíijÖÖÓû§Í¨³£Ã»ÓеĴæÈ¡È¨¡£  
ÔÚ´ËÀý×ÓÖУ¬ÒòΪ·þÎñÕßÊǸ¸½ø³ÌµÄ×Ó½ø³Ì£¬ËùÒÔËüÄÜ×öµÄÒ»ÇÐÊǽ«ÎļþÄÚÈÝ´«ËÍ  
¸ø¸¸½ø³Ì¡£ÕâÖÖ·½Ê½¶ÔÒ»°ãÎļþ¹¤×÷µÃºÜºÃ£¬Í¬Ê±£¬Ò²¿É±»ÓÃÓÚרÓÃÉ豸Îļþ¡£ÎÒ  
ÃÇÏ£ÍûÄÜ×öµÄÊÇʹ·þÎñÕß´ò¿ªËùÒªµÄÎļþ£¬²¢½«ÎļþÃèÊö·ûËͻء£¸¸½ø³Ì¿ÉÏò×Ó½ø  
³Ì´«ËÍ´ò¿ªÎļþÃèÊö·û£¬¶ø×Ó½ø³ÌÔò²»ÄÜÏò¸¸½ø³Ì´«»ØÒ»¸öÃèÊö·û¡££¨³ý·ÇʹÓÃÎÒ  
Ãǽ«ÔÚÏÂÒ»Õ½éÉܵÄרÃűà³Ì¼¼Êõ¡££©  
ÏÂÒ»ÖÖ·þÎñÕßÀàÐÍÎÒÃÇÒÑÏÔʾÓÚͼ14.13ÖУ¬·þÎñÕßÊÇÒ»¸ö¾«Áé½ø³Ì£¬¿Í»§ÔòÓÃij  
ÖÖÐÎʽµÄIPCÓëÆäÁªÏµ¡£ÎÒÃÇ¿ÉÒÔ½«¹ÜµÀÓÃÓÚÕâÖÖÐÎʽµÄ¿Í»§Ò»·þÎñÕß¹ØÏµ¡£ÒªÇó  
ÓÐÒ»ÖÖÃüÃûµÄIPC£¬ÀýÈçFIFO»òÏûÏ¢¶ÓÁС£¶ÔÓÚFIFOÈç¹û·þÎñÕßÐ뽫Êý¾ÝËͻؿͻ§  
£¬Ôò¶Ôÿ¸ö¿Í»§¶¼ÒªÓе¥¶ÀʹÓõÄFIFO¡£Èç¹û¿Í»§Ò»·þÎñÕßÓ¦ÓóÌÐòÖ»Óпͻ§Ïò·þ  
ÎñÕßËÍÊý¾Ý£¬ÔòÖ»ÐèÒªÒ»¸öÖÚËùÖÜÖªµÄFIFO¡££¨ÏµÍ³VÐÐʽ´òÓ¡»ú¼ÙÍÑ»ú³ÌÐòʹÓà 
ÕâÖÖÐÎʽµÄ¿Í»§Ò»·þÎñÕß¡£¿Í»§ÊÇlp(1)ÃüÁ·þÎñÕßÊÇlpsched½ø³Ì¡£ÒòΪֻÓдӠ 
¿Í»§µ½·þÎñÕßµÄÊý¾ÝÁ÷£¬Ã»ÓÐÈκÎÊý¾ÝÐèËͻؿͻ§£¬ËùÓÐÖ»ÐèʹÓÃÒ»¸öFIFO¡£  
ʹÓÃÏûÏ¢¶ÓÁÐÔò´æÔÚ¶àÖÖ¿ÉÄÜÐÔ£º  
1. ÔÚ·þÎñÕߺÍÒª¿Í»§Ö®¼ä¿ÉÒÔֻʹÓÃÒ»¸ö¶ÓÁУ¬Ê¹ÓÃÿ¸öÏûÏ¢µÄÀàÐÍ×Ö¶ÎÖ¸Ã÷Ë­  
ÊÇÏûÏ¢µÄ½ÓÊÜÕß¡£ÀýÈ磬¿Í»§¿ÉÒÔÓÃÀàÐÍ×Ö¶ÎΪ1·¢ËÍËüÃǵÄÏûÏ¢¡£ÔÚÒªÇóÖ®ÖÐÓ¦  
°üÀ¨¿Í»§µÄ½ø³ÌID¡£´Ëºó£¬·þÎñÕßÔÚ·¢ËÍÏìÓ¦ÏûϢʱ£¬½«ÀàÐÍ×Ö¶ÎÉèÖÃΪ¿Í»§µÄ½ø  
³ÌID¡£·þÎñÕßÖ»½ÓÊÜÀàÐÍ×Ö¶ÎΪ1µÄÏûÏ¢£¨msgrcvµÄµÚËĸö²ÎÊý£©£¬¿Í»§ÔòÖ»½ÓÊÜ  
ÀàÐÍ×ֶεÈÓÚËüÃǵĽø³ÌIDµÄÏûÏ¢¡£  
2. ÁíÒ»ÖÖ·½·¨ÊÇÿ¸ö¿Í»§Ê¹ÓÃÒ»¸öµ¥¶ÀµÄÏûÏ¢¶ÓÁС£ÔÚÏò·þÎñÕß·¢Ë͵ÚÒ»¸öÇëÇó  
֮ǰ£¬Ã¿¸ö¿Í»§ÏÈ´´½¨Ëü×Ô¼ºµÄÏûÏ¢¶ÓÁУ¬´´½¨Ê±Óùؼü×ÖIPC_PRIVATE·þÎñÕßÒ²  
ÓÐËü×Ô¼ºµÄ¶ÓÁУ¬Æä¹Ø¼ü×Ö»ò±êʶ·ûÊÇËùÓпͻ§ÊÇÄÜÖªµÀµÄ¡£¿Í»§½«ÆäµÚÒ»¸öÇëÇó  
Ë͵½·þÎñÕßµÄÖÚËùÖÜÖªµÄ¶ÓÁÐÉÏ£¬¸ÃÇëÇóÖÐÓ¦°üº¬Æä¿Í»§ÏûÏ¢¶ÓÁеĶÓÁÐID¡£·þÎñ  
Õß½«ÆäµÚÒ»¸öÏìÓ¦ËÍÖÁ¿Í»§¶ÓÁУ¬´ËºóµÄËùÓÐÇëÇóºÍÏìÓ¦¶¼Ôڴ˶ÓÁÐÉϽ»»»¡£  
ʹÓÃÕâÖÖ¼¼ÊõµÄÒ»¸öÎÊÌâÊÇ£ºÃ¿¸ö¿Í»§×¨ÓöÓÁÐͨ³£Ö»ÓÐÒ»¸öÏûÏ¢ÔÚÆäÖÐ--»òÕßÊÇ  
¶Ô·þÎñÕßµÄÒ»¸öÇëÇ󣬻òÕßÊǶԿͻ§µÄÏìÓ¦¡£ÕâËÆºõÊǶÔÓÐÏÞµÄϵͳ×ÊÔ´£¨ÏûÏ¢¶Ó  
ÁУ©µÄÀË·Ñ£¬¿ÉÒÔÓÃÒ»¸öFIFOÀ´´úÌæ¡£ÁíÒ»¸öÎÊÌâÊÇ·þÎñÕßÐè´Ó¶à¸ö¶ÓÁжÁÏûÏ¢¡£  
¶ÔÓÚÏûÏ¢¶ÓÁУ¬selectºÍpoll¶¼²»Æð×÷Óà 
ʹÓÃÏûÏ¢¶ÓÁеÄÕâÁ½ÖÖ¼¼Êõ¶¼¿ÉÒÔÓù²Ïí´æ´¢¶ÎºÍͬ²½·½·¨£¨ÐźÅÁ¿»ò¼ÇÂ¼Ëø£©Êµ  
ÏÖ¡£Ê¹Óù²Ïí´æ´¢¶ÎµÄÎÊÌâÊÇ£¬Ò»´ÎÖ»ÄÜÓÐÒ»¸öÏûÏ¢ÔÚ¹²Ïí´æ´¢¶ÎÖÐ--ÀàËÆÓÚ¶ÓÁР 
ÏÞÖÆÎªÖ»ÄÜÓÐÒ»¸öÏûÏ¢¡£Îª´Ë£¬ÔÚʹÓù²Ïí´æ´¢IPCʱ£¬Í¨³£Ã¿¸ö¿Í»§Ê¹ÓÃÒ»¸ö¹²  
Ïí´æ´¢¶Î¡£  
ÕâÖÖÀàÐ͵Ŀͻ§Ò»·þÎñÕß¹ØÏµ£¨¿Í»§ºÍ·þÎñÕßÊÇÎÞ¹ØÏµ½ø³Ì£©µÄÎÊÌâÊÇ£»·þÎñÕßÈç  
ºÎ׼ȷµØ±êʶ¿Í»§¡£³ý·Ç·þÎñÕßÕýÔÚÖ´ÐÐÒ»ÖÖ·ÇÌØÈ¨²Ù×÷£¬·ñÔò·þÎñÕßÖªµÀË­Êǿ͠ 
»§ÊǺÜÖØÒªµÄ¡£ÀýÈ磬Èô·þÎñÕßÊÇÒ»¸öÉèÖÃ_Óû§_ ID³ÌÐò£¬¾ÍÓÐÕâÖÖÒªÇó¡£ËäÈ»  
£¬ËùÓÐÕ⼸ÖÖÐÎʽµÄIPC¶¼ÊǾ­ÓÉϵͳºËµÄ£¬µ«ÊÇËüÃDz¢Î´ÌṩÈκδëʩʹϵͳºË  
Äܹ»±êʶ·¢ËÍÕß¡£  
¶ÔÓÚÏûÏ¢¶ÓÁУ¬Èç¹ûÔÚ¿Í»§ºÍ·þÎñÕßÖ®¼äʹÓÃÒ»¸öרÓöÓÁУ¨ÓÚÊÇÒ»´ÎÖ»ÓÐÒ»¸öÏû  
Ï¢ÔڸöÓÁÐÉÏ£©£¬ÄÇô¶ÓÁеÄmsg_lspid°üº¬Á˶Է½½ø³ÌµÄ½ø³ÌID¡£µ«Êǵ±¿Í»§½«  
ÇëÇó·¢Ë͸ø·þÎñÕßʱ£¬ÎÒÃÇÏëÒª¿Í»§µÄÓÐЧÓû§ID£¬¶ø²»ÊÇËüµÄ½ø³ÌID¡£ÏÖÔÚ»¹Ã»  
ÓÐÒ»ÖÖ¿ÉÒÆÖ²µÄ·½·¨£¬ÔÚÒÑÖª½ø³ÌIDÇé¿öÏÂÓÃÆä¿ÉÒԵõ½ÓÐЧÓû§ID¡££¨È·Êµ£¬Ïµ  
ͳºËÔÚ½ø³Ì±íÏîÖб£³ÖÓÐÕâÁ½ÖÖÖµ£¬µ«Êdzý·Ç³¹µ×¼ì²éϵͳºË´æ´¢¿Õ¼ä£¬·ñÔòÒÑÖª  
Ò»¸ö£¬ÎÞ·¨µÃµ½ÁíÒ»¸ö¡££©  
ÎÒÃǽ«ÔÚ15.5.2ÖÐʹÓÃÏÂÁм¼Êõ,ʹ·þÎñÕß¿ÉÒÔ±êʶ¿Í»§¡£Í¬ÑùµÄ¼¼ÊõÒ²¿ÉÓÃÓÚFI  
FO¡¢ÏûÏ¢¶ÓÁС¢ÐźÅÁ¿»ò¹²Ïí´æ´¢¡£ÏÂÃæµÄ˵Ã÷ÊǾßÌåÕë¶Ô°´Í¼14.13Öеķ½Ê½Ê¹  
ÓÃFIFOÇé¿öµÄ¡£¿Í»§±ØÐë´´½¨Ëü×Ô¼ºµÄFIFO£¬²¢ÇÒÉèÖÃFIFOµÄÎļþ´æÈ¡Ðí¿ÉȨ£¬Ê¹  
µÃÖ»ÔÊÐíÓû§_¶Á£¬Óû§_д¡£ÎÒÃǼٶ¨·þÎñÕß¾ßÓг¬¼¶Óû§ÌØÈ¨£¨»òÕßËüºÜ¿ÉÄܲ¢  
²»¹ØÐĿͻ§µÄÕæÊµ±êʶ£©£¬ËùÒÔ·þÎñÕßÈԿɶÁ¡¢Ð´´ËFIFO¡£µ±·þÎñÕßÔÚ·þÎñÕßµÄÖÚ  
ËùÖÜÖªµÄFIFOÉϽÓÊܵ½¿Í»§µÄµÚÒ»¸öÇëÇóʱ£¨ËüÓ¦µ±°üº¬¿Í»§×¨ÓÃFIFOµÄ±êʶ£©£¬  
·þÎñÕßµ÷ÓÃÕë¶Ô¿Í»§×¨ÓÃFIFOµÄstat»òfstat¡£·þÎñÕßËù²ÉÓõļÙÉèÊÇ£»¿Í»§µÄÓР 
ЧÓû§IDÊÇFIFOµÄÊôÖ÷£¨stat½á¹¹µÄst_uid×ֶΣ©¡£·þÎñÕßÑéÖ¤¸ÃFIFOÖ»ÓÐÓû§_  
¶Á¡¢Óû§_дÐí¿ÉȨ¡£·þÎñÕß»¹Ó¦¼ì²éµÄÊǸÃFIFOµÄÈý¸öʱ¼äÁ¿£¨stat½á¹¹ÖеÄst  
_atime,st_mtimeºÍst_ctime×ֶΣ©£¬Òª¼ì²éËüÃÇÓ뵱ǰʱ¼äÊÇ·ñºÜ½Ó½ü£¨ÀýÈç²»  
ÔçÓÚµ±Ç°Ê±¼ä15Ãë»ò30Ã룩¡£Èç¹ûÒ»¸öÓÐԤıµÄ¿Í»§¿ÉÒÔ´´½¨Ò»¸öFIFO£¬Ê¹ÁíÒ»¸ö  
Óû§³ÉΪÆäÊôÖ÷£¬²¢ÇÒÉèÖøÃÎļþµÄÐí¿ÉȨΪÓû§¶ÁºÍÓû§Ð´£¬ÄÇôÔÚϵͳÖоʹ栠
ÔÚÁËÆäËü»ù´¡ÐԵݲȫÎÊÌâ¡£  
ΪÁËÔÚϵͳV IPCÖÐÓ¦ÓÃÕâÖÖ¼¼Êõ£¬Çë»ØÏëÒ»ÏÂÓëÿ¸öÏûÏ¢¶ÓÁС¢ÐźÅÁ¿¡¢ÒÔ¼°¹²  
Ïí´æ´¢¶ÎÏà¹ØµÄipc_perm½á¹¹£¬ÆäÖÐcuidºÍcgid×ֶαêʶIPC½á¹¹µÄ´´½¨Õß¡£ÒÔFI  
FOΪÀý£¬·þÎñÕßÓ¦µ±ÒªÇó¿Í»§´´½¨¸ÃIPC½á¹¹£¬²¢Ê¹¿Í»§½«´æÈ¡È¨ÉèÖÃΪֻÔÊÐíÓà 
»§¶ÁºÍÓû§Ð´¡£·þÎñÕßÒ²Ó¦¼ìÑéÓë¸ÃIPCÏà¹ØµÄʱ¼äÁ¿Ó뵱ǰʱ¼äÊÇ·ñºÜ½Ó½ü£¨Òò  
ΪÕâЩIPC½á¹¹ÔÚÏÔʽµØÉ¾³ý֮ǰ£¬Ò»Ö±´æÔÚ£©¡£  
ÔÚ15.5.1ÖУ¬ÎÒÃǽ«»á¿´µ½½øÐÐÕâÖÖÉí·ÝÑéÖ¤¹¤×÷µÄÒ»ÖÖ¸üºÃ·½·¨ÊÇϵͳºËÌṩ¿Í  
»§µÄÓÐЧÓû§IDºÍÓÐЧ×éID¡£SVR4ÔÚ½ø³ÌÖ®¼ä´«ËÍÎļþÃèÊö·ûʱ¿ÉÒÔ×öµ½ÕâÒ»µã¡£  
   
14.11ÕªÒª  
±¾ÕÂÏêϸ˵Ã÷Á˽ø³Ì¼äͨÐŵĶàÖÖÐÎʽ£»¹ÜµÀ¡¢ÃüÃû¹ÜµÀ£¨FIFO£©ÒÔ¼°ÁíÍâÈýÖÖI  
PCÐÎʽ£¬Í¨³£³ÆÖ®ÎªÏµÍ³V IPC-ÏûÏ¢¶ÓÁУ¬ÐźÅÁ¿ºÍ¹²Ïí´æ´¢¡£ÐźÅÁ¿Êµ¼ÊÉÏÊÇͬ  
²½Ô­Óï¶ø²»ÊÇIPC£¬³£ÓÃÓÚ¹²Ïí×ÊÔ´µÄͬ²½´æÈ¡£¬ÀýÈç¹²Ïí´æ´¢¶Î¡£¶ÔÓڹܵÀ£¬ÎÒ  
ÃÇ˵Ã÷ÁËpopenµÄʵÏÖ£¬ËµÃ÷ÁËЭͬ½ø³Ì£¬ÒÔ¼°Ê¹Óñê×¼I/O¿â»º´æ»úÖÆÊ±¿ÉÄÜÓöµ½  
µÄÎÊÌâ¡£  
ÔÚʱ¼ä·½Ã棬¶ÔÏûÏ¢¶ÓÁÐ-Á÷¹ÜµÀ¡¢ÐźÅÁ¿-¼ÇÂ¼Ëø×÷Á˱ȽϺó£¬ÎÒÃÇÌá³öÁËÏÂÁн¨  
Ò飻ѧ»áʹÓùܵÀºÍFIFO£¬ÒòΪÔÚ´óÁ¿Ó¦ÓóÌÐòÖÐÈÔ¿ÉÓÐЧµØÊ¹ÓÃÕâÁ½ÖÖ»ù±¾¼¼Êõ  
¡£ÔÚеÄÓ¦ÓóÌÐòÖУ¬Òª¾¡¿ÉÄܱÜÃâʹÓÃÏûÏ¢¶ÓÁÐÒÔ¼°ÐźÅÁ¿¡£´úÖ®ÒÔÓ¦µ±¿¼ÂÇÁ÷  
¹ÜµÀºÍ¼ÇÂ¼Ëø£¬ÒòΪËüÃÇÓëUnixϵͳºËµÄÆäËü²¿·Ö¼¯³ÉµÃÒªºÃµÃ¶à¡£¹²Ïí´æ´¢¶ÎÓР 
ÆäÓ¦Óó¡ºÏ£¬¶ømmapº¯Êý£¨12.0½Ú£©Ôò¿ÉÄÜÔÚÒÔºóµÄ°æ±¾ÖÐÆð¸ü´ó×÷Óᣠ 
ÏÂÒ»Õ½«½éÉÜһЩ¸üÏȽøµÄIPCÐÎʽ£¬ËüÃÇÊÇÓɸü¼ÓеÄϵͳ£¬ÀýÈçSVR4ºÍ4.3+BS  
DÌṩµÄ¡£  
ϰÌ⣺  
14.1 ÔÚ³ÌÐò14.2µÄ¸¸½ø³Ì´úÂëµÄĩβ£¬É¾³ýwaitpidǰµÄcloseµÄ½á¹ûÈçºÎ£¿  
14.2 ÔÚ³ÌÐò14.2µÄ¸¸½ø³Ì´úÂëµÄĩβ£¬É¾³ýwaitpidµÄ½á¹ûÈçºÎ£¿  
14.3 Èç¹ûpopenµÄ²ÎÊýÊÇÒ»¸ö²»´æÔÚµÄÃüÁî»áÓÐʲô½á¹û£¿±àдһ¶Î³ÌÐò²âÊÔһϠ 
¡£  
14.4 É¾³ý³ÌÐò14.9ÖеÄÐźÅÁ¿´¦Àí³ÌÐò£¬Ö´ÐгÌÐò²¢ÖÕÖ¹×Ó½ø³Ì¡£ÊäÈëÒ»Ðк󣬠 
ÔõÑùÄÜ˵Ã÷¸¸½ø³ÌÊÇÓÉSIGPIPEÖÕÖ¹µÄ£¿  
14.5 ½«³ÌÐò14.9ÖнøÐйܵÀ¶Á¡¢Ð´µÄreadºÍwriteÓñê×¼I/O¿â´úÌæ¡£  
14.6 POSIX.1¼ÓÈëwaitpidº¯ÊýµÄÀíÓÉÖ®Ò»ÊÇPOSIX.1ǰµÄ´ó¶àÊýϵͳ²»ÄÜ´¦ÀíÏÂÃæ  
µÄ´úÂë¡£  
                if ( (fp = popen ( "bin/true", "r" ) ) = NULL )  
                        ¡­  
                if ( ( rc = system ( "sleep 100" ) ) == -1 )  
                        ¡­  
                if ( pclose ( fp ) == -1)  
                        ¡­  
        ÈôÔÚÕâ¶Î´úÂëÖв»Ê¹ÓÃwaitpidº¯Êý»áÈçºÎ£¿ÓÃwait´úÌæÄØ£¿  
14.7 µ±Ò»¸ö¹ÜµÀ±»Ð´Õ߹رպ󣬽âÊÍselectºÍpollÈçºÎ´¦Àí¸Ã¹ÜµÀµÄÊäÈëÃèÊö·û  
£¿µ±Ò»¸ö¹ÜµÀµÄ¶Á¶Ë°Ù¹Ø±Õʱ£¬ÇëÖØ×ö´ËϰÌâÒԲ鿴¸Ã¹ÜµÀµÄÊä³öÃèÊö·û¡£±àÁ½¸ö  
²âÊÔ³ÌÐò£¬Ò»¸öÓÃselectÒ»¸öÓÃpollÈ·¶¨´ð°¸ÊÇ·ñÕýÈ·¡£  
14.8 Èç¹ûpopenÒÔÀàÐÍ"r"Ö´ÐÐcmdstring²¢½«½á¹ûдµ½±ê×¼³ö´íÊä³ö£¬½á¹ûÈçºÎ£¿  
   
14.9 popen»áʹµÃshellÖ´ÐÐËüµÄcmdstring²ÎÊý£¬µ±cmdstringÖÕֹʱ»á²úÉúʲô  
½á¹û£¿(Ìáʾ£º»­³ö°üº¬µÄËùÓнø³Ì)  
14.10 ´ó¶àÊýUnixϵͳÔÊÐí¶ÁдFIFO£¬µ«ÊÇPOSIX.1ÌØ±ðÉùÃ÷ûÓж¨ÒåΪ¶Áд¶ø´ò  
¿ªFIFO¡£ÇëÓ÷Ç×èÈû·½·¨ÊµÏÖΪ¶Áд¶ø´ò¿ªFIFO¡£  
14.11 ³ý·ÇÎļþ°üº¬Ãô¸Ð»ò»úÃÜÊý¾Ý£¬·ñÔòÔÊÐíÆäËüÓû§¶ÁÎļþ²»»áÔì³ÉË𺦡£µ«  
 
ÊÇ£¬Èç¹ûÒ»¸ö¶ñÒâ½ø³Ì¶ÁÈ¡Á˱»Ò»¸ö·þÎñÆ÷ºÍ¼¸¸ö¿Í»§½ø³ÌʹÓõÄÏûÏ¢¶ÓÁÐÖеÄÒ»  
ÌõÏûÏ¢ºó»áÓÐʲô½á¹û£¿¶ñÒâ½ø³ÌÐèÒªÖªµÀÄÄЩÐÅÏ¢¾Í¿ÉÒÔ¶ÁÏûÏ¢¶ÓÁУ¿  
14.12 ±àдһ¶Î³ÌÐòÍê³ÉÏÂÃæµÄ¹¤×÷£º  
        Ñ­»·Îå´Î´´½¨Ò»¸öÏûÏ¢¶ÓÁУ¬²¢´òÓ¡¶ÓÁеıêʶ·û£¬È»ºóɾ³ý¶ÓÁС£½Ó×ÅÔÙÑ­»·  
Îå´ÎÀûÓùؼü×ÖIPC_PRIVATE´´½¨ÏûÏ¢¶ÓÁв¢½«Ò»ÌõÏûÏ¢·ÅÔÚ¶ÓÁÐÖУ¬³ÌÐòÖÕÖ¹ºó  
ÓÃipcs(1)²é¿´ÏûÏ¢¶ÓÁС£½âÊͶÓÁбêʶ·ûµÄ±ä»¯¡£  
14.13 ÃèÊöÈçºÎÔÚ¹²ÏíÄÚ´æ¶ÎÖн¨Á¢Ò»¸öÊý¾Ý¶ÔÏóµÄÁ¬½ÓÁÐ±í¡£ÁбíÖ¸ÕëÈçºÎ±£´æ  
£¿  
14.14 »­³ö³ÌÐò14.12µÄ±äÁ¿iÔÚ¸¸½ø³ÌºÍ×Ó½ø³ÌÖÐËæÊ±¼ä±ä»¯µÄÖµ¡£ÓÉupdateº¯Êý  
·µ»Ø¸ÃÖµ£¬ÆäÀàÐÍΪ³¤ÕûÐÍ£¬±£´æÔÚ¹²ÏíÄÚ´æÇø¡£¼ÙÉèforkºó×Ó½ø³ÌÏÈÔËÐС£  
14.15 Ê¹ÓÃ14.9½ÚµÄshmXXXº¯Êý´úÌæ¹²ÏíÄÚ´æÓ³ÉäÇøÖØÐ´³ÌÐò14.12¡£  
14.16 Ê¹ÓÃ14.8½ÚϵͳVÌṩµÄÐźÅÁ¿º¯ÊýÖØÐ´³ÌÐò14.12ʵÏÖ¸¸½ø³ÌÓë×Ó½ø³Ì¼äµÄ  
½»Ìæ¡£  
14.17 Ê¹Óý¨ÒéÐÔ¼ÇÂ¼Ëø¶¨·½·¨ÖØÐ´³ÌÐò14.12ʵÏÖ¸¸½ø³ÌÓë×Ó½ø³Ì¼äµÄ½»Ìæ¡£  
14.18 ½âÊÍmmapº¯ÊýµÄÎļþÃèÊö·û²ÎÊýÈçºÎÔÚ4.3+BSDϵͳÄäÃûÄÚ´æÓ³É䷽ʽÏÂÔÊ  
Ðí²»Ïà¹Ø½ø³Ì¼äµÄÄÚ´æ¹²Ïí¡£  
   
   
--  
 
 
-- 
¡ù À´Ô´:¡¤BBS Ë®Ä¾Ç廪վ smth.org¡¤[FROM: 202.38.248.38] 

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