程序間通訊《二》

2021-04-17 14:15:11 字數 962 閱讀 6433

sysv 共享記憶體。

sysv 共享記憶體和posix 共享記憶體類似。主要用到的api有 shmget, shmat, shmctl, shmdt,下面將這些api一一道來。

intshmget(key_t key, size_t size, 

intoflag);

返回: 成功返回共享記憶體的描述字,出錯時 -1

在多程序環境中, 經常會碰到該呼叫返回失敗的情況, 比如說返回乙個eexist錯誤,是最常見的情況,這時我們可以按如下方式處理:

shmid 

=shmget(key, 

sizeof

(struct

***), ipc_creat 

|ipc_excl 

|0666

);void

*shmat(

intshmid,  

const

void

*addr, 

intflag);

返回: 成功返回對映區的起始位址,否則返回null

一般情況下, 可以按如下方式處理:

***=shmat(shmid, null, 0);

if(***

==null)  

return-1

; 類似與ioctl, fcntl, sysv也有用來設定共享記憶體的乙個介面,shmctl

intshmctl(

intsemid, 

intcmd, 

struct

shmid_ds 

*buf);

返回: 成功返回0, 否則返回-1

該呼叫提供了三個命令:

ipc_stat,  ipc_set, ipc_rmid

最後,刪除該共享記憶體的呼叫shmdt

intshmdt(

const

void

*addr)

返回:成功返回0, 否則,為-1

程序間通訊(二)

傳遞更多的資料 到目前為止我們所用的機制只是簡單的在乙個fread或是fwrite中傳送或是接收全部的資料。有時我們也許以更小的尺寸傳送資料,或是也許我們並不知道輸出的大小。為了避免宣告乙個大的緩衝區,我們可以使用多個fread或是fwrite呼叫並分別處理這些資料。下面是乙個程式,popen3.c...

程序間通訊(二)

傳遞更多的資料 到目前為止我們所用的機制只是簡單的在乙個fread或是fwrite中傳送或是接收全部的資料。有時我們也許以更小的尺寸傳送資料,或是也許我們並不知道輸出的大小。為了避免宣告乙個大的緩衝區,我們可以使用多個fread或是fwrite呼叫並分別處理這些資料。下面是乙個程式,popen3.c...

程序間通訊(二)

傳遞更多的資料 到目前為止我們所用的機制只是簡單的在乙個fread或是fwrite中傳送或是接收全部的資料。有時我們也許以更小的尺寸傳送資料,或是也許我們並不知道輸出的大小。為了避免宣告乙個大的緩衝區,我們可以使用多個fread或是fwrite呼叫並分別處理這些資料。下面是乙個程式,popen3.c...