【问题标题】:C program IPC messageC程序IPC消息
【发布时间】:2012-06-05 12:03:43
【问题描述】:

我正在使用 IPC 进行 2 个程序通信。

我的发件人代码片段:

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);

通信正常,但接收方接收到的消息未完全接收。

如果我发送“Hello”,它只会收到“H” 我的缓冲区大小是 200

【问题讨论】:

  • rcvbuffer 长什么样子?

标签: c ipc


【解决方案1】:

你不能直接用 mtext size 1 声明 struct msgbuf

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

你需要做的是在你的结构体中声明一个long char数组,然后将其转换为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)  

【讨论】:

  • 我尝试了您的解决方案,但这并没有解决我的问题。我正在使用 gcc 编译代码,操作系统是 Ubuntu。我的缓冲区大小是 = buflen = strlen(sbuf.mtext) + 1 ;声明为:size_t buflen;
猜你喜欢
  • 2013-01-05
  • 2012-08-05
  • 2012-09-19
  • 2021-03-12
  • 2020-10-25
  • 2016-01-03
  • 1970-01-01
  • 2017-03-17
  • 2019-08-21
相关资源
最近更新 更多