c - mq_open() - 打开的文件太多

标签 c linux posix message-queue

我正在尝试编写一个客户端和服务器,它们将使用 POSIX 消息队列交换数据。我试图通过查看我在互联网上看到的示例和类(class)的文档来做到这一点。但是,我被困住了。当我运行它时,出现“打开的文件太多”错误。这是我的代码:

客户:

int main( int argc, char *argv[]) {

    //Open its queue, which is client queue
    char cq_name[10];
    sprintf( cq_name, "/cq%i", getpid());
    printf( "Client Queue name: %s\n", cq_name);

    mqd_t cq_id = mq_open( cq_name, O_CREAT | O_RDWR, 0666, NULL);
    if( cq_id == -1) {

            printf( "Error in cq: %s\n", strerror( errno));
            return -1;
    }

    printf( "Name: %s\n", argv[1]);

    //Connect to the server message queue
    mqd_t sq_id = mq_open( argv[1], O_RDWR);

    if( sq_id == -1) {

            printf( "Error in sq: %s\n", strerror( errno));
            return -1;
    }

...

服务器:

int main( int argc, char *argv[]) {

    //The server message queue
    struct mq_attr attr;
    attr.mq_flags = 0;
    attr.mq_curmsgs = 0;

    printf( "Name: %s\n", argv[1]);

    mqd_t id = mq_open( argv[1], O_CREAT | O_RDWR, 0666, NULL);

    //Check the message queue
    if( id == -1) {

            printf( "Error: %s\n", strerror(errno));
    }

    printf( "Check Point 1 - %i\n", id);

...

你能帮我找出问题所在吗?提前致谢..

最佳答案

这周我遇到了这个问题 - 我最多只能打开 10 个 mqs。

我的意图是使用 mqs 将事件通知传递给线程。在我的例子中,event_id 只是一个 int。通过在调用 mq_open 时指定非默认属性,如下所示:

char mq_name[128];
sprintf(mq_name, "%s.%d", MQ_NAME, nnid);

struct mq_attr attrib;
attrib.mq_flags = 0;
attrib.mq_maxmsg = 4;
attrib.mq_msgsize = sizeof(int);
attrib.mq_curmsgs = 0;

retval = mq = mq_open(mq_name, O_RDWR | O_CREAT | O_EXCL, 0644, &attrib);

在 mq_open() 失败之前,我现在最多可以打开 256 个 mq。

关于c - mq_open() - 打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22081382/

相关文章:

linux - 将txt行放入变量中,除以分隔符检查并重写txt发送命令

c - 从c中的随机访问文件中读取

c++ - 需要简单的指针数组相等解释

c - K&R 第 2 章 : Difference between u and l integer suffix in C

python - 在 python 中使用 for 循环探索目录 - 顺序是否改变?

c - 与 C 信号的简单同步

c - C 编程中文件中写入了错误的详细信息

linux - 使用 SSH key 使用 "sudo su - username"切换用户

为单个线程创建信号处理程序

c++ - 如何从 C++ 程序中打开自定义 I/O 流?