2012-06-05 65 views
0

我正在使用IPC進行2程序通信。C程序IPC消息

片段我的代碼發送者:

int msgflg = IPC_CREAT | 0666; 
key_t key_id; 
struct msgbuf sbuf; 
size_t buflen; 
key_id = 1235; 

sbuf.mtype = 1; 

if (msgsnd(msqid, &sbuf, buflen, IPC_NOWAIT) < 0) 
{    die("msgsnd"); 

} 
else { 
    mvprintw(8, 0, "%s", "     "); 
    mvprintw(8, 0, "%s", sbuf.mtext);   
} 

接收端:

if ((msqid = msgget(key_id, 0666)) < 0) 
    die("msgget()");   //break; 

//Receive an answer of message type 1. 

if (msgrcv(msqid, &rcvbuffer, MAXSIZE, 1, 0) < 0) 
    die("msgrcv"); 
mvprintw(curr_row + 1, 0, "Cleaning process monitor: %s", rcvbuffer.mtext); 

通信工作完美,但在接收器的端接收到的消息沒有完全接收。

如果我發送「你好」,它僅接受「H」 我的緩衝區大小爲200

+0

'rcvbuffer'是什麼樣的? – user7116

+0

操作系統? – 2012-06-05 12:10:40

+0

你設置了buflen嗎? – waitingkuo

回答

1

你不能聲明結構msgbuf直接與多行文字大小1

struct msgbuf { 
    long mtype;  /* message type, must be > 0 */ 
    char mtext[1]; /* message data */ 
}; 

你需要什麼要做的就是在你的結構來聲明一個長字符數組,然後將其轉換爲void *

例如,

struct msgbuf { 
    long type; 
    char mtext[200]; 
}; 

struct msgbuf mybuf; 
// set type, store data in mtext 

msgsnd(msqid, (void*)&mybuf, sizeof(msgbuf)+1, IPC_NOWAIT) 
+0

我試過你的解決方案,但是這並沒有解決我的問題。我使用gcc編譯代碼,操作系統是Ubuntu。我的緩衝區大小是= buflen = strlen(sbuf.mtext)+ 1;宣佈爲:size_t buflen; – user1426143

+0

你能告訴我你的sbuf&rvbuf嗎? – waitingkuo