1. 程式人生 > >linux訊號量程式設計semget、semop

linux訊號量程式設計semget、semop

訊號量(訊號燈)與其他程序間訪問方式不同,它的用途主要是保護臨界資源。程序可以根據訊號量來判斷能否訪問某些共享資源,實際上它是一個整數,訊號量還可以用於程序的同步。

訊號量分為:

1、二值訊號燈:訊號燈只有0和1兩個值,類似互斥鎖。當兩者有不同:訊號燈強調共享資源,只要共享資源可用,其他程序同樣可以修改訊號燈的值;互斥鎖更強調程序,佔用資源的程序使用完資源後,必須由程序本身來解鎖。

2、技術訊號燈:此時存在多個可用共享資源,訊號燈的取值為資源的數目。

# include <sys/types.h>

# include <sys/ipc.h>

# include <sys/sem.h>

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

功能:建立一個新的訊號量或得到一個已存在的訊號量鍵值。

key:一個用來允許不相關的程序訪問相同訊號量的整數值。所有的訊號量是為不同的程式通過提供一個key來間接訪問的,對於每一個訊號量系統生成一個訊號量識別符號。訊號量鍵值只可以有semget獲得,所有其他的訊號量函式所用的訊號量識別符號都是由semget所返回的。

nsems:指定開啟或者新建立的訊號燈集中將包含訊號燈的數目,這個值通常為1。

semflg:是一個標記集合,與open函式的標記十分類似,低九位為訊號的許可權,其作用與檔案許可權類似。

返回值:如果成功,semget函式會返回一個正數;這是用於其他訊號量函式的識別符號。如果失敗,則會返回-1.

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

功能:對訊號量進行控制。

semid:是由semget函式所返回的訊號量識別符號。

nsops:sops所指向的陣列的元素個數(結構的個數)

sops:是一個指向結構陣列的指標,其中每一個結構至少包括下列成員:

struct sembuf

{

unsigned short sem_num;   //semaphore index in array

short sem_op:             //semaphore operation

short sem_flg;            //operation flags

}

sem_num:要操作的訊號量在訊號量集中的編號,第一個訊號的編號是0.

sem_op;如果其值為正數,該值會加到現有的訊號量值中,通常用於釋放訊號量;如果sem_op的值為負數,而其絕對值又大於訊號的現值,操作將會阻塞,直到訊號值大於或等於sem_op的絕對值,通常用於獲取訊號量;如果sem_op的值為0,則操作將暫時阻塞,直到訊號的值變為0。

sem_flg:訊號操作標誌,可能的選擇有兩種:

1、IPC_NOWAIT:對訊號的操作不能滿足時,semop()不會阻塞,並立即返回,同時設定錯誤資訊。

2、IPC_UNDO:程式結束時(不論正常或不正常)釋放訊號量,這樣做的目的在於避免程式在異常情況下結束時未將鎖定的資源解鎖,造成該資源永遠鎖定。

semop的所用的動作會同時作用,從而避免多個訊號量的使用所引起的競爭條件。

相關推薦

linux訊號程式設計semgetsemop

訊號量(訊號燈)與其他程序間訪問方式不同,它的用途主要是保護臨界資源。程序可以根據訊號量來判斷能否訪問某些共享資源,實際上它是一個整數,訊號量還可以用於程序的同步。 訊號量分為: 1、二值訊號燈:訊號燈只有0和1兩個值,類似互斥鎖。當兩者有不同:訊號燈強調共享資源,只要共享資源可用,其他程序同樣可

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

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

訊號函式(semgetsemopsemctl)

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

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

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

Linux訊號通訊程式設計訊號互斥程式設計

一、訊號量(semaphore)         在程序互斥中,訊號量主要用來保護臨界資源。程序通過訊號量來判斷 是否能夠訪問該共享資源。(當然,後面我們還會用來控制程序同步)。 二、訊號量

linux c 訊號程式設計

訊號量 當我們在多使用者系統,多程序系統,或是兩者混合的系統中使用執行緒操作編寫程式時,我們經常會發現我們有段臨界程式碼,在此處我們需要保證一個程序(或是一個執行緒的執行)需要排他的訪問一個資源。 訊號量有一個複雜的程

