2010-01-29 34 views
0

使用的msgsnd在手冊頁中提到的結構消息隊列的msgsnd多行文字領域

struct mymsg { 
    long mtype; /* message type */ 
    char mtext[1]; /* body of message */ 
}; 

,如果你使用它像

func(char *array, int sizeofarray) 
{ 
    struct mymsg { 
     long mtype; /* message type */ 
     char *ptr; /* body of message */ 
    }; 

    msgq.mtype = 1; 
    msgq.ptr = array; 

    msgsnd(msqid, &msgq, sizeofarray, 0); 
} 

分配PTR當地一些陣列[200](陣列可以作爲函數中的一個參數),在另一端收到的消息是垃圾。爲什麼是這樣?

回答

2

這是垃圾,因爲您指定的結構是而不是想要的表格。它期望數據被複制到內存中的mtype值之後,而不是在其他地方的數組中。

如果你想發送長度200的數組,你需要做的是這樣的:

struct mymsg { 
    long mtype; 
    char mtext[200]; 
} foo; 

foo.mtype = 1; 
memcpy(foo.mtext, array, 200); 

msgsnd(msqid, &foo, 200, 0); 
0

即使這是沒有錯的原因,咖啡館點了,讓我們說你不喜歡的東西:

func(char *array) 
{ 
    struct mymsg 
    { 
     long mtype; /* message type */ 
     char *ptr; /* body of message */ 
    }; 

    msgq.mtype = 1; 
    msgq.ptr = array; 

    msgsnd(msqid, &msgq, sizeof(ptr), 0); 
} 

如果一個不同的進程正在讀隊列,ptr對它意味着什麼?如果有的話,它會指向不同的地址空間?

+0

這不是sizeof(ptr),而是原始數組的大小。無論如何..我已經猜到了caf回答的答案。我剛剛證實。 – bluegenetic 2010-01-31 18:20:04

+0

我知道。你錯過了這一點。我試圖展示別的東西。 – Duck 2010-01-31 21:40:17

+0

非常感謝你:) – bluegenetic 2010-02-01 05:35:09