訊號量:乙個整數;
大於或等於0時代表可供併發程序使用的資源實體數;
小於0時代表正在等待使用臨界區的程序數;
用於互斥的訊號量初始值應大於0;
只能通過p、v原語操作而改變;
訊號量元素組成:
1、表示訊號量元素的值;
2、最後操作訊號量元素的程序id
3、等待訊號量元素值+1的程序數;
4、等待訊號量元素值為0的程序數;
semop操作中:sembuf結構的sem_***成員可以為0、ipc_nowait、sem_undo 。為sem_undo時,它將使作業系統跟蹤當前程序對這個訊號量的修改情況,如果這個程序在沒有釋放該訊號量的情況下終止,作業系統將自動釋放該程序持有的訊號量。除非你對訊號量的行為有特殊的要求,否則應該養成設定sem_***為sem_undo的好習慣。
二、主要函式
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 arg;
//生成訊號量
int sem_creat(key_t key)
union semun sem;
int semid;
sem.val = 0;
semid = semget(key,1,ipc_creat|0666);
if (-1 == semid);
return (semop(semid,&sops,1));
//vint v(int semid)
struct sembuf sops=;
return (semop(semid,&sops,1));
int main()
key_t key;
int shmid,semid;
char *shm;
char msg[7] = "-data-";
char i;
struct semid_ds buf;
key = ftok("/",0);
shmid = shmget(key,segsize,ipc_creat|0604);
if (-1 == shmid) arg;
// 列印程式執行時間
void out_time(void)
static long start = 0;
time_t tm;
if (0 == start);
semop(semid,&sops,1);
int main(void)
key_t key;
int shmid,semid;
char *shm;
char msg[100];
char i;
key = ftok("/",0);
shmid = shmget(key,segsize,0);
if(-1 == shmid){
printf(" create shared memory error\n");
return -1;
shm = (char *)shmat(shmid,0,0);
if (-1 == (int)shm){
printf(" attach shared memory error\n");
return -1;
semid = new_sem(key);
for (i = 0;i < 3;i ++){
sleep(2);
wait_v(semid);
printf("message geted is: %s \n",shm + 1);
out_time();
semget建立檔案 山大作業系統實驗4
int sem p int semid,int index buf.sem num index if semop semid,buf,1 1 buf.sem num index if semop semid,buf,1 1 perror a wrong operation to semaphore ...
linux建立檔案
1 在 linux 上使用重定向符 建立乙個檔案 標準重定向符允許我們建立乙個 0kb 的空檔案。它通常用於重定向乙個命令的輸出到乙個新檔案中。在沒有命令的情況下使用重定向符號時,它會建立乙個檔案。但是它不允許你在建立檔案時向其中輸入任何文字。然而它對於不是很勤勞的管理員是非常簡單有用的。只需要輸入...
linuv建立檔案的命令 linux 建立檔案命令
vi touch是建立檔案的命令 vi foo.txt cp mv也算是吧,因為cp是拷貝檔案,mv是移動檔案 另外還有好多命令能夠建立檔案,之要該命令能夠重定向輸出到乙個不存在的檔案,就會建立檔案。例如 tail f n 200 usr local tomcat logs catalina.out...