2012-11-09 115 views
2

我:如何從共享內存中分離字符串數組? ç

int array_id; 
char* records[10]; 

// get the shared segment 
if ((array_id = shmget(IPC_PRIVATE, 1, 0666)) == -1) { 
      perror("Array Creating"); 
} 

// attach 
records[0] = (char*) shmat(array_id, (void*)0, 0); 
if ((int) *records == -1) { 
    perror("Array Attachment"); 
} 

工作正常,但是當我試圖拆離我得到一個「無效參數」的錯誤。

// detach 
int error; 
if((error = shmdt((void*) records[0])) == -1) { 
     perror(array detachment); 
} 

有什麼想法嗎?謝謝

+1

你怎麼知道'shmat'工作「很好」?你沒有做錯誤檢查...並且array_id被使用了未初始化。 *從不*發佈修改和不完整的代碼,*總是*完成後,我們可以編譯的實際代碼! – Jens

+0

@Jens是的,他檢查錯誤是= -1。我對perror(數組detachment)部分感到困惑,這實際上是c中的一件事嗎? –

+0

抱歉,我遺漏了錯誤,但在附加後我確實檢查了。我知道它工作正常,因爲我沒有得到任何錯誤,我也分配了一些字符串並打印出來。我被告知使用perror()而不是printf()O.o – Tim

回答

1

shmdt(),不需要將指針參數轉換爲void*它會自動處理這個。

shmdt((void*) records[0]))刪除(void*)。它應該是這樣的。

if ((error = shmdt(records[0])) == -1) 
{ 
    perror("Array detachment"); 
} 

它會工作。

也在shmat(),如果有錯誤,則返回(void*) -1,因此您的比較會發出警告。 所以做這樣的

if ((char *)records[0] == (void *)-1) 
{ 
    perror("Array Attachment"); 
} 
+0

當測試==(void *) - 1)'時,不需要投入'records [0]'。 – alk

+0

順便說一句:OP的代碼也可以工作,即使在鑄造時也是如此。 – alk

+0

@alk:我看到了'shmat'的man頁面,它給出了'(void *)-1' ..這就是我寫的原因。你能否在這裏詳細說明一下,因爲指向整型的指針比較會讓你興奮不是嗎? – Omkant

1

假設安裝順利,invalid argument只是意味着該段已分離,或因爲它是由連接設置的records[0]值發生了變化。

+0

我應該檢查-1並使用perror然後? – Tim

+0

我的回答暗示問題不在於你如何附加/分離。代碼基本上是好的。如果你想拋光它去* Omkant的*答案。 @Tim – alk

+0

你是對的,我沒有修改記錄[0],錯誤消失了。 @alk – Tim