程序是乙個獨立的資源管理單元,不同程序間的資源是獨立的,不能在乙個程序中訪問另乙個程序的使用者空間和記憶體空間。但是,程序不是孤立的,不同程序之間需要資訊的互動和狀態的傳遞,因此需要程序間資料的傳遞、同步和非同步的機制。
當然,這些機制不能由哪乙個程序進行直接管理,只能由作業系統來完成其管理和維護,linux提供了大量的程序間通訊機制,包括同乙個主機下的不同程序和網路主機間的程序通訊,如下圖所示:
所謂訊號量,主要用來實現程序間同步,避免併發訪問共享資源;同時,訊號量也可以標記資源的個數。/* come from /usr/include/linux/sem.h */
struct semid_ds
;struct sem
/* come from /usr/include/linux/sem.h */
struct seminfo
;
針對訊號量的不同操作,semctl
的第四個引數有所不同,為了方便起見,一般我們使用乙個聯合體對所有的可能性進行封裝(自行封裝,系統無此聯合體)
union semun
;
可通過該結構體實現訊號量的p(get)、v(release)操作,具體看sem_op的值為正(v)還是負(p)
/* come from /usr/include/linux/sem.h */
/* semop system calls takes an array of these. */
struct sembuf ;
macrono.description
ipc_creat
00001000
若key不存在,這建立
ipc_excl
00002000
若key存在,返回失敗
ipc_nowait
00004000
若需要等待,直接返回錯誤
macro生產者/消費者問題,經典pv問題,具體過程如下圖所示:no.description
return
argument 4
ipc_rmid0刪除
以下皆針對整個訊號量集合,/usr/include/linux/ipc.h
ipc_set
1設定ipc_perm引數
struct semid_ds
ipc_stat
2獲取ipc_perm引數
struct semid_ds
ipc_info
3獲取系統資訊
struct seminfo
getpid
11獲取訊號量擁有者的pid
以下皆針對某個訊號量 /usr/include/linux/sem.h
getval
12獲取訊號量的值,函式返回訊號的值
當前訊號量的值:程序數; 失敗:-1
getall
13獲取所有訊號量的值
成功:0; 失敗:-1
陣列位址
getncnt
14獲取等待訊號量遞增的程序數
成功:程序數; 失敗:-1
getzcnt
15獲取等待訊號量值遞減的程序數
成功:程序數; 失敗:-1
int value (訊號量的值)
setval
16設定訊號量的值,設定的值在第四個引數中
成功:0; 失敗:-1
setall
17設定所有訊號量的值
成功:0; 失敗:-1
陣列位址
本例**分為兩個檔案:
customer.c :producer.cproducer.c :
/*
* filename: producer.c
*/#include #include #include #include #include #include #include #include int sem_id;
int init(void)
arg;
key = ftok(".", 0xff);
if(-1 == key)
sem_id = semget(key, 2, ipc_creat|0644);
if(-1 == sem_id)
sem_array[0] = 0;
sem_array[1] = 100;
arg.array = sem_array;
if(-1 == (semctl(sem_id, 0, setall, arg)))
printf("produce init is %d\n", semctl(sem_id, 0, getval));
printf("space init is %d\n", semctl(sem_id, 1, getval));
return 0;
}void del()
int main()
printf("this is producer:\n");
while(1)
del();
return 0;
}
customer.c
/*
* filename: producer.c
*/#include #include #include #include #include #include #include int sem_id;
int init(void)
return 0;
}void del()
int main()
printf("this is customer:\n");
while(1)
del();
return 0;
}
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 什麼是訊號量?在對於臨界區資源管理過程中,為了防止多個程式同時訪問乙個共享資源而引發的一系列問題。比如 死鎖。為了解決這種問題,巨人們就發明了訊號量。訊號量就是為了解決在乙個臨界區只有乙個程序訪問它,也就是說訊號量相當於交警,來協調程序對共享資源有序的訪問而不造成死鎖等行為。...