日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

        
            
        歡迎訪問 生活随笔!

        生活随笔

        當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

        生活经验

        linux共享存储通信实验,Linux进程通信——共享存储

        發布時間:2023/11/27 生活经验 33 豆豆
        生活随笔 收集整理的這篇文章主要介紹了 linux共享存储通信实验,Linux进程通信——共享存储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

        共享內存是進程間通信最有用的方式,也是最快的IPC形式。共享內存是說:同一塊內存被映射到多個進程的地址空間。但是共享內存并不提供同步機制,因此需要互斥鎖或者信號量。使用共享內存唯一需要注意的是:當前如果有進程正在向共享內存寫數據,則在寫入完成以前,別的進程不應當去讀、寫共享內存。

        共享內存最大的優點就是快。由system V演變而來的內存共享相關函數。目前Linux對system V的共享內存方式支持的比較好。在高版本的Linux內核上,我們有更多的方式來完成共享存儲。嵌入式開發板搭載的低版本內核的Linux操作系統基本上都是不支持POSIX標準的內存共享的,只能使用system V的內存共享方式。system V是通過映射特殊文件系統shm中的文件實現內存共享的。通過shmget獲得或者創建一個IPC共享內存,并返回這塊內存相應的標識符。同時會初始化內核維護的一個數據結構shmid_kernel.當然還會在shm文件系統之中創建一個不屬于任何進程的文件。shmid_kernel這個結構體之中的最重要的一個區域是shm_file。它存儲被映射文件的地址。

        跑題了,本文將介紹mmap存儲映射的方式完成的進程間通信。一種方式是使用dev目錄下的特殊文件zero。

        該文件是一個字符設備文件,該設備是0字節的無限資源。1,5是該設備的主從設備號,不是大小。

        zero接收寫向他的任何數據,但是會忽略掉這些信息。當對zero進行存儲映射的時候,它具備一下性質。

        創建一個未命名的存儲區,大小事mmap的第二個參數。

        存儲區被初始化為0。

        如果多個進程的公共祖先對mmap指定了MAP_SHARED標志,則這些進程共享此存儲區。

        一個簡單的例子如下。

        #include

        #include

        #include

        #include

        #include

        #include

        #include

        int main()

        {

        int num = 7777777;

        int fd = open("/dev/zero",O_RDWR);

        if (-1 == fd)

        {

        perror("open zero fail");

        exit(1);

        }

        int *p = mmap(0,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

        if (MAP_FAILED == p)

        {

        perror("mmap fail");

        exit(1);

        }

        close(fd);

        pid_t pid = fork();

        if (0 == pid)

        {

        num = 233;

        *p = 666;

        }

        if (0 < pid)

        {

        wait(NULL);

        printf("*p = %d\n",*p);

        printf("num = %d\n",num);

        }

        if (-1 == pid)

        {

        perror("fork fail");

        exit(1);

        }

        return 0;

        }

        在子進程中更改了存儲映射區域的值為666,也更改了num變量的值。讓子進程先運行,父進程后運行,打印輸出的結果如下。

        對于存儲映射區域,父子進程是共享的;對于變量,父子進程是獨立的。 使用zero文件的優點是mmap函數的第二個參數len可以指定任意長度,而無需關心zero文件的大小。

        Linux除了使用zero以外,它還提供了一種稱為匿名映射的方式。這種方式需要在使用mmap的時候指定MAP——ANON標志,并將文件描述符設置為-1。更改上面的程序如下。

        #include

        #include

        #include

        #include

        #include

        #include

        #include

        int main()

        {

        int num = 7777777;

        //注意這行代碼和上面程序中的不同之處

        int *p = mmap(0,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,-1,0);

        if (MAP_FAILED == p)

        {

        perror("mmap fail");

        exit(1);

        }

        //close(fd);

        pid_t pid = fork();

        if (0 == pid)

        {

        num = 233;

        *p = 666;

        }

        if (0 < pid)

        {

        wait(NULL);

        printf("*p = %d\n",*p);

        printf("num = %d\n",num);

        }

        if (-1 == pid)

        {

        perror("fork fail");

        exit(1);

        }

        return 0;

        }

        運行結果是一致的。

        本文同步分享在 博客“zy010101”(CSDN)。

        如有侵權,請聯系 support@oschina.cn 刪除。

        本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

        總結

        以上是生活随笔為你收集整理的linux共享存储通信实验,Linux进程通信——共享存储的全部內容,希望文章能夠幫你解決所遇到的問題。

        如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。