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进程通信——共享存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 文本行倒叙,Linux基础(
- 下一篇: 怒从心头起下一句是什么呢?