2013-07-27 165 views
2

我正在嘗試編寫一個簡單的C代碼,它執行N次迭代的shell腳本(其中N大於3000)。最初,代碼看起來工作得很好,但隨着迭代次數的增加,system()函數開始返回-1。另外,如果我再次運行整個程序,則錯誤發生在循環中完全相同的位置。在C循環中調用system()失敗

這裏是我的代碼:

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; 
} 

shell腳本不影響C代碼的輸出。當我執行這段代碼時,在i = 2900左右,system()開始返回-1,我完全不知道爲什麼會發生這種情況。我在這裏錯過了一個明顯的觀點嗎?有人可以幫我嗎?

我在64位Ubuntu上使用gcc。

更新:

當系統()返回-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)){...}' - 如果shell不可用,它不可能稍後可用。 –

回答

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 }