每日一結
一 共享記憶體 :核心空間預留出來的一塊記憶體,用於程序間通訊
(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運算資源,有人設計了執行緒的概念。執行緒最大的特點就...