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
看看'errno',應該給你提示。 'sampleScript'是否調用任何背景流程?在這種情況下可能會出現「過多的進程」 –
除了Ingo的建議外,'ulimit -a'的輸出也可能有用。 –
'while(!system(NULL)){...}' - 如果shell不可用,它不可能稍後可用。 –