一、相關知識
訊號量:乙個整數;
大於或等於0時代表可供併發程序使用的資源實體數;
小於0時代表正在等待使用臨界區的程序數;
用於互斥的訊號量初始值應大於0;
只能通過p、v原語操作而改變;
訊號量元素組成:
1、表示訊號量元素的值;
2、最後操作訊號量元素的程序id
3、等待訊號量元素值+1的程序數;
4、等待訊號量元素值為0的程序數;
二、主要函式
1.1 建立訊號量
int semget(
key_t key, //標識訊號量的關鍵字,有三種方法:1、使用ipc——private讓系統產生,
// 2、挑選乙個隨機數,3、使用ftok從檔案路徑名中產生
int nsemes, //訊號量集中元素個數
int flag //ipc_creat;ipc_excl 只有在訊號量集不存在時建立
)成功:返回訊號量控制代碼
失敗:返回-1
1.2 使用ftok函式根據檔案路徑名產生乙個關鍵字
key_t ftok(const char *pathname,int proj_id);
路徑名稱必須有相應許可權
1.3 控制訊號量
int semctl(
int semid, //訊號量集的控制代碼
int semnum, //訊號量集的元素數
int cmd, //命令
/*union senum arg */... //
)成功:返回相應的值
失敗:返回-1
命令詳細說明:
cmd: ipc_rmid 刪除乙個訊號量
ipc_excl 只有在訊號量集不存在時建立
ipc_set 設定訊號量的許可權
setval 設定指定訊號量的元素的值為 agc.val
getval 獲得乙個指定訊號量的值
getpid 獲得最後操縱此元素的最後程序id
getncnt 獲得等待元素變為1的程序數
getzcnt 獲得等待元素變為0的程序數
union senum 定義如下:
union senumagc;
其中 semid_ds 定義如下:
struct semid_ds;
1.4 對訊號量 +1 或 -1 或測試是否為0
int semop(
int semid,
struct sembuf *sops, //指向元素運算元組
unsigned short nsops //陣列中元素操作的個數
)結構 sembuf 定義
sembuf;
三、例子:
2.1 伺服器
#include
#include
#define segsize 1024
#define readtime 1
union semun arg;
//生成訊號量
int sem_creat(key_t key)
semctl(semid,0,setval,sem);
return semid;
}//刪除訊號量
void del_sem(int semid)
//pint p(int semid)
;return (semop(semid,&sops,1));
}//v
int v(int semid)
;return (semop(semid,&sops,1));
}int main()
shm = (char *)shmat(shmid,0,0);
if (-1 == (int)shm)
semid = sem_creat(key);
for (i = 0;i <= 3;i++)
shmdt(shm);
shmctl(shmid,ipc_rmid,&buf);
del_sem(semid);
return 0;
//gcc -o shm shm.c -g
}2.2 客戶端
#include
#include
#include
#define segsize 1024
#define readtime 1
union semun arg;
// 列印程式執行時間
void out_time(void)
printf(" second: %ld /n",(long)(time(null)) - start);
}//建立訊號量
int new_sem(key_t key)
return semid;
}//等待訊號量變成0
void wait_v(int semid)
;semop(semid,&sops,1);
}int main(void)
shm = (char *)shmat(shmid,0,0);
if (-1 == (int)shm)
semid = new_sem(key);
for (i = 0;i < 3;i ++)
shmdt(shm);
return 0;
// gcc -o shmc shmc.c -g
}
linux程序通訊 訊號量使用
一 相關知識 訊號量 乙個整數 大於或等於0時代表可供併發程序使用的資源實體數 小於0時代表正在等待使用臨界區的程序數 用於互斥的訊號量初始值應大於0 只能通過p v原語操作而改變 訊號量元素組成 1 表示訊號量元素的值 2 最後操作訊號量元素的程序id 3 等待訊號量元素值 1的程序數 4 等待訊...
Linux程序通訊 訊號量
主要用於程序對共享資源的互斥訪問。為了取得對乙個共享資源,程序測試訊號量的值,如果為正,表示還有資源可以訪問,該程序對訊號量加減一。如果為0表示沒有資源可以用,該程序應當休眠等待訊號量的值再次為正。linux中的訊號量使用起來是比較麻煩的。在這裡,訊號量是以集合形式存在的,建立時要給出訊號量的數目,...
Linux程序通訊 訊號量
訊號量是乙個核心變數,它可以被系統中的任何程序所訪問。程序間可以使用這個變數來協調對於共享記憶體和其他資源的訪問。如果不刪除訊號量,它將繼續在系統中存在,即使程式已經退出,它可能在你下次執行此程式時引發問題,而且訊號量是一種有限的資源。簡單的例子 父程序與子程序共享印表機,必須其中一者列印完後,另一...