mq_open дает "слишком много открытых файлов"

Я создал очередь сообщений со следующим кодом. Первые несколько раз это работает правильно.

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

Но почему я получаю эту ошибку? Как я могу видеть очереди сообщений possix как ipcs для системы V?

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); 

У меня была такая же проблема при попытке что-то. Если в вашей системе случайно осталось слишком много открытых очередей сообщений, вы можете попробовать удалить свои mqueue из каталога. /dev/mqueue, Это сработало для меня.

Также вы можете использовать mq_unlink(const char *name) после mq_close() чтобы убедиться, что очередь удалена из системы, как описано здесь.

У меня была та же проблема, и я решил ее, увеличив RLIMIT_MSGQUEUE через setrlimit.

Если жесткий предел (rlim_max) также слишком низок (что было для меня), вам придется дать вашему процессу CAP_SYS_RESOURCE привилегии, так что вы можете установить жесткий предел, прежде чем установить ограничение процесса (rlim_cur). Либо беги $ setcap 'CAP_SYS_RESOURCE=+ep' /path/to/executable поверх исполняемого файла или редактирования /etc/security/capability.conf передать CAP_SYS_RESOURCE пользователю / группе.

Другие вопросы по тегам