进程间通信“紧急”消息类型

Posted

技术标签:

【中文标题】进程间通信“紧急”消息类型【英文标题】:Inter Process Communication 'URGENT' message types 【发布时间】:2015-03-12 15:24:32 【问题描述】:

我一直在经历Beej's guides on inter process communication。

如何修改“kirk.c”以发送标记为“紧急”的消息? 然后这些紧急消息会被“spock.c”忽略,而被另一个程序读取?

【问题讨论】:

当链接内容不可用时,依赖链接内容的问题很容易变得无用。考虑创建一个最小、完整和可验证的示例:***.com/help/mcve 【参考方案1】:

在文件kirk.c 中,我们可以引入一个枚举变量,它将定义要发送的消息的类型。结构struct my_msgbuf 有一个成员变量long mtype;。可以在将其发送给接收者之前将其初始化为消息类型,在本例中为 spock.c

枚举声明:

enum msgType 
    URGENT = 0,
    NORMAL = 1
;

上面的枚举声明可以放在kirk.cspock.c的公共头文件中。

buf.mtype = 1; /* we don't really care in this case */ 行应修改为buf.mtype = URGENT; /* we don't really care in this case */

spock.c 中,以下几行:

for(;;)  /* Spock never quits! */
    if (msgrcv(msqid, &buf, sizeof(buf.mtext), 0, 0) == -1) 
        perror("msgrcv");
        exit(1);
    
    printf("spock: \"%s\"\n", buf.mtext);

..将修改为:

for(;;)  /* Spock never quits! */
    if (msgrcv(msqid, &buf, sizeof(buf.mtext), 0, 0) == -1) 
        perror("msgrcv");
        exit(1);
    
    if (URGENT != buf.mtype) 
        printf("spock: \"%s\"\n", buf.mtext);
    

因此,只有当消息类型不是URGENT 时,spock 才会“处理”(在这种情况下,它只是打印数据作为处理它的一种方式)消息。

【讨论】:

安息吧,斯波克 27/2/2015 buf.mtype 声明为您选择大小的字符数组,但至少具有实现所需的最少字符数。将URGENT != buf.mtype 替换为strncmp

以上是关于进程间通信“紧急”消息类型的主要内容,如果未能解决你的问题,请参考以下文章

Linux进程间通信——消息队列

linux进程间通信之消息队列

八进程间通信-消息队列

Linux进程间通信——使用消息队列

进程间通信之消息队列通信

进程间通信——XSI IPC之消息队列