1. 程式人生 > >訊號量函式(semget、semop、semctl)

訊號量函式(semget、semop、semctl)

函式呼叫為semctl(),semget(),semop()等函式。

---------------------------------------------------------我是分割線--------------------------------------------------------

訊號量函式由semget、semop、semctl三個函式組成。下面的表格列出了這三個函式的函式原型及具體說明。

1.   semget函式原型

semget(得到一個訊號量集識別符號或建立一個訊號量集物件)

所需標頭檔案

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

函式說明

得到一個訊號量集識別符號或建立一個訊號量集物件並返回訊號量集識別符號

函式原型

int semget(key_t key, int nsems, int semflg)

函式傳入值

key

0(IPC_PRIVATE):會建立新訊號量集物件

大於0的32位整數:視引數semflg來確定操作,通常要求此值來源於ftok返回的IPC鍵值

nsems

建立訊號量集中訊號量的個數,該引數只在建立訊號量集時有效

msgflg

0:取訊號量集識別符號,若不存在則函式會報錯

IPC_CREAT:當semflg&IPC_CREAT為真時,如果核心中不存在鍵值與key相等的訊號量集,則新建一個訊號量集;如果存在這樣的訊號量集,返回此訊號量集的識別符號

IPC_CREAT|IPC_EXCL:如果核心中不存在鍵值與key相等的訊號量集,則新建一個訊息佇列;如果存在這樣的訊號量集則報錯

函式返回值

成功:返回訊號量集的識別符號

出錯:-1,錯誤原因存於error中

附加說明

上述semflg引數為模式標誌引數,使用時需要與IPC物件存取許可權(如0600)進行|運算來確定訊號量集的存取許可權

錯誤程式碼

EACCESS:沒有許可權

EEXIST:訊號量集已經存在,無法建立

EIDRM:訊號量集已經刪除

ENOENT:訊號量集不存在,同時semflg沒有設定IPC_CREAT標誌

ENOMEM:沒有足夠的記憶體建立新的訊號量集

ENOSPC:超出限制

如果用semget建立了一個新的訊號量集物件時,則semid_ds結構成員變數的值設定如下:

Ÿ        sem_otime設定為0。

Ÿ        sem_ctime設定為當前時間。

Ÿ        msg_qbytes設成系統的限制值。

Ÿ        sem_nsems設定為nsems引數的數值。

Ÿ        semflg的讀寫許可權寫入sem_perm.mode中。

Ÿ        sem_perm結構的uid和cuid成員被設定成當前程序的有效使用者ID,gid和cuid成員被設定成當前程序的有效組ID。

2.   semop函式原型

semop(完成對訊號量的P操作或V操作)

所需標頭檔案

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

函式說明

對訊號量集識別符號為semid中的一個或多個訊號量進行P操作或V操作

函式原型

int semop(int semid, struct sembuf *sops, unsigned nsops)

函式傳入值

semid:訊號量集識別符號

sops:指向進行操作的訊號量集結構體陣列的首地址,此結構的具體說明如下:

struct sembuf {

    short semnum; /*訊號量集合中的訊號量編號,0代表第1個訊號量*/

    short val;/*若val>0進行V操作訊號量值加val,表示程序釋放控制的資源 */

/*若val<0進行P操作訊號量值減val,若(semval-val)<0(semval為該訊號量值),則呼叫程序阻塞,直到資源可用;若設定IPC_NOWAIT不會睡眠,程序直接返回EAGAIN錯誤*/

  /*若val==0時阻塞等待訊號量為0,呼叫程序進入睡眠狀態,直到訊號值為0;若設定IPC_NOWAIT,程序不會睡眠,直接返回EAGAIN錯誤*/

    short flag;  /*0 設定訊號量的預設操作*/

/*IPC_NOWAIT設定訊號量操作不等待*/

/*SEM_UNDO 選項會讓核心記錄一個與呼叫程序相關的UNDO記錄,如果該程序崩潰,則根據這個程序的UNDO記錄自動恢復相應訊號量的計數值*/

  };

nsops:進行操作訊號量的個數,即sops結構變數的個數,需大於或等於1。最常見設定此值等於1,只完成對一個訊號量的操作

函式返回值

成功:返回訊號量集的識別符號

出錯:-1,錯誤原因存於error中

錯誤程式碼

E2BIG:一次對訊號量個數的操作超過了系統限制

EACCESS:許可權不夠

EAGAIN:使用了IPC_NOWAIT,但操作不能繼續進行

EFAULT:sops指向的地址無效

EIDRM:訊號量集已經刪除

EINTR:當睡眠時接收到其他訊號

EINVAL:訊號量集不存在,或者semid無效

ENOMEM:使用了SEM_UNDO,但無足夠的記憶體建立所需的資料結構

ERANGE:訊號量值超出範圍

