Я пытаюсь написать простой код C, который выполняет сценарий оболочки для N итераций (где N больше 3000). Сначала кажется, что код работает отлично, но по мере увеличения количества итераций функция system() начинает возвращать -1. Кроме того, если я запускаю всю программу еще раз, ошибка возникает точно в той же точке цикла.
Вот мой код:
int main(void)
{
char command[] = "bash sampleScript";
int i, ret, N = 3000;
for(i=0;i<N;i++){
/* Open 'sampleScript', make the required modifications and close it */
while(!system(NULL)){
printf("Shell is unavailable");
sleep(2);
}
ret = system(command);
if(ret == -1){
printf("System failed\n");
exit(1);
}
}
return 0;
}
Вывод сценария оболочки не влияет на код C. Когда я выполняю этот код, около i = 2900, system() начинает возвращать -1, и я совершенно не понимаю, почему это происходит. Я пропустил очевидный момент здесь? Кто-нибудь может мне помочь?
Я использую gcc на 64-битной Ubuntu.
Обновление:
Когда system() возвращает -1, соответствующее значение errno
равно 12 — невозможно выделить память.
Вывод ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 47495
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 47495
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
errno
, это должно дать вам подсказку. Вызывает лиsampleScript
какие-либо фоновые процессы? в этом случае может произойти «слишком много процессов» - person Ingo Leonhardt   schedule 27.07.2013ulimit -a
. - person Philipp Claßen   schedule 27.07.2013while(!system(NULL)) { ... }
-- Если оболочка недоступна, вряд ли она станет доступной позже. - person Keith Thompson   schedule 28.07.2013