程序間通訊(三)
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...