Linux 程序間通訊(訊號量)

2021-10-05 04:06:15 字數 1938 閱讀 8715

(ipcs -s  //檢視訊號量  ipcrm -s semid  //刪除訊號量)

v操作(+1)釋放資源時

linux系統核心維護的是乙個訊號量集

訊號量是對程序的同步控制

(1)建立或者獲取訊號量集:

int semget[[key_t] key, int nsems, int flag];

注:如果是第一次執行semget,核心中並沒有訊號量集,則需要建立訊號量集,並且完成初始化,如果核心中已經有了此訊號量集,則直接獲取返回就可以。

(2)  設定訊號量屬性,初始化訊號量

int semctl(int semid, int semnum, int cmd,....);

這個函式,我們初始化和刪除都會用到它,當第三個引數為ipc_rmid時,用於刪除訊號集;當第三個引數設定為setval時,可以用於訊號量的初始化,

(3)完成對訊號量的p操作或v操作

int semop(int semid, struct sembuf *buf, int len);

struct sembuf

(4)創建訊號量(獲取時只需要key值即可)

int createsem(int key, int init_val[ ], int len);

如果核心中已經有了此key值對應的訊號量,則直接返回

若沒有---》建立此訊號量集   所有的訊號量集根據init_val進行初始化

(5)刪除訊號量

void deletesem(int semid);

sem.h

#pragma once

#include union semval

;int createsem(int key, int init_val, int len);

//一次只操作乙個訊號量

void semp(int semid, int index);

void semv(int semid, int index);

void deletesem(int semid);

sem.c

#include "./sem.h"

#include int createsem(int key, int init_val,int len)

//建立

semid = semget((key_t)key,len, ipc_creat | 0664);

if(semid == -1)

//初始化

int i = 0;

for(; i < len; ++i) }

return semid;

}//p操作

void semp(int semid,int index)

}//v操作

void semv(int semid,int index)

}//刪除整個訊號量集

void deletesem(int semid)

}

main.c

#include #include #include #include #include #include "sem.h"

#include int main(int argc, char *ar**)

}}

linux 訊號量(程序間通訊)

將使用乙個程式來演示訊號量的使用,程式用pv操作控制訊號量,以操作臨界區,p操作讓訊號量減1,v操作讓訊號量加1,而pv操作之間的 即為臨界區關鍵 每次只能由乙個程序訪問。程式建立出乙個子程序,在兩個程序中分別有一段臨界區關鍵 實現的功能都是不斷的順序輸出0 9的字元。保證程序間同步 plain v...

linux 程序間通訊 訊號量

例項中首先使用fork 建立乙個子程序,在父程序呼叫kill 之前,在子程序中使用raise 向自身傳送sigstop訊號,是子程序暫停。接下來使用kill 向子程序傳送訊號 ngnsvr9 none home xionghailong example cat kill raise.c includ...

Linux 程序間通訊 訊號量

linux學習目錄 1 什麼是訊號量?在對於臨界區資源管理過程中,為了防止多個程式同時訪問乙個共享資源而引發的一系列問題。比如 死鎖。為了解決這種問題,巨人們就發明了訊號量。訊號量就是為了解決在乙個臨界區只有乙個程序訪問它,也就是說訊號量相當於交警,來協調程序對共享資源有序的訪問而不造成死鎖等行為。...