在 posix 標準中,訊號量分兩種,一種是無名訊號量,一種是有名訊號量。無名訊號量一般用於執行緒間同步或互斥,而有名訊號量一般用於程序間同步或互斥。它們的區別和管道及命名管道的區別類似,無名訊號量則直接儲存在記憶體中,而有名訊號量要求建立乙個檔案。
1)建立乙個有名訊號量
所需標頭檔案:
#include
#include
#include
當有名訊號量存在時使用:
sem_t *
sem_open
(const
char
*name,
int oflag)
;
當有名訊號量不存在時使用:
sem_t *
sem_open
(const
char
*name,
int oflag, mode_t mode,
unsigned
int value)
;
功能:
建立乙個有名訊號量。引數:
name:訊號量檔名。注意,不能指定路徑名。因為有名訊號量,預設放在/dev/shm 裡。返回值:flags:sem_open() 函式的行為標誌。
mode:檔案許可權(可讀、可寫、可執行)的設定。
value:訊號量初始值。
2)關閉有名訊號量
所需標頭檔案:
#include
intsem_close
(sem_t *sem)
;
功能:
關閉有名訊號量。引數:
sem:指向訊號量的指標。返回值:
成功:03)刪除有名訊號量檔案所需標頭檔案:失敗:-1
所需標頭檔案:
#include
intsem_unlink
(const
char
*name)
;
功能:
刪除有名訊號量的檔案。引數:
name:有名訊號量檔名。返回值:
成功:04)訊號量 pv 操作失敗:-1
有名訊號量實現程序間互斥功能:
#include
#include
#include
#include
#include
#include
#include
void
printer
(sem_t *sem,
char
*str)
printf
("\n");
sem_post
(sem)
;//訊號量加一
}int
main
(int argc,
char
*ar**)
else
if(pid ==0)
char
*str1 =
"hello"
;printer
(sem, str1)
;//列印
sem_close
(sem)
;//關閉有名訊號量
_exit(1
);}else
if(pid >0)
char
*str2 =
"world"
;printer
(sem, str2)
;//列印
sem_close
(sem)
;//關閉有名訊號量
wait
(null);
//等待子程序結束
}sem_unlink
("name_sem");
//刪除有名訊號量
有名訊號量實現程序間同步功能(print2 先列印,再到 print1 列印):
print1.c **如下:
#include
/* for o_* constants */
#include
/* for mode constants */
#include
#include
void
print
(sem_t *print1, sem_t *print2)
}int
main
(int argc,
char
**ar**)
print2 =
sem_open
("sem_print2"
, o_creat,
0777,1
);if(sem_failed == print2)
print
(print1, print2)
;return0;
}
print2.c **如下:
刪除有名訊號量示例**如下:
#include
#include
void
sem_del
(char
*name)
}int
main
(int argc,
char
**ar**)
(學習複習資料)本來內容來自: Linux系統程式設計之訊號量
一 什麼是訊號量 為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問 的臨界區域。臨界區域是指執行資料更新的 需要獨佔式地執行。而訊號量就可以提供這樣的一種訪問機制,讓乙個臨界區同一時間只有乙個執行緒在訪...
Linux系統程式設計21 執行緒同步 訊號量
訊號量 可以應用於執行緒 程序間同步。相當於初始化為 n 的互斥量。注意 訊號和訊號量沒什麼關係 n值,表示可以同時訪問共享資料區的執行緒數。函式 sem t sem 定義型別。int sem init sem t sem,int pshared,unsigned int value 引數 sem ...
訊號量程式設計
訊號量sem wait 的使用 閒來無事,我給大家講下unix linux下訊號量函式的使用。首先你得知道什麼叫訊號量,什麼時候要用訊號量。這個嘛,主要就是用來保護共享資源的,也就是說如果你想限制某個 些 資源在同一時刻只能有一 多 個執行緒擁有,就可以使用訊號量。當然也可以用作讓乙個執行緒等待另乙...