Linux允許不同進程訪問同一個邏輯內存,提供了一組API,頭文件在sys/shm.h中。
1)新建共享內存
shmget int shmget(key_t key,size_t size,int shmflg);
key:共享內存鍵值,可以理解爲共享內存的唯一性標記。
size:共享內存大小
shmflag:創建進程和其他進程的讀寫權限標識。 返回值:相應的共享內存標識符,失敗返回-1
2)連接共享內存到當前進程的地址空間
shmat void *shmat(int shm_id,const void *shm_addr,int shmflg);
shm_id:共享內存標識符
shm_addr:指定共享內存連接到當前進程的地址,通常爲0,表示由系統來選擇。
shmflg:標誌位 返回值:指向共享內存第一個字節的指針,失敗返回-1
3)當前進程分離共享內存shmdt int shmdt(const void *shmaddr);
4)控制共享內存shmctl 和信號量的semctl函數類似,控制共享內存
int shmctl(int shm_id,int command,struct shmid_ds *buf); shm_id:共享內存標識符
command:有三個值
- IPC_STAT:獲取共享內存的狀態,把共享內存的shmid_ds結構複製到buf中。
- IPC_SET:設置共享內存的狀態,把buf複製到共享內存的shmid_ds結構。
- IPC_RMID:刪除共享內存 buf:共享內存管理結構體。
Linux允許不同進程訪問同一個邏輯內存,提供了一組API,頭文件在sys/shm.h中。
1)新建共享內存shmget
int shmget(key_t key,size_t size,int shmflg);
key:共享內存鍵值,可以理解爲共享內存的唯一性標記。
size:共享內存大小
shmflag:創建進程和其他進程的讀寫權限標識。
返回值:相應的共享內存標識符,失敗返回-1
2)連接共享內存到當前進程的地址空間shmat
void *shmat(int shm_id,const void *shm_addr,int shmflg);
shm_id:共享內存標識符
shm_addr:指定共享內存連接到當前進程的地址,通常爲0,表示由系統來選擇。
shmflg:標誌位
返回值:指向共享內存第一個字節的指針,失敗返回-1
3)當前進程分離共享內存shmdt
int shmdt(const void *shmaddr);
4)控制共享內存shmctl
和信號量的semctl函數類似,控制共享內存
int shmctl(int shm_id,int command,struct shmid_ds *buf);
shm_id:共享內存標識符
command: 有三個值
IPC_STAT:獲取共享內存的狀態,把共享內存的shmid_ds結構複製到buf中。
IPC_SET:設置共享內存的狀態,把buf複製到共享內存的shmid_ds結構。
IPC_RMID:刪除共享內存
buf:共享內存管理結構體。
函數指針:
1、定義 函數指針是指向函數的指針變量。 函數指針本身首先是一個指針變量,該指針變量指向一個具體的函數。
這正如用指針變量可指向整型變量、字符型、數組一樣,這裏是指向函數。 C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。
有了指向函數的指針變量後,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。
2、用途: 調用函數和做函數的參數,比如回調函數。
3、示例: char * fun(char * p) {…} // 函數fun char * (*pf)(char * p); // 函數指針pf pf = fun; //函數指針pf指向函數fun pf(p); //通過函數指針pf調用函數fun
請你講講如何採用單線程的方式處理高併發?
在單線程模型中,可以採用I/O複用來提高單線程處理多個請求的能力,
然後再採用事件驅動模型,基於異步回調來處理事件來 。