ºìÁªLinuxÃÅ»§
Linux°ïÖú

ÔÚLinuxÖÐʵÏÖÄÚ²¿½ø³ÌͨÐÅ

·¢²¼Ê±¼ä:2005-11-22 17:46:41À´Ô´:ºìÁª×÷Õß:ºÎ¸ç
Linux¸øÎÒÃÇÌṩÁ˷ḻµÄÄÚ²¿½ø³ÌͨÐÅ»úÖÆ£¬°üÀ¨¹²ÏíÄÚ´æ¡¢ÄÚ´æÓ³ÉäÎļþ¡¢ÏÈÈëÏȳö£¨FIFO£©¡¢½Ó¿Ú£¨sockets£©ÒÔ¼°¶àÖÖÓÃÓÚͬ²½µÄ±êʶ¡£ÔÚ±¾ÎÄÖУ¬ÎÒÃÇÖ÷ÒªÌÖÂÛһϹ²ÏíÄÚ´æºÍÄÚ´æÓ³ÉäÎļþ¼¼Êõ¡£
¡¡¡¡
¡¡¡¡Ò»°ãÀ´Ëµ£¬ÄÚ²¿½ø³ÌͨÐÅ£¨interprocess communication£©Ò²¾ÍÊÇIPC£¬ÊÇÖ¸Á½¸ö»òÁ½¸öÒÔÉϽø³ÌÒÔ¼°Á½¸ö»òÕßÁ½¸öÒÔÉÏÏß³ÌÖ®¼ä½øÐÐͨÐÅÁªÏµ¡£Ã¿¸öIPC»úÖƶ¼Óв»Í¬µÄÇ¿Ïî»òÕßÈõµã£¬²»¹ýûÓÐÒ»¸öIPC»úÖÆ°üº¬ÄÚ½¨µÄͬ²½·½·¨¡£Òò´Ë³ÌÐòÔ±²»µ«ÐèÒª×Ô¼ºÔÚ³ÌÐòÖÐʵÏÖͬ²½£¬¶øÇÒ»¹ÐèҪΪÁËÀûÓÃIPC»úÖƶø×Ô¼º¿ª·¢Í¨ÐÅЭÒé¡£
¡¡¡¡
¡¡¡¡¹²ÏíÄÚ´æ
¡¡¡¡
¡¡¡¡Ê¹Óù²ÏíÄÚ´æºÍʹÓÃmallocÀ´·ÖÅäÄÚ´æÇøÓòºÜÏàËÆ¡£Ê¹Óù²ÏíÄÚ´æµÄ·½·¨ÊÇ£º
¡¡¡¡
¡¡¡¡1.¶ÔÒ»¸ö½ø³Ì/Ïß³ÌʹÓÃshmget·ÖÅäÄÚ´æÇøÓò¡£
¡¡¡¡
¡¡¡¡2.ʹÓÃshmat·ÅÖÃÒ»¸ö»ò¶à¸ö½ø³Ì/Ïß³ÌÔÚ¹²ÏíÄÚ´æÖУ¬ÄãÒ²¿ÉÒÔÓÃshmctlÀ´»ñÈ¡ÐÅÏ¢»òÕß¿ØÖƹ²ÏíÇøÓò¡£
¡¡¡¡
¡¡¡¡3.ʹÓÃshmdt´Ó¹²ÏíÇøÓòÖзÖÀë¡£
¡¡¡¡
¡¡¡¡4.ʹÓÃshmctl½â³ý·ÖÅä¿Õ¼ä
¡¡¡¡
¡¡¡¡ÏÂÃæÊǸöÀý×Ó:
¡¡¡¡
¡¡¡¡//½¨Á¢¹²ÏíÄÚ´æÇøÓò
¡¡¡¡intshared_id;
¡¡¡¡char *region;
¡¡¡¡const intshm_size = 1024;
¡¡¡¡
¡¡¡¡shared_id = shmget(IPC_PRIVATE,//±£Ö¤Ê¹ÓÃΨһID
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ shm_size,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ IPC_CREAT | IPC_EXCL |//´´½¨Ò»¸öеÄÄÚ´æÇøÓò
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ S_IRUSR | S_IWUSR);//ʹµ±Ç°Óû§¿ÉÒÔ¶ÁдÕâ¸öÇøÓò
¡¡¡¡
¡¡¡¡//½»²æ½ø³Ì»òÉú³É½ø³Ì.
¡¡¡¡
¡¡¡¡//½«Ð½¨µÄÄÚ´æÇøÓò·ÅÈë½ø³Ì/Ïß³Ì
¡¡¡¡region = (char*) shmat(segment_id, 0, 0);
¡¡¡¡
¡¡¡¡//ÆäËû³ÌÐò´úÂë
¡¡¡¡...
¡¡¡¡
¡¡¡¡//½«¸÷¸ö½ø³Ì/Ï̷߳ÖÀë³öÀ´
¡¡¡¡shmdt(region);
¡¡¡¡
¡¡¡¡//ÆÆ»µµô¹²ÏíÄÚ´æÇøÓò
¡¡¡¡shmctl(shared_id, IPC_RMID, 0);
¡¡¡¡
¡¡¡¡¹²ÏíÄÚ´æÊÇLinuxÖÐ×î¿ìËÙµÄIPC·½·¨¡£ËûÒ²ÊÇÒ»¸öË«Ïò¹ý³Ì£¬¹²ÏíÇøÓòÄÚµÄÈκνø³Ì¶¼¿ÉÒÔ¶ÁдÄÚ´æ¡£Õâ¸ö»úÖƵIJ»Àû·½ÃæÊÇÆäͬ²½ºÍЭÒ鶼²»ÊܳÌÐòÔ±¿ØÖÆ£¬Äã±ØÐëÈ·±£½«¾ä±ú´«µÝ¸øÁË×Ó½ø³ÌºÍÏ̡߳£
¡¡¡¡
¡¡¡¡ÄÚ´æÓ³ÉäÎļþ
¡¡¡¡
¡¡¡¡ÄÚ´æÓ³ÉäÎļþ²»½ö½öÓÃÓÚIPC£¬ÔÚÆäËû½ø³ÌÖÐËüÒ²Óкܴó×÷Óá£Èç¹ûÄãÐèÒª½«Ò»¸ö·ÖÅäµÄ»º³åÇø³õʼ»¯ÎªÁ㣬ֻҪ¼Çס/dev/zero ¡£ÄãÒ²¿ÉÒÔͨ¹ý½«ÎļþÓ³Éäµ½ÄÚ´æÖÐÒÔÌá¸ßÆäÐÔÄÜ¡£ËüʹÄã¿ÉÒÔÏñ¶Áд×Ö·û´®Ò»Ñù¶ÁдÎļþ¡£ÏÂÃæÊǸöÀý×Ó£º
¡¡¡¡
¡¡¡¡const char filename[] = "testfile";
¡¡¡¡intfd;
¡¡¡¡char *mapped_mem;
¡¡¡¡const intflength = 1024;
¡¡¡¡fd = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
¡¡¡¡lseek(fd, flength + 1, SEEK_SET);
¡¡¡¡write(fd, "\0", 1);
¡¡¡¡lseek(fd, 0, SEEK_SET);
¡¡¡¡
¡¡¡¡mapped_mem = mmap(0,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡flength,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡PROT_WRITE, //ÔÊÐíдÈë
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡MAP_SHARED,//дÈëÄÚÈݱ»Á¢¼´Ð´Èëµ½Îļþ
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡fd,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡0);
¡¡¡¡
¡¡¡¡close(fd);
¡¡¡¡
¡¡¡¡//ʹÓÃÓ³ÉäÇøÓò.
¡¡¡¡...
¡¡¡¡
¡¡¡¡munmap(file_memory, flength);
¡¡¡¡
¡¡¡¡ÀûÓÃÄÚ´æÓ³ÉäÀ´´¦ÀíIPCµÄºÃ´¦ÊÇÔÚÕû¸ö¹ý³ÌÖÐÄã²»ÐèÒª´¦Àí¾ä±ú£ºÖ»Òª´ò¿ªÎļþ²¢°ÑËüÓ³ÉäÔÚºÏÊʵÄλÖþÍÐÐÁË¡£Äã¿ÉÒÔÔÚÁ½¸ö²»Ïà¹ØµÄ½ø³Ì¼äʹÓÃÄÚ´æÓ³ÉäÎļþ¡£
¡¡¡¡
¡¡¡¡Ê¹ÓÃÄÚ´æÓ³ÉäµÄȱµãÊÇËٶȲ»Èç¹²ÏíÄÚ´æ¿ì¡£Èç¹û´ÕÇÉÎļþºÜ´ó£¬ËùÐèÒªµÄÐéÄâÄÚ´æ¾Í»áºÜ´ó£¬ÕâÑù»áÔì³ÉÕûÌåÐÔÄÜϽµ¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 1 ÌõÆÀÂÛ

  1. chen ÓÚ 2006-01-09 11:10:18·¢±í:

    ¶¥Ò»ÏÂ