sops為指向sembuf陣列,定義所要進行的操作序列。下面是訊號量操作舉例。

struct sembuf sem_get={0,-1,IPC_NOWAIT}; /*將訊號量物件中序號為0的訊號量減1*/

struct sembuf sem_get={0,1,IPC_NOWAIT};  /*將訊號量物件中序號為0的訊號量加1*/

struct sembuf sem_get={0,0,0};           /*程序被阻塞,直到對應的訊號量值為0*/

flag一般為0,若flag包含IPC_NOWAIT,則該操作為非阻塞操作。若flag包含SEM_UNDO,則當程序退出的時候會還原該程序的訊號量操作,這個標誌在某些情況下是很有用的,比如某程序做了P操作得到資源,但還沒來得及做V操作時就異常退出了,此時,其他程序就只能都阻塞在P操作上,於是造成了死鎖。若採取SEM_UNDO標誌,就可以避免因為程序異常退出而造成的死鎖。

3.   semctl函式原型

semctl (得到一個訊號量集識別符號或建立一個訊號量集物件)

所需標頭檔案

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

函式說明

得到一個訊號量集識別符號或建立一個訊號量集物件並返回訊號量集識別符號

函式原型

int semctl(int semid, int semnum, int cmd, union semun arg)

函式傳入值

semid

訊號量集識別符號

semnum

訊號量集陣列上的下標,表示某一個訊號量

cmd

見下文表15-4

arg

union semun {

   short val;          /*SETVAL用的值*/

   struct semid_ds* buf; /*IPC_STAT、IPC_SET用的semid_ds結構*/

   unsigned short* array; /*SETALL、GETALL用的陣列值*/

   struct seminfo *buf;   /*為控制IPC_INFO提供的快取*/

  } arg;

函式返回值

成功:大於或等於0,具體說明請參照表15-4

出錯:-1,錯誤原因存於error中

附加說明

semid_ds結構見上文訊號量集核心結構定義

錯誤程式碼

EACCESS:許可權不夠

EFAULT:arg指向的地址無效

EIDRM:訊號量集已經刪除

EINVAL:訊號量集不存在,或者semid無效

EPERM:程序有效使用者沒有cmd的許可權

ERANGE:訊號量值超出範圍

表15-4 semctl函式cmd形參說明表

命令

解   釋

IPC_STAT

從訊號量集上檢索semid_ds結構,並存到semun聯合體引數的成員buf的地址中

IPC_SET

設定一個訊號量集合的semid_ds結構中ipc_perm域的值,並從semun的buf中取出值

IPC_RMID

從核心中刪除訊號量集合

GETALL

從訊號量集合中獲得所有訊號量的值,並把其整數值存到semun聯合體成員的一個指標陣列中

GETNCNT

返回當前等待資源的程序個數

GETPID

返回最後一個執行系統呼叫semop()程序的PID

GETVAL

返回訊號量集合內單個訊號量的值

GETZCNT

返回當前等待100%資源利用的程序個數

SETALL

與GETALL正好相反

SETVAL

用聯合體中val成員的值設定訊號量集合中單個訊號量的值







相關推薦

訊號函式semgetsemopsemctl

函式呼叫為semctl(),semget(),semop()等函式。 ---------------------------------------------------------我是分割線-------------------------------------------------------- 訊

System V訊號-semget()semop()和semctl()

簡單介紹 這是我開這個欄目的第一篇文章,順序也不是按照《Unix網路程式設計》(以下簡稱網編)的章節順序往下寫的,可能文章會提及一些前面章節的概念,遇到的話,我會做一些引導,讀者也可以自己找找相關的內容或書籍檢視。 訊號量是一種用於提供不同程序間或一個給定程

Linux程序間通訊:訊號 semget()semop()semctl()

這篇文章將講述別一種程序間通訊的機制——訊號量。注意請不要把它與之前所說的訊號混淆起來,訊號與訊號量是不同的兩種事物。有關訊號的更多內容,可以閱讀我的另一篇文章:Linux程序間通訊 -- 訊號。下面就進入訊號量的講解。 一、什麼是訊號量 為了防止出現

linux下c程式設計之訊號semgetsemopsemctl函式

訊號量 今天去參加北京市的植樹志願者活動啦!早上起來的挺早的,6:10就被傑子給叫起來啦,帶著對春天的嚮往,我們坐著不花錢的大巴去做為市領導服務去啦!發了一個小紅帽還有一個紅色的制服。 唉。。。說好

程序同步——訊號機制整型記錄型

訊號量機制 訊號量(Semaphore)機制是一種卓有成效的程序同步工具。 整型訊號量 把整型訊號量定義為一個表示資源數目的整型量S,除初始化外,僅能通過兩個標準的原子操作wait(S)和signal(S)來訪問。 wait(S)和signal(S)

