Linux Signal 訊號量的使用
阿新 • • 發佈:2019-01-05
訊號量是什麼?
訊號量是用在不同程序之間或者是不同程序的執行緒之間用來同步會用到的源語。用於保護程式碼段,只能被一個程序或者是執行緒執行,這種工作需要一個二進位制的開關。
獲得共享資源程序需要執行的步驟
(1)測試控制該資源的訊號 量。
(2)如果訊號量為正,表示可以使用當前的訊號量,訊號量值減1,使用完成後,對值加1,便於其他程序使用。
(3)若訊號量=0,就進入休息狀態,訊號量值>0,程序可以從新喚醒,進入(1)。
怎樣知道訊號量確保能+1 和執行-1呢?
原子操作,
函式原型:
#include<sys/sem.h>
#include<sys/ipc.h>
#include<sys/types.h>
int segmet(key_t key,int nsems,int flag);
int semop(int semid,struct sembuf* sops,size_t num_sops);
int semctl(int semid, int nsems,int cmd...);
CSAPP (p736 )
#include <stdio.h>
#include <stdlib.h>
#include <signal.h> // our new library
volatile sig_atomic_t flag = 0 ;
void my_function(int sig){ // can be called asynchronously
flag = 1; // set flag
}
int main(){
// Register signals
signal(SIGINT, my_function);
// ^ ^
// Which-Signal |-- which user defined function registered
while(1)
if(flag){ // my action when signal set it 1
printf ("\n Signal caught!\n");
printf("\n default action it not termination!\n");
flag = 0;
}
return 0;
}