在FC 18计算机上,mq_打开失败,错误为无EMFILE

在FC 18计算机上,mq_打开失败,错误为无EMFILE,c,linux,message-queue,C,Linux,Message Queue,我正试图打开一个新的消息队列,但它失败了,出现了太多打开的文件(24)错误 以下是我的示例代码: #define ALERT_Q_NAME "/alert_q_test" mqd_t mqdes; int main() { struct mq_attr attr; attr.mq_flags = 0; attr.mq_maxmsg = 512; attr.mq_msgsize = 1536; mqdes = mq_open(ALERT_Q_NAME

我正试图打开一个新的消息队列,但它失败了,出现了太多打开的文件(24)错误

以下是我的示例代码:

#define ALERT_Q_NAME "/alert_q_test"

mqd_t mqdes;

int main()
{
    struct mq_attr attr;

    attr.mq_flags = 0;
    attr.mq_maxmsg = 512;
    attr.mq_msgsize = 1536;

    mqdes = mq_open(ALERT_Q_NAME, O_RDONLY | O_CREAT, 0600, &attr);
    if(mqdes == (mqd_t) -1)
    {
            printf("Failed:%d(%s)\n",errno,strerror(errno));
            exit(-1);
    }
    else
    {
            printf("Passed\n");
            mq_close(mqdes);
    }
    return 0;
}
可以创建的消息队列数量的系统范围限制为:

$cat/proc/sys/fs/mqueue/queues\u max
256

我确信没有达到这个系统限制,因为我正在一个新安装的FC18机器上运行这个示例代码。为了确认这一点,我安装了消息队列文件系统:

$mkdir/dev/mqueue
$mount-t mqueue none/dev/mqueue
$ls-l/dev/mqueue
总计0
$gcc-g-o mqueue mqueue.c-lrt
$./mqueue
失败:24(打开的文件太多)
$ls-l/dev/mqueue
总计0

与FC18一样,我无法在内核版本3.6.10和3.6.11上运行的Linux机器上创建消息队列。而同样的程序在Linux 2.6.31和Linux 3.3.4上运行良好


好像它在什么地方坏了。或者我在这里错过了什么?需要帮忙吗?!?谢谢

回答有点晚,但是:

如果打开的文件太多或超出了最大MQUE大小,则mq_open可能会因errno=EMFILE而失败

有关大小计算的更多信息,请参阅中的RLIMIT_MSGQUEUE

要获取当前软/硬限制,请执行以下操作:

grep -E 'Limit|queue' /proc/self/limits
要永久更改限制,请编辑/etc/security/limits.conf并使用“su-”再次登录用户

/etc/security/limits.conf:

[user] hard msgqueue unlimited
[user] soft msgqueue unlimited
另一种可能性是使用setrlimt(2)/prlimit(2)设置软限制。
如果硬限制对您来说太小,则需要CAP\u系统资源。

回答有点晚,但是:

如果打开的文件太多或超出了最大MQUE大小,则mq_open可能会因errno=EMFILE而失败

有关大小计算的更多信息,请参阅中的RLIMIT_MSGQUEUE

要获取当前软/硬限制,请执行以下操作:

grep -E 'Limit|queue' /proc/self/limits
要永久更改限制,请编辑/etc/security/limits.conf并使用“su-”再次登录用户

/etc/security/limits.conf:

[user] hard msgqueue unlimited
[user] soft msgqueue unlimited
另一种可能性是使用setrlimt(2)/prlimit(2)设置软限制。
如果硬限制对您来说太小,则需要CAP\u系统资源。

回答有点晚,但是:

如果打开的文件太多或超出了最大MQUE大小,则mq_open可能会因errno=EMFILE而失败

有关大小计算的更多信息,请参阅中的RLIMIT_MSGQUEUE

要获取当前软/硬限制,请执行以下操作:

grep -E 'Limit|queue' /proc/self/limits
要永久更改限制,请编辑/etc/security/limits.conf并使用“su-”再次登录用户

/etc/security/limits.conf:

[user] hard msgqueue unlimited
[user] soft msgqueue unlimited
另一种可能性是使用setrlimt(2)/prlimit(2)设置软限制。
如果硬限制对您来说太小,则需要CAP\u系统资源。

回答有点晚,但是:

如果打开的文件太多或超出了最大MQUE大小,则mq_open可能会因errno=EMFILE而失败

有关大小计算的更多信息,请参阅中的RLIMIT_MSGQUEUE

要获取当前软/硬限制,请执行以下操作:

grep -E 'Limit|queue' /proc/self/limits
要永久更改限制,请编辑/etc/security/limits.conf并使用“su-”再次登录用户

/etc/security/limits.conf:

[user] hard msgqueue unlimited
[user] soft msgqueue unlimited
另一种可能性是使用setrlimt(2)/prlimit(2)设置软限制。
如果hardlimit对于您来说太小,那么就需要CAP_SYS_资源。

我看到的一个问题是,即使我们将attr设置为NULL,默认值对于上面讨论的每进程限制@wr0112358来说也太大

因此,我们可以很好地在中发现的整个系统限制下工作

# cat /proc/sys/fs/mqueue/msg_max
128
# cat /proc/sys/fs/mqueue/msgsize_max
65536
而超过了我们的每道工序ulimits

# ulimit -a |grep queue
POSIX message queues     (bytes, -q) 819200
您可以用来检查的一个快速解决方案是增加ulimit:

# ulimit -q unlimited

或者设置@wr0112358所述的rlimit,以获得更持久的解决方案。

我看到的一个问题是,即使我们将attr设置为NULL,默认值对于上述@wr0112358所讨论的每个进程的限制也太大

因此,我们可以很好地在中发现的整个系统限制下工作

# cat /proc/sys/fs/mqueue/msg_max
128
# cat /proc/sys/fs/mqueue/msgsize_max
65536
而超过了我们的每道工序ulimits

# ulimit -a |grep queue
POSIX message queues     (bytes, -q) 819200
您可以用来检查的一个快速解决方案是增加ulimit:

# ulimit -q unlimited

或者设置@wr0112358所述的rlimit,以获得更持久的解决方案。

我看到的一个问题是,即使我们将attr设置为NULL,默认值对于上述@wr0112358所讨论的每个进程的限制也太大

因此,我们可以很好地在中发现的整个系统限制下工作

# cat /proc/sys/fs/mqueue/msg_max
128
# cat /proc/sys/fs/mqueue/msgsize_max
65536
而超过了我们的每道工序ulimits

# ulimit -a |grep queue
POSIX message queues     (bytes, -q) 819200
您可以用来检查的一个快速解决方案是增加ulimit:

# ulimit -q unlimited

或者设置@wr0112358所述的rlimit,以获得更持久的解决方案。

我看到的一个问题是,即使我们将attr设置为NULL,默认值对于上述@wr0112358所讨论的每个进程的限制也太大

因此,我们可以很好地在中发现的整个系统限制下工作

# cat /proc/sys/fs/mqueue/msg_max
128
# cat /proc/sys/fs/mqueue/msgsize_max
65536
而超过了我们的每道工序ulimits

# ulimit -a |grep queue
POSIX message queues     (bytes, -q) 819200
您可以用来检查的一个快速解决方案是增加ulimit:

# ulimit -q unlimited
或者将rlimit设置为@wr0112358,以获得更持久的解决方案