J'essaie d'écrire un code C simple qui exécute un script shell pour N itérations (où N est supérieur à 3000). Initialement, le code semble fonctionner parfaitement, mais à mesure que le nombre d'itérations augmente, la fonction system() commence à retourner -1. De plus, si je réexécute l'ensemble du programme, l'erreur se produit exactement au même point de la boucle.L'appel du système() dans une boucle C échoue
Voici mon code:
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;
}
La sortie du script shell ne modifie pas le code C. Quand j'exécute ce code, autour de i = 2900, system() commence à retourner -1 et je n'ai aucune idée de la raison pour laquelle cela arrive. Est-ce que je manque un point évident ici? Est-ce que quelqu'un peut m'aider? J'utilise gcc sur Ubuntu 64-bit.
Mise à jour:
Quand retourne système() -1, la valeur correspondante est errno
12 - ne peut pas allouer de la mémoire.
La sortie de -a ulimit est
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
regard sur 'errno', qui devrait donner vous un indice. Est-ce que 'sampleScript' appelle des processus backgound? 'trop de processus' pourrait survenir dans ce cas –
En plus des recommandations d'Ingo, la sortie de 'ulimit -a' pourrait aussi être utile. –
'while (! System (NULL)) {...}' - Si le shell n'est pas disponible, il ne sera probablement pas disponible plus tard. –