2014-01-23 57 views
3

我想創建一個共享內存對象並將其截斷爲特定大小。共享內存編程中的shm_open和ftruncate()

SHMSIZE與512

MODE被設置與S_IRUSR定義| S_IWUSR | S_IWGRP | S_IRGRP | S_IWOTH | S_IROTH

這裏是我的代碼

char *shm_name = "SharedMemory";  
int fd; 

/* Open an Shared Memory Object for Read-/Write-Access */  
if((fd = shm_open(shm_name, O_RDWR | O_CREAT, MODE) < 0)) {  
    perror("\nshm_open() in Caretaker failed");  
    exit(EXIT_FAILURE); 
} 

/* Truncate Shared Memory Object to specific size */ 
if((ftruncate(fd, SHMSIZE) < 0)) { 
    perror("\nftruncate() in Caretaker failed"); 
    exit(EXIT_FAILURE); 
} 

在調試我看了那個的shm_open()的返回值爲0每一次,但我可以看到的/ dev/shm的這個對象。在執行ftruncate()時,它每次都返回錯誤「無效參數」。

爲什麼fd每次都是0,爲什麼ftruncate不起作用? 我該怎麼辦?

回答

6

本聲明的操作順序是靠不住的:

if((fd = shm_open(shm_name, O_RDWR | O_CREAT, MODE) < 0)) { 

你分配的shm_open(...) < 0的結果fd,這絕對不是你想要的。

移動比較括號外:

if((fd = shm_open(shm_name, O_RDWR | O_CREAT, MODE)) < 0) { 
                ^^^ 
+0

非常感謝你。有時候這是一個簡單的解決方案! – user3229664