• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            鍵盤(pán)上的舞者

            My Email: marckywu@gmail.com
            隨筆 - 19, 文章 - 0, 評(píng)論 - 3, 引用 - 0
            數(shù)據(jù)加載中……

            system V IPC —— 共享內(nèi)存(下)

            使用共享內(nèi)存和記錄鎖實(shí)例。本例中,父進(jìn)程創(chuàng)建一段共享內(nèi)存,然后向其中追加字符串"Parent"(在寫(xiě)入“Parent”的時(shí)候,采用一個(gè)字符一個(gè)字符的寫(xiě)入,目的是為了驗(yàn)證記錄鎖對(duì)父子進(jìn)程同步的正確性);子進(jìn)程向共享內(nèi)存中追加字符串“Child”(同樣是一個(gè)一個(gè)的字符寫(xiě)入)。由于記錄鎖是針對(duì)文件的,所以得先創(chuàng)建一個(gè)空文件作為記錄鎖的操作對(duì)象,作為共享內(nèi)存訪問(wèn)的輔助工具,如果一個(gè)進(jìn)程對(duì)這個(gè)空文件加寫(xiě)鎖成功后,就開(kāi)始訪問(wèn)共享內(nèi)存,訪問(wèn)結(jié)束就對(duì)文件解鎖。

            代碼如下:
            #include <stdio.h>
            #include 
            <stdlib.h>
            #include 
            <string.h>

            #include 
            <unistd.h>
            #include 
            <sys/types.h>

            #include 
            <sys/wait.h>
            #include 
            <fcntl.h>

            #include 
            <sys/ipc.h>
            #include 
            <sys/shm.h>

            #define SHM_SIZE 1024            /* shared memory size(bytes) */
            #define SHM_MODE 0600            /* user read/write */

            #define WRITE_LOCK(fd) regLock((fd), F_SETLKW, F_WRLCK, 0, SEEK_SET, 0) 
            #define UN_LOCK(fd) regLock((fd), F_SETLK, F_UNLCK, 0, SEEK_SET, 0) 
            /* 創(chuàng)建一個(gè)文件 */
            int createFile()
            {
                
            int fd;

                
            if ( (fd = open("/tmp/emptyfile4shm", O_RDWR | O_CREAT, 0666)) < 0) {
                    fprintf(stderr, 
            "Create a empty file failed!\n");
                    exit(EXIT_FAILURE);
                }

                
            return fd;
            }
            /* 在文件fd上加鎖或解鎖*/
            int regLock(int fd, int cmd, int type, off_t offset, int whence, off_t len)
            {
                
            struct flock lock;

                
            lock.l_type = type;         /* lock type: F_RDLCK, F_WRLCK, F_UNLCK */
                
            lock.l_start = offset;      /* byte offset relative to l_whence */
                
            lock.l_whence = whence;    /* it's value : SEEK_SET, SEEK_CUR, SEEK_END */
                
            lock.l_len = len;           /* bytes (0 means to EOF) */

                
            return fcntl(fd, cmd, &lock);
            }

            int main(void)
            {
                
            int shmid;
                
            int filed;
                pid_t pid;
                
            char *shmptr = NULL;

                filed 
            = createFile();

                
            if ( (shmid = shmget(IPC_PRIVATE, SHM_SIZE, SHM_MODE)) < 0) { /* Create shared memory */
                    fprintf(stderr, 
            "Create shared memory failed!\n");
                    exit(EXIT_FAILURE);
                }

                
            if ( (pid = fork()) < 0) {  /* Create a child process */
                    fprintf(stderr, 
            "Create child process failed!\n");
                    exit(EXIT_FAILURE);
                }

                
            if (pid == 0) {             /* In child process */
                    
            if ( (shmptr = shmat(shmid, 00)) == (void *)-1) {
                        fprintf(stderr, 
            "Attached shared memory failed!\n");
                        exit(EXIT_FAILURE);
                    }
                    
            while (1) {
                        WRITE_LOCK(filed);  
            /* add a write lock to filed */
                        
            /* shared memory 剩余的空間不能存儲(chǔ)"Child"字符串和結(jié)束符0時(shí)就退出循環(huán) */
                        
            if (SHM_SIZE - strlen(shmptr) < strlen("Child"+ 1break
                        strcat(shmptr, 
            "C"); /* 由于加了鎖,每個(gè)Child將會(huì)連續(xù)出現(xiàn) */
                        strcat(shmptr, 
            "h");
                        strcat(shmptr, 
            "i");
                        strcat(shmptr, 
            "l");
                        strcat(shmptr, 
            "d");
                        UN_LOCK(filed);     
            /* release lock */
                    }
                    printf(
            "child process:\n\t%s\n", shmptr); /* child process print shared memory */
                        
                    exit(
            0);
                }

                
            /* In parent process */
                
            if ( (shmptr = shmat(shmid, 00)) == (void *)-1) { /* Attached shared memory */
                    fprintf(stderr, 
            "Attached shared memory failed!\n");
                    exit(EXIT_FAILURE);
                }
                
                
            while (1) {
                    WRITE_LOCK(filed);
                    
            /* shared memory 剩余的空間不能存儲(chǔ)"Parent"字符串和結(jié)束符0時(shí)就退出循環(huán) */
                    
            if (SHM_SIZE - strlen(shmptr) < strlen("Parent"+ 1break;
                    strcat(shmptr, 
            "P");/* 由于加了鎖,每個(gè)Parent將會(huì)連續(xù)出現(xiàn) */
                    strcat(shmptr, 
            "a");
                    strcat(shmptr, 
            "r");
                    strcat(shmptr, 
            "e");
                    strcat(shmptr, 
            "n");
                    strcat(shmptr, 
            "t");
                    UN_LOCK(filed);
                }
                printf(
            "parent process:\n\t%s\n", shmptr); /* parent print shared memory */

                wait(
            0);
                exit(
            0);
            }
                
                        
                
                


            posted on 2009-08-20 14:57 Marcky 閱讀(502) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Linux

            久久99精品久久久久久水蜜桃| 青草影院天堂男人久久| 中文字幕成人精品久久不卡| 亚洲成色WWW久久网站| 97精品依人久久久大香线蕉97 | 久久精品国产亚洲av瑜伽| 久久国产精品99久久久久久老狼| 久久国产免费观看精品3| 人妻精品久久久久中文字幕一冢本| 久久无码专区国产精品发布| 91麻豆国产精品91久久久| 久久无码AV中文出轨人妻| 一级a性色生活片久久无| 亚洲欧洲精品成人久久曰影片| 亚洲精品99久久久久中文字幕| 久久国产乱子伦精品免费午夜| 久久久久久久久久久免费精品| 香蕉久久夜色精品国产尤物| 久久久久亚洲av毛片大| 久久夜色精品国产| 伊人久久国产免费观看视频| 色综合久久久久综合体桃花网| 欧美熟妇另类久久久久久不卡 | 国产精品一久久香蕉国产线看观看| 亚洲精品乱码久久久久久按摩 | 久久精品中文无码资源站| 丰满少妇高潮惨叫久久久| 国内精品久久久久久中文字幕| 四虎久久影院| 99久久人妻无码精品系列蜜桃| 国产精品VIDEOSSEX久久发布| 伊人情人综合成人久久网小说| 日韩人妻无码一区二区三区久久| 免费观看成人久久网免费观看| 日韩精品无码久久一区二区三| 亚洲国产精品无码久久一线| 狠色狠色狠狠色综合久久| 久久久久亚洲AV无码专区首JN| 国产精品久久久久久搜索| 久久亚洲AV无码精品色午夜| 久久午夜电影网|