BBSˮľÇ廪վ¡Ã¾«»ªÇø
·¢ÐÅÈË: SuperSB (¹ÂÓ¥), ÐÅÇø: Linux
±ê Ìâ: [×ªÔØ]unix»·¾³¸ß¼¶±à³Ì-14
·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Wed Mar 15 14:31:10 2000)
·¢ÐÅÈË: 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ˮľÇ廪վ¡Ã¾«»ªÇø