Unix環境程序間通訊(二)

2021-04-07 08:45:03 字數 2930 閱讀 7162

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,返回...