2013-07-27 2 views
2

N 회 반복을위한 쉘 스크립트를 실행하는 간단한 C 코드를 작성하려고합니다 (N은 3000보다 큽니다). 처음에는 코드가 완벽하게 작동하는 것처럼 보이지만 반복 횟수가 증가하면 system() 함수가 -1을 반환하기 시작합니다. 또한 전체 프로그램을 다시 한 번 실행하면 오류가 루프의 정확히 동일한 지점에서 발생합니다. C 코드에 영향을주지 않습니다 쉘 스크립트의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; 
} 

출력 :

여기 내 코드입니다. 이 코드를 실행할 때, i = 2900 주위에서 system()이 -1을 반환하기 시작하고 이것이 왜 일어나는지 전혀 알 수 없습니다. 여기에 명백한 요점이 빠져 있습니까? 누군가 나를 도울 수 있습니까?

저는 64 비트 우분투에서 gcc를 사용합니다.

업데이트 :

시스템() -1을 반환, 해당 errno 값이 12 인 - 메모리를 할당 할 수 없습니다.

되는 ulimit -a의 출력은 내가 어쩌면 당신은 몇 가지 정보

내가 SUSE을 사용을 얻을 수 printf("system failed when i =%d\n",i);을 사용할 수 있습니다, 당신은 발행하지 않았다

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'는 backgound 프로세스를 호출합니까? '너무 많은 프로세스'가 발생할 수 있습니다. –

+1

Ingo의 권장 사항 외에도 'ulimit -a'의 출력이 유용 할 수 있습니다. –

+0

'while (! system (NULL)) {...}'- 쉘을 사용할 수 없으면 나중에 사용할 수 없을 것입니다. –

답변

0

입니다.

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 }