linux程序通訊 訊號量使用

2021-04-29 16:33:49 字數 2721 閱讀 9979

一、相關知識

訊號量:乙個整數;

大於或等於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 伺服器

#i nclude

#i nclude

#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 客戶端

#i nclude

#i nclude

#i nclude

#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程序通訊 訊號量

訊號量是乙個核心變數,它可以被系統中的任何程序所訪問。程序間可以使用這個變數來協調對於共享記憶體和其他資源的訪問。如果不刪除訊號量,它將繼續在系統中存在,即使程式已經退出,它可能在你下次執行此程式時引發問題,而且訊號量是一種有限的資源。簡單的例子 父程序與子程序共享印表機,必須其中一者列印完後,另一...