Quelles sont les conditions qui peuvent provoquer fork() ou system() appelle à échouer sur Linux?
Et comment peut-on savoir si l'un d'eux se produisent, et conduisant à une erreur renvoyé par fork() ou system()? En d'autres termes, si la fourche() ou system() retourne un code d'erreur, ce sont quelques choses dans Linux que je peux vérifier à diagnostiquer la raison de cette erreur est-il passé?
Par exemple:
- Tout simplement de la mémoire (les résultats dans errno ENOMEM) - vérifier l'utilisation de la mémoire avec "libre", etc.
- Pas assez de mémoire pour le noyau d'une copie de la page des tableaux et d'autres informations comptables des processus parent (résultats dans errno EAGAIN)
- Est-il un processus global de limite? les résultats sont présentés dans errno EAGAIN aussi?)
- Est-il par utilisateur nombre maximum de processus? Comment puis-je savoir ce que c'est?
- ...?
Pour préciser, quand on sait qu'une erreur EAGAIN a eu lieu au cours de fork() (errno == EAGAIN), comment pouvez-vous savoir précisément ce qui a causé il (était-il RLIMIT_NPROC? Était-ce une erreur lors de la copie de la page de tableaux, ou de la tâche scructure, et si oui, pourquoi? Et comment l'éviter?)
J'ai aussi demandé à un autre, mais une question relative à la page " a propos des tables dans Linux: stackoverflow.com/questions/853736/...
J'ai aussi demandé à un autre, mais une question relative à la page " a propos des tables dans Linux: stackoverflow.com/questions/853736/...
OriginalL'auteur Reed Hedges | 2009-05-12
Vous devez vous connecter pour publier un commentaire.
Vérifier la errno valeur si le résultat (valeur de retour) est de -1
À partir de la page de man sur Linux:
Owens C'est ce que j'ai dit. "Vérifiez la valeur de errno SI le résultat est -1".
Ah, j'ai analysé comme vérifier la errno pour -1, désolé.
Désolé, je n'était pas clair dans mon commentaire d'origine. Je sais tout sur les codes d'erreur (oui, j'ai lu la page de man avant de poster sur stackoverflow! :), ce que je cherche est des façons de trouver des conditions dans le système à l'origine de ces erreurs. (Remarque, pour l'une, qu'il y a au moins deux conditions de fork() définit EAGAIN.)
Couvertures je suppose que vous pourriez vérifier si le processus de limite a été épuisé et en déduire que si EAGAIN a été définie en raison de la limite ou non.
OriginalL'auteur lothar
nproc dans /etc/security/limits.conf pouvez limiter le nombre de processus par utilisateur.
Vous pouvez vérifier l'échec en examinant le retour de la fourche. 0 signifie que vous êtes dans l'enfant, un nombre positif est le pid de l'enfant, et signifie que vous êtes dans le parent, et d'un nombre négatif signifie que la fourche a échoué. Lorsque la fourche d'échec, il définit la variable externe errno. Vous pouvez utiliser les fonctions dans errno.h pour l'examiner. J'ai l'habitude de simplement utiliser perror pour imprimer le message d'erreur (avec un peu de texte ajouté) vers stderr.
OriginalL'auteur Chas. Owens