//標頭檔案
#include
//建立管道
intpipe
(int fd[2]
);
fd:檔案描述符陣列,其中fd[0]表示讀端,fd[1]表示寫端
返回值:成功返回0,失敗返回錯誤**。
如下demo我們可以體會下匿名管道的操作特性
#include
#include
#include
#include
intmain()
;int ret =
pipe
(pipefd)
;int pid =
fork()
;if(ret <0)
if(pid <0)
else
if(pid ==0)
;int ret =
read
(pipefd[0]
,buff,
1023);
printf
("buff:[%s] - [%d]\n"
,buff,ret);}
else
while(1
)return0;
}
我們看到父程序通過管道寫端將資訊傳給子程序,子程序通過讀端拿到訊息,那麼管道的讀寫規則是什麼樣的呢?
管道讀寫規則:
//標頭檔案
#include
//建立命名管道
intmkfifo
(const
char
*filename,mode_t mode)
;//filename檔名,mode對該檔案的許可權
我們通過命名管道實現乙個簡單的通訊來體會命名管道的操作特性
//write
#include
#include
#include
#include
#include
#include
#include
intmain()
int fd =
open
(file,o_wronly);if
(fd <0)
char buff[
1024];
while(1
)else
if(s <=0)
}close
(fd)
;return0;
}
讀端:
通過上面的demo演示我們其實可以看出匿名管道與命名管道的區別
int
shmget
(key_t key, size_t size,
int shm***)
; 引數:key --
- 這個記憶體段名字
size --
- 共享記憶體的大小
shm*** --
- 對於記憶體的操作許可權
返回值: :成功返回乙個非負整數,即該共享記憶體段的標識碼;失敗返回-
1
連線
將共享記憶體段連線到程序位址空間
void
*shmat
(int shmid,
const
void
*shmaddr,
int shm***)
;引數:shmid --
- 共享記憶體標識
shmaddr --
- 指定連線的位址
shm*** --
- 它的兩個可能取值是shm_rnd和shm_rdonly
返回值:成功返回乙個指標,指向共享記憶體第乙個節,失敗返回-
1
脫離
將共享記憶體段與當前程序脫離
intshmdt
(const
void
*shmaddr)
; 引數:shmaddr --
- 由shmat所返回的指標
返回值:成功返回0;失敗返回-
1 注意:將共享記憶體段與當前程序脫離不等於刪除共享記憶體段
控制
用於控制共享記憶體
intshmctl
(int shmid,
int cmd,
struct shmid_ds *buf)
; 引數:shmid --
- 由shmget返回的共享記憶體標識碼
cmd --
- 將要採取的動作(有三個可取值)
buf --
- 指向乙個儲存著共享記憶體的模式狀態和訪問許可權的資料結構
返回值:成功返回0
,失敗返回-
1。
核心中的計數器:
若技術 > 0則表示有資源,可以獲取; <= 0表示沒有資源,則進入等待狀態。
Linux程序間通訊
程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...