当前位置: 首页 > 面试题库 >

在基于Linux的系统上,如何在交流程序中使用mqueue?

皇甫琛
2023-03-14
问题内容

如何在基于Linux的系统上的ac程序中使用mqueue(消息队列)?

我正在寻找一些好的代码示例,这些示例可以显示如何以正确和适当的方式(可能是方法)来完成此操作。


问题答案:

下面是一个简单的服务器示例,该服务器从客户端接收消息,直到接收到“ exit”消息告诉其停止为止。

服务器 的代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <mqueue.h>

#include "common.h"

int main(int argc, char **argv)
{
    mqd_t mq;
    struct mq_attr attr;
    char buffer[MAX_SIZE + 1];
    int must_stop = 0;

    /* initialize the queue attributes */
    attr.mq_flags = 0;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = MAX_SIZE;
    attr.mq_curmsgs = 0;

    /* create the message queue */
    mq = mq_open(QUEUE_NAME, O_CREAT | O_RDONLY, 0644, &attr);
    CHECK((mqd_t)-1 != mq);

    do {
        ssize_t bytes_read;

        /* receive the message */
        bytes_read = mq_receive(mq, buffer, MAX_SIZE, NULL);
        CHECK(bytes_read >= 0);

        buffer[bytes_read] = '\0';
        if (! strncmp(buffer, MSG_STOP, strlen(MSG_STOP)))
        {
            must_stop = 1;
        }
        else
        {
            printf("Received: %s\n", buffer);
        }
    } while (!must_stop);

    /* cleanup */
    CHECK((mqd_t)-1 != mq_close(mq));
    CHECK((mqd_t)-1 != mq_unlink(QUEUE_NAME));

    return 0;
}

客户端 代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <mqueue.h>

#include "common.h"


int main(int argc, char **argv)
{
    mqd_t mq;
    char buffer[MAX_SIZE];

    /* open the mail queue */
    mq = mq_open(QUEUE_NAME, O_WRONLY);
    CHECK((mqd_t)-1 != mq);


    printf("Send to server (enter \"exit\" to stop it):\n");

    do {
        printf("> ");
        fflush(stdout);

        memset(buffer, 0, MAX_SIZE);
        fgets(buffer, MAX_SIZE, stdin);

        /* send the message */
        CHECK(0 <= mq_send(mq, buffer, MAX_SIZE, 0));

    } while (strncmp(buffer, MSG_STOP, strlen(MSG_STOP)));

    /* cleanup */
    CHECK((mqd_t)-1 != mq_close(mq));

    return 0;
}

常见的 头:

#ifndef COMMON_H_
#define COMMON_H_

#define QUEUE_NAME  "/test_queue"
#define MAX_SIZE    1024
#define MSG_STOP    "exit"

#define CHECK(x) \
    do { \
        if (!(x)) { \
            fprintf(stderr, "%s:%d: ", __func__, __LINE__); \
            perror(#x); \
            exit(-1); \
        } \
    } while (0) \


#endif /* #ifndef COMMON_H_ */

编译

gcc -o server server.c -lrt
gcc -o client client.c -lrt


 类似资料:
  • 我的默认java位于以下位置- 因此,我将上面的目录(即usr/lib/jvm/java-11-openjdk-amd64/bin/java)设置为Jenkins全局工具配置中的java\u主页,但它显示了以下消息- /usr/lib/jvm/java-11-openjdk-amd64/bin/java不是Jenkins master上的目录(但可能存在于某些代理上) 因此,我删除了bin/jav

  • 我有一个真正的env与3个kafka机器集群,它正在接收大量数据。对于每个主题,有 25 个分区,复制因子设置为 2。 我的应用程序(基于kafka流的应用程序)从这个kafka集群获取数据的应用程序停机了一个多月。现在,每个分区都有大量滞后;高达90000000。 我知道以下参数: 我有两个消费者节点(使用kafka集群数据的相同组id)。 然而,它并没有赶上滞后,而是保持不变。有人能建议如何改

  • 本文向大家介绍基于PowerShell在Ubuntu系统的使用详解,包括了基于PowerShell在Ubuntu系统的使用详解的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍如何在Ubuntu 16.04 LTS上安装和使用PowerShell。要知道,PowerShell Core是微软公司推出的一个跨平台(Windows,Linux和macOS)自动化和配置工具/框架,可与现有工具很好地

  • Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程。学习 Linux 的启动过程,有助于了解 Linux 系统的结构,也对系统的排错有很大的帮助。 CentOS 6.x 系统启动过程发生了较大的变化,使用 Upstart 启动服务取代了原先的 System V init 启动服务。Upstart 启动服务的效率更高,启动速度更快。 Linux 系统启动过程比较复杂,

  • 如何在没有GUI干预的情况下自动化整个jprofile过程? 启动jprofiling时,在向客户端提交100个请求之前还是之后? 在Linux系统中安装jprofiler后,我没有找到config.xml(/root/.jprofiler8)。如何创建它? 如何创建没有GUI的会话? 为了分析jprofiler输出,我将在window system上进行复制,并将使用GUI jprofiler。

  • 问题内容: 我已经准备了一个应用程序和网站,客户可以在该应用程序上为其设置几个选项,然后再下载。设置以二进制格式存储在文件的末尾(附加),然后将已编辑的文件发送给最终用户。问题是文件的“内容”的更改将破坏文件签名- 是否有任何机会使用任何命令行工具重新签名此更改的文件?我尝试使用Microsoft的SignTool,但在Linux上无法正常工作。 问题答案: 使用的signtool 实际上很简单;