2015-05-31 65 views
1

我正在嘗試通過消息隊列發送整數。我將這個整數的地址強制轉換爲(char *),因爲將來我希望接受其他數據類型,並且此數據將發送到用於消息隊列的結構中。在c中的消息隊列中進行類型轉換

在消息隊列(我已經驗證到被正確地工作),我送一個結構類型:

struct Type{ 

    long mtype; 
    char *data; 
}; 

要發送信息,下面的代碼從發送處理中執行:

struct Type* ack = malloc(sizeof(struct Type)); 
int temp = 999; 

ack->mtype = 1; 
ack->data = (char *)&temp; 


if(msgsnd(msqid, ack, sizeof(struct Type) - sizeof(long), 0) == -1){ 

      perror("Sending acknowledgement to producer\n"); 

} 

在接收器端,以下則執行:

struct Type *rack = malloc(sizeof(struct Type)); 

rack->mtype = 1; 

//Wait for acknowledgement from server 
if(msgrcv(prodmsqid, rack, sizeof(struct Type) - sizeof(long), 0, 0) == -1){ 

     perror("msgrcv for acknowledgement from server"); 

      exit(1); 


} 
printf("Acknowledgement has arrived: %d\n",(int)rack->data); 

輸出這個printf從非常大的數字(8171536)變化到4.

+1

不應該''(int *)rack-> data'?爲什麼不把結構的'data'成員改爲'int'而不是'char'指針呢? – Cyclonecode

回答

0

我認爲問題在於您傳遞的是堆棧上的地址,該地址是作爲char地址強制轉換的。但是這個int位置在發送之後就超出了範圍。一個解決方案,如果我是對的,那就是使int位置成爲全局。

+0

我修改了int位置爲全局,但無濟於事。我也嘗試在堆上分配內存來存儲int,但是產生了相同的結果。 爲了測試目的,我將Type結構中的數據字段修改爲整數。發送和接收的操作也明顯被修改爲發送或接收int而不是char *。 int已成功接收。因此,我想我的問題發生在類型轉換爲char * – user2035045

+0

我已經將msgrcv和msgsend的大小修改爲sizeof(Type)。這導致輸出是正確的。無論我在哪裏看,都建議刪除結構中long的大小,就像我之前做的那樣。如果我不刪除它,可能會遇到任何反彈嗎? – user2035045

+0

你對文檔和刪除長文件的大小是正確的。我想不出任何理由,你會因爲發送超過你想要的而忽略額外的東西而被燒燬。雖然它看起來並不很乾淨。 – donjuedo

0
struct Type{ 

    char *data; 
    long mtype; 
}; 

這會給你你想要的。

+0

我修改了變量的順序,但結果沒有改變。爲了符合msgrcv接受的通用數據結構,我將數據結構中的第一個類型傳遞得很長; http://linux.die.net/man/2/msgrcv – user2035045

+0

對。對不起,我讀得太快了。我想我現在確實看到了問題,並會發布更好的答案。 – donjuedo