C程序IPC消息
Posted
技术标签:
【中文标题】C程序IPC消息【英文标题】:C program IPC message 【发布时间】: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
长什么样子?
【参考方案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;以上是关于C程序IPC消息的主要内容,如果未能解决你的问题,请参考以下文章
用于基于 C 的远程控制/守护程序(IPC/RPC)的优雅 API?
在 c 程序和 C++ Qt 应用程序之间使用啥 Linux IPC?