UNIX 什麼是IPC物件以及共享記憶體

2021-06-27 09:10:54 字數 2070 閱讀 7091

sys v 的ipc 物件:對於核心中建立的檔案物件,就是檔案識別符號(它引用了檔案物件的全部資訊)在程序中檔案描述符一般使用當前最小可用值。

對於ipc識別符號返回的是索引的整數值,它是全域性變數的流水號,在系統中唯一分配的,若果在建立的ipc物件沒有關閉,他會全域性存在,只有在系統關閉的時候才關閉,這樣會造成記憶體空間的資源被占用。

為了程序之間交換資訊,核心專門留了一塊記憶體空間,由程序對映到各自程序私有空間。

【共享記憶體的實現】:

1)建立/開啟共享記憶體,這裡的建立/開啟和檔案的建立/開啟差不多,只是換了一種說法,都是在核心空間建立有乙個快取空間,提供要交換的資訊

2)對映共享記憶體的內容,就是把共享記憶體的內容對映到程序的位址空間用於訪問

3)撤銷共享記憶體的對映,就是解掛的含義,程序不需要再訪問共享記憶體的時候

4)刪除共享記憶體的物件,就是核心系統在記憶體空間建立的檔案描述符

具體**如下:

/*

* key_t ftok(const char *pathname,int proj_id)

* id是約好的id號,可以是兩個程序去訪問,

*_key(ipc_private)父子程序之間的key值,不需要通過ftok函式得到

* key值表示ipc識別符號

** int shmget (key_t key,int size,int shmflag);

* 這裡的shmget 就像檔案io中的open函式

* key值就是ftok函式返回的值,等同以fork函式的fd

* size表示共享記憶體開的大小

* shmflag 表示open的許可權位

* int shmat(int shmid,const void *shmaddr,int shmflag) (attch掛載的含義)

* shmid表示要對映的記憶體共享去的識別符號(shmget 返回識別符號)

* shmaddr表示共享記憶體區要對映到程序空間指定位址(賦空null表示系統自動完成對映)

* shmflag 設定記憶體空間的讀寫許可權(shm_rdonly,0表示共享記憶體可讀寫)

** int shmdt(const void *shmaddr)

* 這裡撤銷對映位址空間的shmaddr是shmat 函式的返回位址

* shmadd = (char *)shmat (shmid,null,0)

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

* shmid 是要操作的共享記憶體識別符號

* cmd 表示獲取物件的屬性,一般是刪除物件ipc_rmid

* buf 表示指定ipc_stat/ipc_set時用以儲存/設定屬性 (一般賦空null)*/

#include

#include

/* shmget, shmctl */

#include

/* fork */

#include

/* printf */

#include

/* exit */ #define bufsz 2048 int main() printf("process(pid=%d) created shared-memory id=%d\n", getpid(), shmid); if ((pid = fork()) < 0) if (pid == 0) else printf("removed shared-memory\n"); printf("------ shared memory segments --------\n"); printf("key shmid owner "\ "perms bytes nattch status\n"); system("ipcs -m | grep 666"); } exit(0); } /* * char *shmadd * shmadd = (char *)shmat(shmid,null,0) <(char *)0 對映位址空間 * shmdt(shmadd) 撤銷/解除程序與共享空間的對映關係 * shmctl(shmid,ipc_rmid,null) 刪除ipc共享記憶體空間 */

什麼是 Unix 以及它為什麼這麼重要?

大多數作業系統可以被劃分到兩個不同的家族。除了微軟的基於windows nt的作業系統外,幾乎所有其他的都可以追溯到unix。linux,mac os x,android,ios,chrome os,playstaion 4上執行的orbis os,執行在路由器上的各種韌體,所有這些作業系統通常都被...

UNIX 什麼是程序

對於乙個程式來說,他的被程式設計師寫好,通過編譯,就會以可執行檔案存放在磁碟了,他的存放格式elf格式,可能是二進位制檔案,也有可能是文字檔案,當使用者要使用程式時,就會通過系統的shell終端去執行命令,所以說程式時個靜態的特性,他是儲存在磁碟上的許多指令的有序集合,沒有執行的概念。而對於程序來說...

永遠的UNIX 什麼是CHROOT?

什麼是chroot?chroot就是change root,也就是改變程式執行時所參考的根目錄位置。一般的目錄架構 bin sbin usr bin home chroot的目錄架構 hell hell bin hell usr bin hell home 為何要chroot?1.限制被chroot...