導航:首頁 > 網路營銷 > intsem

intsem

發布時間:2020-11-13 19:36:23

1、信號量的創建

同共享內存一樣,系統中同樣需要為信號量集定製一系列專有的操作函數(semget,semctl等)。系統命令ipcs可查看當前的系統IPC的狀態,在命令後使用-s參數。使用函數semget可以創建或者獲得一個信號量集ID,函數原型如下:
#include <sys/shm.h>
int semget( key_t key, int nsems, int flag);
函數中參數key用來變換成一個標識符,每一個IPC對象與一個key相對應。當新建一個共享內存段時,使用參數flag的相應許可權位對ipc_perm結構中的mode域賦值,對相應信號量集的shmid_ds初始化的值如表1所示。
shmid_ds結構初始化值表 ipc_perm結構數據 初 值 ipc_perm結構數據 初 值 Sem_otime 0 Sem_nsems Nsems Sem_ctime 系統當前值 參數nsems是一個大於等於0的值,用於指明該信號量集中可用資源數(在創建一個信號量時)。當打開一個已存在的信號量集時該參數值為0。函數執行成功,則返回信號量集的標識符(一個大於等於0的整數),失敗,則返回–1。函數semop用以操作一個信號量集,函數原型如下:
#include <sys/sem.h>
int semop( int semid, struct sembuf semoparray[], size_t nops );
函數中參數semid是一個通過semget函數返回的一個信號量標識符,參數nops標明了參數semoparray所指向數組中的元素個數。參數semoparray是一個struct sembuf結構類型的數組指針,結構sembuf來說明所要執行的操作,其定義如下:
struct sembuf{
unsigned short sem_num;
short sem_op;
short sem_flg;
}
在sembuf結構中,sem_num是相對應的信號量集中的某一個資源,所以其值是一個從0到相應的信號量集的資源總數(ipc_perm.sem_nsems)之間的整數。sem_op指明所要執行的操作,sem_flg說明函數semop的行為。sem_op的值是一個整數,如表2所示,列出了詳細sem_op的值及所對應的操作。
sem_op值詳解 Sem_op 操 作 正數 釋放相應的資源數,將sem_op的值加到信號量的值上 0 進程阻塞直到信號量的相應值為0,當信號量已經為0,函數立即返回。如果信號量的值不為0,則依據sem_flg的IPC_NOWAIT位決定函數動作。sem_flg指定IPC_NOWAIT,則semop函數出錯返回EAGAIN。sem_flg沒有指定IPC_NOWAIT,則將該信號量的semncnt值加1,然後進程掛起直到下述情況發生。信號量值為0,將信號量的semzcnt的值減1,函數semop成功返回;此信號量被刪除(只有超級用戶或創建用戶進程擁有此許可權),函數smeop出錯返回EIDRM;進程捕捉到信號,並從信號處理函數返回,在此情況將此信號量的semncnt值減1,函數semop出錯返回EINTR 負數 請求sem_op的絕對值的資源。如果相應的資源數可以滿足請求,則將該信號量的值減去sem_op的絕對值,函數成功返回。當相應的資源數不能滿足請求時,這個操作與sem_flg有關。sem_flg指定IPC_NOWAIT,則semop函數出錯返回EAGAIN。sem_flg沒有指定IPC_NOWAIT,則將該信號量的semncnt值加1,然後進程掛起直到下述情況發生:當相應的資源數可以滿足請求,該信號的值減去sem_op的絕對值。成功返回;此信號量被刪除(只有超級用戶或創建用戶進程擁有此許可權),函數smeop出錯返回EIDRM:進程捕捉到信號,並從信號處理函數返回,在此情況將此信號量的semncnt值減1,函數semop出錯返回EINTR

2、C語言 信號量的疑惑。。

一個是Posix實現,一個是System V實現
使用的環境不一樣
一般來講SV的適用於進內程同步容,POSIX適用於線程同步
System V進程同步 api:semget/semop/semctl
POSIX 線程同步 api:sem_init/sem_destroy
不過POSIX貌似還會分為有名和無名信號量上面說的是無名信號量。
具體的還要看使用的環境。

3、計算機*作系統中,若P、V*作的信號量S初值為2,當前值為-1,則表示有____個等待進程

有1個等待進程。

信號量(Semaphore),是可以用來保證兩個或多個關鍵代碼段不被並發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那麼該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。

為了完成這個過程,需要創建一個信號量VI,然後將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個關鍵代碼段的首末端。初值為2,表示初始時有兩個可用的資源。現在為-1,就說明這兩個可用資源已經被佔用了,有一個進程還在等待資源。

