Linux程序與執行緒之五

2021-07-05 17:33:33 字數 4014 閱讀 2835

每日一結

一 共享記憶體 :核心空間預留出來的一塊記憶體,用於程序間通訊 

(1)int shmget(key_t key, size_t size, int shm***);

功能:獲取共享記憶體段的id 

引數:@key    ipc_private  或 ftok() 

@size   申請的共享記憶體段大小 [4k的倍數]

@shm*** ipc_creat | 0666 或 ipc_creat | ipc_excl 

返回值:

成功返回id,失敗返回-1 

(2)void *shmat(int shmid, const void *shmaddr, int shm***);

功能:對映共享記憶體到使用者空間 

引數:@shmid    共享記憶體段id 

@shmaddr  null:系統自動完成對映 

@shm***   shm_rdonly:唯讀   0:讀寫

返回值:

成功返回對映後的位址,失敗返回(void *)-1 

練習:a,b通過共享記憶體通訊

b如何知道a已經寫了資料?

flag    

0    |  內容

(3)int shmdt(const void *shmaddr);

功能:撤銷對映

引數:@shmaddr  共享記憶體對映的位址 

(4)int shmctl(int shmid, int cmd, struct shmid_ds *buf);

功能:根據命令控制共享記憶體 

引數:@shmid  共享記憶體段的id 

@cmd    ipc_stat[獲取屬性],ipc_set[設定屬性],ipc_rmid[刪除ipc物件]

@buf    儲存屬性 

返回值:

成功返回0,失敗返回 -1 

**示例如下:

關於linux環境程序間通訊的參考資料:

共享記憶體:

上:下:

二 訊號燈集

posix 執行緒中的同步用的是無名訊號量 

程序間的同步使用的是ipc 物件[訊號燈集]

訊號燈集:訊號燈集合,每乙個訊號燈都可以用來表示一類資源,其值表示資源的個數

(1)建立訊號燈集

int semget(key_t key, int nsems, int sem***);

引數:@key    ipc_private , ftok() 

@nsems  訊號燈集中訊號燈的個數 

@sem*** ipc_creat | 0666,ipc_creat | ipc_excl

返回值:

成功返回id,失敗返回-1 

(2)初始化訊號燈集中訊號燈的值

int semctl(int semid, int semnum, int cmd, ...);

引數:@semid   訊號燈集的id 

@semnum  訊號燈的編號[編號從0開始]

@cmd     setval[設定訊號燈的值]  ,getval(獲取訊號燈的值),ipc_rmid[刪除訊號燈集]

返回值:

成功返回0,失敗返回-1 

思考:將訊號燈集中的1號訊號燈初始化為1?

union semun {

int val; /* value for setval */

struct semid_ds *buf; /* buffer for ipc_stat, ipc_set */

unsigned short  *array; /* array for getall, setall */

struct seminfo  *__buf; /* buffer for ipc_info

(linux-specific) */

void init_sem_value(int sem_id,int sem_num,int value)

union semun sem_val;

sem_val.val = value;

if(semctl(sem_id,sem_num,setval,sem_val) 

return ;

(3)pv操作 

int semop(int semid, struct sembuf *sops, unsigned nsops);

功能:完成pv操作  

引數:@semid  訊號燈集的id 

@sops   操作方式結構體首位址 

@nsops  操作訊號燈的個數 

返回值:

成功返回0,失敗返回-1

struct sembuf 

unsigned short sem_num;  /* semaphore number */

short   sem_op;   /* semaphore operation  */

short   sem_***;  /* operation flags */

sem_op : 

<1>0   等待訊號燈的值變成0 

<2>1   釋放資源,v操作 

<3>-1  申請資源,p操作 

sem_***:

0           : 阻塞方式 

ipc_nowait  : 非阻塞方式呼叫 

sem_undo    : 程序結束的時候,它申請的資源自動釋放

void p(int sem_id,int sem_num)

struct sembuf sem;

sem.sem_num = sem_num;

sem.sem_op  = -1;

sem.sem_*** = 0;

if(semop(sem_id,&sem,1) 

void v(int sem_id,int sem_num)

struct sembuf sem;

sem.sem_num = sem_num;

sem.sem_op  = 1;

sem.sem_*** = 0;

if(semop(sem_id,&sem,1) 

關於linux環境程序間通訊的參考資料

訊號燈:

練習:a,b通過訊號燈集同步對共享記憶體操作 

讓建立訊號燈集的程序,初始化訊號燈的值 ,如果訊號燈集已經存在則不初始化

注意:shm_read.c 和 shm_write.c 都需要單獨和sem.c一起編譯

亦即:gcc shm_read.c sem.c -o shm_read

併發程式設計之程序與執行緒

2.2 並行與併發 2.3 應用 單核cpu下,多執行緒不能實際提高程式執行效率,只是為了能夠在不同的任務之間切換,不同執行緒輪流使用cpu,不至於乙個執行緒總占有cpu,別的執行緒沒法幹活。多核cpu可以並行跑多個執行緒,但能否提高程式執行效率還是要分情況的 1 有些任務,經過精心設計,將任務拆分...

五 Linux下程序與執行緒的比較

程序 執行緒描述 fork pthread creat 建立新的控制流 return exit exit return pthread exit 從現有的控制流退出 wait pthread join 從控制流得出退出狀態 atexit pthread clean push pthread clea...

Linux 程序與執行緒

程序就是在作業系統中執行的程式,是作業系統資源管理的最小單位。乙個程序可以管理多個執行緒,執行緒相對輕量,可以共享程序位址空間 乙個進行在執行的過程中,不可能一直佔據著cpu進行邏輯運算,中間很可能在進行磁碟i o或者網路i o,為了充分利用cpu運算資源,有人設計了執行緒的概念。執行緒最大的特點就...