高階程式設計之程序間通訊(三)

2021-07-09 14:02:27 字數 3752 閱讀 8257

程序間通訊(三)

ipc 通訊之 ==》訊號量集===》訊號燈

執行緒中用的是  posix無名訊號量

程序中用的是  system v 的訊號燈

框架: key ==》申請訊號量 ==》pv操作  ===>關閉訊號量

semget        semop         semctl

#include

原型:int semget(key_t key, int nsems, int sem***);

功能:該函式可以向核心提出訊號量集的物件申請。

引數:key  唯一鍵值

nsems  要申請的訊號量個數

sem*** 要申請的訊號量許可權,第一次申請用ipc_creat

以後申請要用ipc_excl 檢測

返回值:成功 返回乙個訊號量id   semid

失敗  -1;

pv操作

原型:int semop(int semid, struct sembuf *sops, unsigned nsops);

功能:通過該函式可以將semid中的訊號量的值做調整完成pv操作。

引數:semid  訊號量id

sops   訊號量集的結構體指標,結構如下:

struct sembuf

nsops  要操作的訊號量的個數。

返回值:成功  0

失敗  -1;

通常將以上函式自定義封裝:

int my_sem_wait(int id,int sem)

int my_sem_post(int id ,int sem)

屬性操作:

原型:int semctl(int semid, int semnum, int cmd, ...);

功能:通過該函式可以修改訊號量的屬性和刪除訊號量

引數:semid 要操作的訊號量集

semnum  要操作的訊號的編號

cmd   ==》ipc_rmid  ===》刪除訊號量用。

==》setval   ===》設定訊號量值用。

==》getval   ==》獲取訊號值用。

...可變長引數  ipc_rmid  該引數無效。

setval/getval 結構如下

練習:設計兩個程序,完成如下功能:

程序1 獲取使用者輸入資訊,寫入共享記憶體。

程序2 實時讀取共享記憶體中的資料並列印,同時統計字串的長度。

當使用者輸入quit的時候兩個程序同時退出。

要求:必須用到共享記憶體和訊號量。

ipc 通訊之 ==》訊號量集===》訊號燈

執行緒中用的是  posix無名訊號量

程序中用的是  system v 的訊號燈

框架: key ==》申請訊號量 ==》pv操作  ===>關閉訊號量

semget        semop         semctl

#include

原型:int semget(key_t key, int nsems, int sem***);

功能:該函式可以向核心提出訊號量集的物件申請。

引數:key  唯一鍵值

nsems  要申請的訊號量個數

sem*** 要申請的訊號量許可權,第一次申請用ipc_creat

以後申請要用ipc_excl 檢測

返回值:成功 返回乙個訊號量id   semid

失敗  -1;

pv操作

原型:int semop(int semid, struct sembuf *sops, unsigned nsops);

功能:通過該函式可以將semid中的訊號量的值做調整完成pv操作。

引數:semid  訊號量id

sops   訊號量集的結構體指標,結構如下:

struct sembuf

nsops  要操作的訊號量的個數。

返回值:成功  0

失敗  -1;

通常將以上函式自定義封裝:

int my_sem_wait(int id,int sem)

int my_sem_post(int id ,int sem)

屬性操作:

原型:int semctl(int semid, int semnum, int cmd, ...);

功能:通過該函式可以修改訊號量的屬性和刪除訊號量

引數:semid 要操作的訊號量集

semnum  要操作的訊號的編號

cmd   ==》ipc_rmid  ===》刪除訊號量用。

==》setval   ===》設定訊號量值用。

==》getval   ==》獲取訊號值用。

...可變長引數  ipc_rmid  該引數無效。

setval/getval 結構如下

練習:設計兩個程序,完成如下功能:

程序1 獲取使用者輸入資訊,寫入共享記憶體。

程序2 實時讀取共享記憶體中的資料並列印,同時統計字串的長度。

當使用者輸入quit的時候兩個程序同時退出。

要求:必須用到共享記憶體和訊號量。

ipc 通訊之 ==》訊號量集===》訊號燈

執行緒中用的是  posix無名訊號量

程序中用的是  system v 的訊號燈

框架: key ==》申請訊號量 ==》pv操作  ===>關閉訊號量

semget        semop         semctl

#include

原型:int semget(key_t key, int nsems, int sem***);

功能:該函式可以向核心提出訊號量集的物件申請。

引數:key  唯一鍵值

nsems  要申請的訊號量個數

sem*** 要申請的訊號量許可權,第一次申請用ipc_creat

以後申請要用ipc_excl 檢測

返回值:成功 返回乙個訊號量id   semid

失敗  -1;

pv操作

原型:int semop(int semid, struct sembuf *sops, unsigned nsops);

功能:通過該函式可以將semid中的訊號量的值做調整完成pv操作。

引數:semid  訊號量id

sops   訊號量集的結構體指標,結構如下:

struct sembuf

nsops  要操作的訊號量的個數。

返回值:成功  0

失敗  -1;

通常將以上函式自定義封裝:

int my_sem_wait(int id,int sem)

int my_sem_post(int id ,int sem)

屬性操作:

原型:int semctl(int semid, int semnum, int cmd, ...);

功能:通過該函式可以修改訊號量的屬性和刪除訊號量

引數:semid 要操作的訊號量集

semnum  要操作的訊號的編號

cmd   ==》ipc_rmid  ===》刪除訊號量用。

==》setval   ===》設定訊號量值用。

==》getval   ==》獲取訊號值用。

...可變長引數  ipc_rmid  該引數無效。

setval/getval 結構如下

練習:設計兩個程序,完成如下功能:

程序1 獲取使用者輸入資訊,寫入共享記憶體。

程序2 實時讀取共享記憶體中的資料並列印,同時統計字串的長度。

當使用者輸入quit的時候兩個程序同時退出。

要求:必須用到共享記憶體和訊號量。

unix環境高階程式設計 程序間通訊(2)

函式popen和pclose 常見的操作是建立乙個連線到另乙個程序的管道,然後讀其輸出或向其輸入端傳送資料,這兩個函式實現的操作是 建立乙個管道,fork乙個子程序,關閉未使用的管道端,執行乙個shell執行命令,然後等待命令終止。函式popen執行fork,呼叫exec執行cmdstring,返回...

程序間通訊(三)

管道呼叫 我們已經了解了高層的popen函式,現在我們繼續來了解低層的pipe函式。這個函式提供了乙個在兩個函式之間傳遞資料的方法,而不必呼叫shell來解釋所請求的命令的。同時他也為我們提供了更多的資料讀寫控制。pipe函式的原型如下 include int pipe int file descr...

程序間通訊(三)

管道呼叫 我們已經了解了高層的popen函式,現在我們繼續來了解低層的pipe函式。這個函式提供了乙個在兩個函式之間傳遞資料的方法,而不必呼叫shell來解釋所請求的命令的。同時他也為我們提供了更多的資料讀寫控制。pipe函式的原型如下 include int pipe int file descr...