JavaScript的函式定義與解析匿名函式函式傳參return關鍵字和陣列操作資料的方法多維陣列陣列去重

函式 函式就是重複執行的程式碼片。 1、函式定義與執行 <script type="text/javascript"> // 函式定義 function aa(){ alert('hello!'); } // 函式執行

一些常用的封裝函式獲取當前ip查詢手機號歸屬地根據ip獲取所在地區

1. 獲取請求ip// 獲取請求ip function ip() { if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_

python--函式必選引數預設引數可變引數關鍵字引數

# -*-encoding:utf-8 -*- #name = raw_input("please input your name:") #print "Hello", name """ 小結: Python的函式具有非常靈活的引數形態,即可以實現簡單的呼叫,又可以傳入非常

【C語言】【unix c】訊號system v ipc

二、訊號量集(system v ipc) 訊號量集就是陣列,數組裡的每個元素都是訊號量的型別 1、獲取鍵值 ftok(3) 2、使用鍵值獲取訊號量集的id semget(2) #in

【Java併發程式設計】之二十三:併發新特性—訊號Semaphore含程式碼

    在作業系統中,訊號量是個很重要的概念,它在控制程序間的協作方面有著非常重要的作用,通過對訊號量的不同操作,可以分別實現程序間的互斥與同步。當然它也可以用於多執行緒的控制,我們完全可以通過

linux的程序通訊:訊號例項C語言

 這篇發的很糾結,這不是我原創的程式碼,是同學寫的,我只是想在這記錄下來,以後沒事可以看看,寫轉載嘛,又沒有轉載的來源,翻譯就更扯了,勉強寫個原創,其實不是我原創啦。 ( ̄▽ ̄)" 有興趣可以看下,這是關於linux中的訊號量的使用的一篇文章。我加了一些註釋。 題目是:寫一個程式,該程式建立兩個程序,分

一起talk C栗子吧第一百回:C語言例項--使用訊號進行程序間同步與互斥一

各位看官們,大家好,上一回中咱們說的是程序間同步與互斥的例子,這一回咱們說的例子是:使用訊號量進行程序間同步與互斥。閒話休提,言歸正轉。讓我們一起talk C栗子吧! 看官們,訊號量是由著名電腦科學家迪傑斯特拉(Dijkstra)提出的一種概念,專門用來

執行緒同步互斥之訊號物件Semaphore

  訊號量物件對執行緒的同步方式與前面幾種方法不同,訊號允許多個執行緒和程序同時使用共享資源,這與作業系統中的PV操作相同。它指出了同時訪問共享資源的執行緒最大數目。它允許多個執行緒在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目。在用C

【Java併發程式設計】之二十三:併發新特性—訊號Semaphore含程式碼(r)

執行緒pool-1-thread-1獲得許可:0 執行緒pool-1-thread-1釋放許可:0 當前允許進入的任務個數:5 執行緒pool-1-thread-2獲得許可:1 執行緒pool-1-thread-6獲得許可:5 執行緒pool-1-thread-4獲得許可:3 執行緒pool-1-thread

虛解構函式派生類與基類

1.情況1, class Base { public: ~Base() { cout << "~Base()" << endl; } }; class Derived1 : public Base { public: Derived1():name_

C/C++ 函式求一元二次方程的根

題目描述 求一元二次方程ax^2+bx+c=0的根。 輸入 方程的三個係數a、b、c的值。 輸出 方程的根。 樣例輸入 4 1 1 1 2 1 1 1 -2 樣例輸出 x1=-0.125+0.484i x2=-0.125-0.484i x1=x2=-1.00

opencv-python 的Camshift函式附逐行詳解

這是我在OpenCV-python教程中找到的程式碼並附上的詳解 import cv2 import numpy as np cap = cv2.VideoCapture(0) # ret判斷是否讀到圖片 # frame讀取到的當前幀的矩陣 # 返回的是元組型別,所以

mysql儲存函式2018.10.10學習筆記

DELIMITER // -- 自定義函式 -- 函式要素:函式名,引數列表(形參和實參),返回值,函式體(作用域) -- 建立函式 -- 建立語法 CREATE FUNCTION functionName([形參列表]) RETURNS 資料型別 -- 規定要返回的資料

Python:sys模組的excepthook()函式例外的堆疊追蹤6

""" 1.對於一個未匹配到的例外,python直譯器最後會呼叫sys.excepthook()並傳入3個自變數:例外型別、例外例項 和traceback物件,也就是sys.exc_info()返回元組中的3個值。預設顯示相關例外的追蹤資訊。 2.如果想自定義sys.ex

Python:traceback模組的format_tb()函式例外的堆疊追蹤5

""" traceback.format_tb(tb,limit=None) 返回堆疊跟蹤條目的列表 tb:要跟蹤的traceback物件 limit: 這個是限制stack trace層級的,如果不設或者為None,就會列印所有層級的stack trace """