對於程序間通訊,之前一直是用管道進行實現。比如父子程序間使用pipe,無血緣關係的程序可以使用fifo。從來沒有想過使用共享記憶體,為什麼呢?大家還記得這本書吧《unix環境高階程式設計》,上面講解了關於共享記憶體的操作,說實話,太麻煩了,真的不好用(有好多繁雜的介面,比如shmget, shmat,shmdt,chmctl等)。現在好了,基於posix標準的共享記憶體操作變得及其簡單,總共就幾個介面可供呼叫,已經變得像操作普通檔案一樣簡單!
新的標準的介面如下:
posix 為建立、對映、同步和取消共享記憶體段提供五個入口點:
使用共享記憶體的過程是,用shm_open()
建立記憶體段,用write()
或ftruncate()
設定它的大小,用mmap()
把它對映到程序記憶體,執行其他參與者需要的操作。當使用完時,原來的程序呼叫munmap()
和shm_unlink()
,然後退出。
怎麼樣?簡單吧,就像檔案操作一樣,開啟,對映得到乙個指標,對指標操作,然後撤銷對映,關閉!
下面給出兩段示例**,以示用來進行無血緣關係的程序間通訊
[cpp]view plain
copy
#include
6 #include
7 #include
8 #include
9 #include
10 #include "util.h"
11
12 void
error_and_die(
const
char
*msg)
16
17 int
main()
18
27
28 ret = ftruncate(fd, region_size);
29 if
(ret)
30
33
34 void
*ptr = mmap(0, region_size, prot_read | prot_write , map_shared, fd, 0);
35 if
(ptr == map_failed)
36
39
40 close(fd);
41 //*(int *)ptr = 0x55aa;
42 memcpy(ptr, string, (strlen(string) + 1));
43
44 sleep(10);
45
46 ret = munmap(ptr, region_size);
47 if
(ret)
48 error_and_die("munmap"
);
49
50 ret = shm_unlink(share_memory);
51 if
(ret)
52 error_and_die("shm_unlink"
);
53 return
0;
54
55
56 }
[cpp:nogutter]view plain
copy
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include "util.h"
11
12 void
error_and_die(
const
char
*msg)
16
17 int
main()
18
26
27 ret = ftruncate(fd, region_size);
28 if
(ret)
29
32
33 void
*ptr = mmap(0, region_size, prot_read | prot_write , map_shared, fd, 0);
34 if
(ptr == map_failed)
35
38
39 close(fd);
40
41
42 printf("%s"
, (char
*)ptr);
43 ret = munmap(ptr, region_size);
44 if
(ret)
45 error_and_die("munmap"
);
46
47 ret = shm_unlink(share_memory);
48 if
(ret)
49 error_and_die("shm_unlink"
);
50
51 return
0;
52 }
**很簡單,唯一注意的地方是,第二個檔案中shm_open的時候o_tunc引數要去掉,否則記憶體又被截斷為0,讀不到東西的。
POSIX標準小結
1.posix posix 表示可移植作業系統介面 portable operating system inte ce 縮寫為 posix posix標準定義了作業系統應該為應用程式提供的介面標準,是ieee為要在各種unix作業系統上執行的軟體而定義的一系列api標準的總稱,其正式稱呼為ieee ...
POSIX標準與目錄管理
在linux作業系統中,實現了兩類對檔案io的管理,一類是遵循posix標準,linux作業系統自身提供的io系統呼叫,如open close read等函式 另一類是由ansi標準提供的標準io庫函式,這些函式是對直接io系統呼叫的封裝,其在訪問檔案時根據需要設定了不同型別的緩衝區,從而減少了直接...
Posix標準IPC筆記 1
1 usr src include 下的 errno.h 標頭檔案下宣告了乙個全域性變數 errno 每乙個unix函式在發生錯誤時都會設定 errno 在多執行緒環境下,每乙個執行緒擁有自己的errno變數。2 為了便於移植,posix ipc名字必須以斜槓符開頭,並且不能再含有其他任何斜槓符。i...