程序間通訊之systemV訊號semget semop semctl相關操作)

一、什麼是訊號量? 訊號量的本質就是計數器,記錄臨界資源的數目,用來協助程序同步互斥的訪問臨界資源。為什麼不在程序中定義一個全域性變數作為計數器呢?兩個程序間的地址空間是各自獨立的,各自有各自的虛擬記憶體空間。多程序之間不能看到各自程序中的全域性變數。(程序間的虛擬記憶體h

【ARM&LinuxLinux訊號互斥程式設計

《訊號量互斥程式設計示例演示》 /**************************************************************************************** * 檔名: a_pro.c * 建立者:

關於Linux訊號的理解和探討(別說看不懂,耐心看完,你會恍然大悟~)

工作環境(藍色粗體字為特別注意內容) 1,實驗環境:Linux2.6 2,參考文獻:https://www.cnblogs.com/LZYY/p/3453582.html 最近在操作裝置檔案的時候,要求使用獨佔模式使用串列埠裝置,即一個程序用完之後釋放該串列埠,供其他程序使用。該如何實現該

Linux訊號sem_t簡單例項運用

sem_t sem;  定義一個訊號量變數。使用時需首先使用sem_init()函式初始化。  在多執行緒程式設計中,想讓某個執行緒阻塞等待,減少cpu佔用,在該需要執行時才執行。使用訊號量一個A執行緒sem_wait(),阻塞等待;一個B執行緒在需要執行A執行緒時sem_p

linux--訊號

訊號量 什麼是訊號量? 訊號量是程序間通訊方式之一,用於實現程序間的同步與互斥。 同步與互斥 同步:保證對臨界資源訪問的時序可控性,兩個或兩個以上的程序或執行緒在執行過程中協同步調,按預定的先後次序執行. 比如只有超市進貨之後我才能去消費。 互斥:保證同一時間

linux訊號

Linux程序間的通訊方式和原理程序的概念程序是作業系統的概念,每當我們執行一個程式時,對於作業系統來講就建立了一個程序,在這個過程中,伴隨著資源的分配和釋放。可以認為程序是一個程式的一次執行過程。程序通訊的概念程序使用者空間是相互獨立的,一般而言是不能相互訪問的。但很多情況

Linux C網路程式設計 ————6IO複用併發伺服器程式設計

伺服器端程式碼實現#include<stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h>

linux 訊號實現互斥操作

本次程式實現了通過訊號量來實現父程序與子程序互斥操作,當父程序執行列印操作時子程序被阻塞,當子程序執行列印操作時父程序阻塞。實現程式碼如下:#include <stdio.h> #include <unistd.h> #include <stdl

Linux訊號 sem_t簡介

函式介紹 #include<semaphore.h> 訊號量的資料型別為結構sem_t,它本質上是一個長整型的數。 函式sem_init()用來初始化一個訊號量。它的原型為:int sem_init __P ((sem_t *__sem, int __pshared, unsigned int

【作業系統】訊號與PV操作

知識點: 訊號量機制主要有整形訊號量、記錄性訊號量、訊號量集機制。 訊號量是一個整形變數,根據控制物件的不同賦不同的值。訊號量可分為公用訊號量和私用訊號量兩類。 公用訊號量:實現程序間的互斥,初值=1或資源的數目 私用訊號量:實現程序間的同步,初值=0或某個整數 訊

Linux 訊號同步實驗

題目:有一個盤子,父親放入蘋果,母親放入桔子,女兒取出蘋果,兒子取出桔子。 同步關係:父親放蘋果和女兒取蘋果 && 母親放桔子和兒子取桔子 互斥關係:父親放蘋果和母親放桔子 下面是原始碼: #include <stdio.h> #include

linux下c程式設計訊號semgetsemop,semctl函式

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

Linux多執行緒程式設計---執行緒間同步(互斥鎖條件變數訊號和讀寫鎖)

本篇博文轉自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導

linux程序控制之訊號 semget,semctl,semop

轉載自 https://www.cnblogs.com/52php/p/5851570.html 這篇文章將講述別一種程序間通訊的機制——訊號量。注意請不要把它與之前所說的訊號混淆起來,訊號與訊號量是不同的兩種事物。有關訊號的更多內容,可以閱讀我的另一篇文章:L