(3)intsem擴展資料:

對信號量有4種操作(#include<semaphore.h>):

1、 初始化(initialize),也叫做建立(create) int sem_init(sem_t *sem, int pshared, unsigned int value);

2、等信號(wait),也可叫做掛起(suspend)int sem_wait(sem_t *sem);

3、給信號(signal)或發信號(post) int sem_post(sem_t *sem);

4、清理(destroy) int sem_destory(sem_t *sem)。

4、linux 信號量是什麼怎麼用

Linux信號量(semaphore)是一種互斥機制。即對某個互斥資源的訪問會收到信號量的保護,在訪問之前需要獲得信號量。
在操作完共享資源後,需釋放信號量,以便另外的進程來獲得資源。獲得和釋放應該成對出現。
獲得信號量集,需要注意的是,獲得的是一個集合,而不是一個單一的信號量。
#include
#include
#include
1: int semget(key_t key,int nsems,int semflg);
key:系統根據這個值來獲取信號量集。
nsems:此信號集包括幾個信號量。
semflg:創建此信號量的屬性。 (IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)
成功則返回該信號量集的ID。
註:
既指定IPC_CREAT又指定IPC_EXCL時,如果系統中該信號量集已經存在,則馬上返回。
如果需要獲得存在的信號量,則將此參數置0.
2: int semctl(int semid,int senum,int cmd....)
semid:信號量ID。
senum:對信號量集中的第幾個信號量進行控制。(從0開始)
cmd:需要進行的操作。(SETVAL是其中的一個)。
根據cmd的不同可能存在第四個參數,cmd=SETVAL時,表示同時信號量可以被獲得幾次,如第四個參數
num=1表示只能被獲得一次,既被信號量保護的資源只能同時被一個程序使用。
該系統調用,是在對信號量初始化時用的。
-3: 「3」前面加了"-"表示當需要使用互斥資源時應該做這步。
int semop(int semid,struct sembuf *sem,int num_elements);
struct sembuf {
unsigned short sem_num; //該信號量集中的第幾個信號量。
int sem_op;//需要獲得還是釋放信號量
int sem_flg;//相關動作
};
num_elements:需要對該信號量集中的多少個信號量進行處理。
獲得信號量時,將sembuf結構提初始化為:
sem_num = 0; //該信號量集中的首個信號量
sem_op = -1; //獲得信號量
sem_flag = IPC_NOWAIT; //如果不能獲得信號量,馬上返回。
semop(semid,_sem,1);
同理釋放信號量時,將sem_op設為1.
以上是對信號量的簡單處理

5、C語言 static int sem_id = 0:什麼意思

宣告一個靜態變數, 預設為0.
該變數, 可視范圍(可叫用的區塊)不變, 生命周期直到程序結束.

6、Linux編程

請帖出具體的程序,我來幫你分析

c語言很簡單,要找到好的工作
C語言必須和操作系統平台結合,
建議百度搜索,能力型linux軟體工程師培訓,
我們是元智哲思培訓中心

7、信號量的操作方式

對信號量有4種操作(include<semaphore>):
1. 初始化(initialize),也叫做建立(create) int sem_init(sem_t *sem, int pshared, unsigned int value);
2. 等信號(wait),也可叫做掛起專(suspend)int sem_wait(sem_t *sem);
3. 給信號(signal)或屬發信號(post) int sem_post(sem_t *sem);
4.清理(destroy) int sem_destory(sem_t *sem);

8、如果信號量的當前值為-4,則表示系統中在該信號量上有 ? 個等待進程?謝謝

表示有4個等待進程。

信號量的當前值如果是正值N,該值表示有N個可用資源。

如果為0,則表示所有資源全部被分配,同時沒有進程處於等待狀態

如果為負數N,則表示全部資源分配完畢,且還有N個進程處於等待該資源的狀態。

例如:若信號S的初值為3,當前值為-2,則表示有( 2 )個等待進程,當信號量的值小於0時,其絕對值表示系統中因請求該類資源而被阻塞的進程個數。

(8)intsem擴展資料:

參數nsems是一個大於等於0的值,用於指明該信號量集中可用資源數(在創建一個信號量時)。當打開一個已存在的信號量集時該參數值為0。函數執行成功,則返回信號量集的標識符(一個大於等於0的整數),失敗,則返回–1。函數semop用以操作一個信號量集,函數原型如下:

#include <sys/sem.h>

int semop( int semid, struct sembuf semoparray[], size_t nops );

函數中參數semid是一個通過semget函數返回的一個信號量標識符,參數nops標明了參數semoparray所指向數組中的元素個數。

與intsem相關的知識