shmget 報錯(errno = -EEXIST)的處理


處理一:

用ipcs 命令查看共享內存分配信息
# ipcs

------ Shared Memory Segments --------
key               shmid        owner      perms      bytes      nattch     status      
0x660165c1 1015808    root         666          40           0                       
……         

 

0x660165c1 即是代碼中是shm_key,對應的shmid 為1015808,刪除掉即可:

# ipcrm -m 1015808

處理二:

調用 shmget(shm_key, size, 0) 獲取shmid,如果獲取到了,

調用 shmctl(shmid, IPC_RMID, NULL) 刪除掉即可。

 

-------------------------------------------------------

附shmget 簡介

1. 所需頭文件
#include <sys/ipc.h>
#include <sys/shm.h>


2. 函數說明
獲取一個共享內存標識符或創建一個共享內存對象並返回共享內存標識符


3. 函數原型
int shmget(key_t key, size_t size, int shmflg)


4. 函數傳入值
key:
    0(IPC_PRIVATE):會建立新共享內存對象
    大於0的32位整數:視參數shmflg來確定操作。通常要求此值來源於ftok返回的IPC鍵值
size:
    大於0的整數:新建的共享內存大小,以字節為單位
    0:只獲取共享內存時指定為0
shmflg
    0:取共享內存標識符,若不存在則函數會報錯
    IPC_CREAT:當shmflg&IPC_CREAT為真時,如果內核中不存在鍵值與key相等的共享內存,則新建一個共享內存;
               如果存在這樣的共享內存,返回此共享內存的標識符
    IPC_CREAT|IPC_EXCL:如果內核中不存在鍵值 與key相等的共享內存,則新建一個共享內存;
               如果存在這樣的共享內存則報錯

5. 函數返回值
成功:返回共享內存的標識符
出錯:-1,錯誤原因存於error中


6. 附加說明
上述shmflg參數為模式標志參數,使用時需要與IPC對象存取權限(如0600)進行|運算來確定信號量集的存取權限
錯誤代碼
EINVAL:參數size小於SHMMIN或大於SHMMAX
EEXIST:預建立key所指的共享內存,但已經存在
EIDRM:參數key所指的共享內存已經刪除
ENOSPC:超過了系統允許建立的共享內存的最大值(SHMALL)
ENOENT:參數key所指的共享內存不存在,而參數shmflg未設IPC_CREAT位
EACCES:沒有權限
ENOMEM:核心內存不足

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM