2013-07-27 2 views
2

Я пытаюсь написать простой код C, который выполняет сценарий оболочки для N итераций (где N больше 3000). Первоначально код работает отлично, но по мере увеличения количества итераций функция system() начинает возвращать -1. Кроме того, если я снова запустил всю программу, ошибка происходит точно в той же точке цикла.Ошибка вызова системы() внутри цикла C

Вот мой код:

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.

Обновление:

Когда система() возвращает -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 
+1

взгляд на 'errno', который должен дать вы намек. Вызывает ли 'sampleScript' какие-либо обратные процессы? «В этом случае может возникнуть« слишком много процессов » –

+1

В дополнение к рекомендациям Ingo, вывод' ulimit -a' также может быть полезен. –

+0

'while (! System (NULL)) {...}' - Если оболочка недоступна, она вряд ли станет доступна позже. –

ответ

0

я не получил вы выдаете, может быть, вы можете использовать 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 } 

 Смежные вопросы

  • Нет связанных вопросов^_^