Linux程序間的訊號量

2021-09-19 06:44:22 字數 2160 閱讀 4988

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

sem_otime設定為0。

sem_ctime設定為當前時間。

msg_qbytes設成系統的限制值。

sem_nsems設定為nsems引數的數值。

sem***的讀寫許可權寫入sem_perm.mode中。

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

2. semop函式原型

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

struct sembuf sem_get=; /將訊號量物件中序號為0的訊號量減1/

struct sembuf sem_get=; /將訊號量物件中序號為0的訊號量加1/

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

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

3. semctl函式原型

**舉例

#include #include #include #include #include #include #include #include union semun; 

static int sem_id = 0;

static int set_semvalue();

static void del_semvalue();

static int semaphore_p();

static int semaphore_v();

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

/* 設定要輸出到螢幕中的資訊,即其引數的第乙個字元 */

message = ar**[1][0];

sleep(2);

}for(i = 0; i < 10; ++i)

/* 向螢幕中輸出資料 */

printf("%c", message);

/* 清理緩衝區,然後休眠隨機時間 .

fflush(stdout)重新整理標準輸出緩衝區,把輸出緩衝區裡的東西列印到標準輸出裝置上*/

fflush(stdout);

sleep(rand() % 3);

/* 離開臨界區前再一次向螢幕輸出資料 */

printf("%c", message);

fflush(stdout);

/* 離開臨界區,休眠隨機時間後繼續迴圈 */

if(!semaphore_v())

sleep(rand() % 2);

}sleep(10);

printf("\n%d - finished\n", getpid());

if(argc > 1)

exit(exit_success); }

static int set_semvalue()

return 1;}

static void del_semvalue()

}static int semaphore_p()

return 1;}

static int semaphore_v()

return 1;

}

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