Вызов system() внутри цикла C не работает

Я пытаюсь написать простой код 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

person user2625068    schedule 27.07.2013    source источник
comment
посмотрите на errno, это должно дать вам подсказку. Вызывает ли sampleScript какие-либо фоновые процессы? в этом случае может произойти «слишком много процессов»   -  person Ingo Leonhardt    schedule 27.07.2013
comment
В дополнение к рекомендациям Инго также могут быть полезны выходные данные ulimit -a.   -  person Philipp Claßen    schedule 27.07.2013
comment
while(!system(NULL)) { ... } -- Если оболочка недоступна, вряд ли она станет доступной позже.   -  person Keith Thompson    schedule 28.07.2013


Ответы (1)


Я не понял вас, может быть, вы можете использовать printf("system failed when i =%d\n",i);, чтобы получить некоторую информацию

Я использую SUSE.

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) 7464
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) 7464
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Вот мой код (проблема в том, что ошибка не печатается, теперь N равно 10000!):

 2 #define N 10000

  3 int main(void)
  4 {
  5     char command[] = "cd";
  6     int i, ret;
  7 
  8     for(i=0;i<N;i++){
  9 
 10        /* Open 'sampleScript', make the required modifications and close it */
 11 
 12        while(!system(NULL)){
 13           printf("Shell is unavailable");
 14          // sleep(2);
 15        }
 16        ret = system(command);
 17        if(ret == -1){
 18           printf("System failed\n");
 19           exit(1);
 20        }
 21     }
 22     return 0;
 23 }
person Lidong Guo    schedule 27.07.2013