3

我使用以下代码创建了一个消息队列。前几次它工作正常。

int main()
{
    mqd_t mqdes;
    char mq_name[10] = "/mq";
    int oflag = O_CREAT | O_RDWR, ret;
    struct mq_attr attr;

    attr.mq_maxmsg = 1024;
    attr.mq_msgsize = 2048; 

    mqdes = mq_open(mq_name, oflag, 0766, &attr);
    if(mqdes == -1) {
            perror("mq_open");
            if(errno == EMFILE)
                    perror("EMFILE");
            exit(1);
    }

    printf("mqueue created, mq_descriptor: %d\n", mqdes);

    ret = mq_close(mqdes);
    if(ret == -1) {
            perror("mq_close");
            exit(2);
    }
    printf(" mq closed successful\n");


    return 0;
}

之后,它给出了以下错误

mq_open: Too many open files
EMFILE: Too many open files

但是为什么我会收到这个错误?如何查看ipcs系统 V 的 possix 消息队列?

4

3 回答 3

3

尝试设置资源限制:

#include <sys/resource.h>

struct rlimit rlim;
memset(&rlim, 0, sizeof(rlim));
rlim.rlim_cur = RLIM_INFINITY;
rlim.rlim_max = RLIM_INFINITY;

setrlimit(RLIMIT_MSGQUEUE, &rlim); 
于 2016-06-22T18:55:51.303 回答
2

我在尝试某事时遇到了同样的问题。如果您不小心在系统上留下了太多打开的消息队列,您可以尝试删除您的 mqueue 在 directory 中/dev/mqueue。这对我有用。

此外,您可能希望使用mq_unlink(const char *name)aftermq_close()以确保从系统中删除队列,如此处所述

于 2014-02-27T13:19:43.253 回答
1

我有同样的问题,我通过增加 setrlimit 解决RLIMIT_MSGQUEUE

如果硬限制 (rlim_max) 也太低(对我来说就是这种情况),您必须为您的进程CAP_SYS_RESOURCE授予特权,以便您可以在设置进程限制 (rlim_cur) 之前设置硬限制。运行$ setcap 'CAP_SYS_RESOURCE=+ep' /path/to/executable可执行文件或编辑/etc/security/capability.conf以将 CAP_SYS_RESOURCE 提供给用户/组。

于 2014-08-25T16:17:47.570 回答