struct shmid_ds ;
struct ipc_perm ;
4.4 #include
#include
開啟建立儲存段
int shmget(key_t key, size_t size, int shm***);
返回:失敗
-1,
成功返回非負的共享儲存段
id
第乙個引數
key是共享儲存關鍵字。它有特殊值
ipc_private
表示總是建立乙個程序私有的共享儲存段。
當key
值不等於
ipc_private
時,shmget
動作取決於最後乙個引數
shm***
標誌:1. ipc_creat
單獨設定此標誌,當系統中不存在相同
key時,建立乙個新的共享儲存段,否則返回已存在的共享儲存段。
2. ipc_excl
單獨設定不起作用。與
ipc_creat
同時設定時,當系統中存在相同
key時,錯誤返回。保證不會開啟乙個已存在的共享儲存段。
如果沒有指定
ipc_create
並且系統中不存在相同
key值的共享儲存段,將失敗返回。
第三個引數也可以設定共享儲存段的訪問許可權,用或於上面的值操作。
第二個引數
size
指明要求的共享儲存段的大小。當
key指定的共享儲存段已存在時,取值範圍為
0和已存在共享段大小。或簡單指定為0。
成功後此函式返回共享儲存段
id,同時建立於引數
key相連的資料結構
shmid_ds
。此節構為系統內部使用。
4.4 #include
#include
儲存段控制函式。可獲得
shmid_ds
全部內容
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
返回:失敗
-1並置
errno,
成功返回0
第乙個引數,必須由
shmget
返回的儲存段的id。
cmd為指定要求的操作。
cmd說明
引數ipc_stat
放置與shmid
相連的shmid_ds
結構當前值於
buf所指定使用者區
bufipc_set
用buf
指定的結構值代替與
shmid
相連的shmid_ds
結構值buf
ipc_rmid
刪除制定的訊號量集合
shm_lock
鎖住共享儲存段。只能由超級管理員使用
shm_unlock
unlock
共享儲存段。只能由超級管理員使用
//建立
/開啟共享儲存段,連線他到使用者位址空間,返回他在使用者空間的位址
void* shminit(key_t key, char* mode_str, int target=1) else
if (target == 0 ) else if (target == 1)
if ((retval = shmat(shmid, (void *)0, 0)) == (void*)-1)
perror("shmmat");
return retval; }
int rm_shm(key_t key)
4.5 #include
#include
儲存段連線
void *shmat(int shmid, const void *shmaddr, int shm***);
返回:失敗
-1並置
errno,
成功返回連線的實際位址
第乙個引數,必須由
shmget
返回的儲存段的id
第二個引數指明共享儲存段要連線到的位址。
0,系統為我們建立乙個適當的位址值。否則自己指定
第三個引數
shm***
可以設成:
shm_rnd, shm_rdonly
。shm_rnd
為自己指定連線位址時用。
shm_rdonly
說明此儲存段唯讀。
4.6 #include
#include
儲存段分離
int shmdt(const void * shmaddr);
返回:失敗
-1並置
errno,
成功返回0
分離由
shmaddr
指定的儲存段。此值應該由
shmat
返回的值。
此函式不是刪除共享儲存段,而是從當前程序分離儲存段。
當程序推出時,系統會自動分離它連線的所有共享段。
client.c
#include
#include
#include
#include
#include
#define shmsz 27
int main(void)
rm_semaphore(producer);
rm_semaphore(consumer);
exit(0);}
server.c
#include
#include
#include
#include
#include
#include "outshm.h"
#define shmsz 27
int main(void)
exit(0);}
UNIX 程序間通訊
linux繼承了at t和bsd以及早期的程序間的通訊 一般常用的通訊方式有 1 傳統的通訊方式 無名管道,有名管道和訊號。2 對於sys 5 的程序間通訊採用了共享記憶體,訊息佇列和訊號燈的形式。3 bsd,對於一般網路間的通訊採用來套接字的方式實現。1 無名管道的機制以及建立 對於無名管道只是用...
unix程序間通訊
程序間通訊主要可以分為兩大類 1.傳遞控制資訊 程序間的低階通訊 2.傳送大批量資料 程序間的高階通訊 主要的通訊方式主要有 1.主從式通訊方式 master servant communication 通訊的程序雙方存在一種主從式的隸屬關係。主程序是程序的控制者,從程序是程序的從屬者。主要有以下特...
unix環境高階程式設計 程序間通訊(2)
函式popen和pclose 常見的操作是建立乙個連線到另乙個程序的管道,然後讀其輸出或向其輸入端傳送資料,這兩個函式實現的操作是 建立乙個管道,fork乙個子程序,關閉未使用的管道端,執行乙個shell執行命令,然後等待命令終止。函式popen執行fork,呼叫exec執行cmdstring,返回...