2013-10-08 8 views
1

Я создал очередь сообщений со следующим кодом. Первые несколько раз он работает правильно.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 

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

+0

Получаете ли вы 'MQ закрыл успешный \ n' сообщение в конце сессии? [ЗДЕСЬ] (http://stackoverflow.com/a/3056992/645128) - еще один пример использования mq_open, возможно, вы можете увидеть что-то там, что вы не делаете. – ryyker

+0

@ryyker: как это может закончиться программа? mq_open терпит неудачу и дает ошибку. – SGG

+1

Что касается вашего вопроса _ Как я могу видеть очереди сообщений posix, такие как ipcs для системы V? _ [ЭТО] (http://www.linuxforums.org/forum/red-hat-fedora-linux/93230-what-posix-equivalent -ipcs-m.html) ссылка немного об этом говорит. Я не вижу ничего другого в том, что вы опубликовали, что предполагает, что у вас должно быть слишком много файлов. – ryyker

ответ

2

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

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

0

У меня была та же проблема, и я решил ее, увеличив 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 пользователю/группе.

0

Попробуйте установить лимиты ресурсов:

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