2010-11-02 5 views
2

Мне нужно запустить команду «ulimit -n 400», чтобы собрать количество разрешенных открытых файлов, прежде чем я запустил свою программу, написанную на C, но есть ли способ сделать эквивалент из программы C?Как сделать эквивалент «ulimit -n 400» изнутри C?

То есть, увеличьте количество разрешенных дескрипторов открытых файлов для этого процесса. (Меня не интересуют ограничения на потоки.)

Будет ли это связано с установкой ulimits, а затем для разворачивания ребенка, которому будет разрешено иметь больше открытых файлов?

Конечно, я мог бы написать оболочку оболочки, которая запускает ulimit, а затем запускать мою программу на C, но она выглядит менее элегантной. Я мог бы также grep через исходный код bash или sh посмотреть, как это делается там - возможно, если я не получу ответа здесь.

Также, если вы хотите выбрать много дескрипторов файлов, look here.

+0

Я боюсь, что вы сможете снизить лимит, но не поднимать его из одного и того же процесса. –

+0

@ Паскаль, я понял, что это может быть так, но должен быть способ поднять для ребенка, или команда ulimit не будет иметь никакого эффекта. –

+0

Не могли бы вы назвать оболочку, делающую это из программы C? – Raveline

ответ

10

Я думаю, что вы ищете setrlimit(2).

+0

Итак, если я root, я могу поднять свои лимиты - не нужно вилка? –

+0

И есть также 'ulimit', который реализован в терминах syscall' setrlimit' и требуется POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/functions/ulimit.html, но не имеет syscall для него. –

4
#include <sys/resource.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 

int main (int argc, char *argv[]) 
{ 
    struct rlimit limit; 

    limit.rlim_cur = 65535; 
    limit.rlim_max = 65535; 
    if (setrlimit(RLIMIT_NOFILE, &limit) != 0) { 
    printf("setrlimit() failed with errno=%d\n", errno); 
    return 1; 
    } 

    /* Get max number of files. */ 
    if (getrlimit(RLIMIT_NOFILE, &limit) != 0) { 
    printf("getrlimit() failed with errno=%d\n", errno); 
    return 1; 
    } 

    printf("The soft limit is %llu\n", limit.rlim_cur); 
    printf("The hard limit is %llu\n", limit.rlim_max); 

    /* Also children will be affected: */ 
    system("bash -c 'ulimit -a'"); 

    return 0; 
} 
+0

Добавление собственного ответа с помощью простого примера и правильного определения (RLIMIT_NOFILE) для установки количества открытых файлов. –

+0

Хорошо, но согласно Клану это должно быть% lu, а не% llu. Ну, последнее также дало мне неправильные цифры (вы на x86_64?). Как обычно, GCC просто проигнорировал эту ошибку. – asdf