C程序IPC消息

C程序IPC消息,c,ipc,C,Ipc,我使用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"); } e

我使用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);
int msgflg=IPC|u CREAT | 0666;
密钥\u t密钥\u id;
结构msgbuf-sbuf;
布弗伦尺寸;
key_id=1235;
sbuf.mtype=1;
如果(msgsnd(msqid和sbuf、buflen、IPC_NOWAIT)<0)
{die(“msgsnd”);
}  
否则{
mvprintw(8,0,“%s,”);
mvprintw(8,0,“%s”,sbuf.mtext);
}
接收端:

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);
if((msqid=msgget(key_id,0666))<0)
模具(“msgget()”)//打破
//接收消息类型为1的应答。
if(msgrcv(msqid和rcvbuffer,MAXSIZE,1,0)<0)
模具(“msgrcv”);
mvprintw(当前行+1,0,“清洗过程监视器:%s”,rcvbuffer.mtext);
通信工作正常,但在接收器端接收到的消息未完全接收

如果我发送“你好”,它只接收“H”
我的缓冲区大小为200

您不能直接用多行文字大小1声明struct msgbuf

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)  

rcvbuffer
看起来像什么?我尝试了你的解决方案,但没有解决我的问题。我使用gcc编译代码,操作系统是Ubuntu。我的缓冲区大小是=buflen=strlen(sbuf.mtext)+1;声明为:size_t buflen;