Quelles sont les conditions susceptibles d’entraîner l’échec des appels à fork () ou à system () sous Linux?

Et comment peut-on savoir si l’un d’entre eux se produit et provoquer une erreur renvoyée par fork () ou system ()? En d’autres termes, si fork () ou system () retourne avec une erreur, quelles sont les choses sous Linux que je peux vérifier pour diagnostiquer pourquoi cette erreur particulière se produit?

Par exemple:

  • Juste hors de la mémoire (résulte en errno ENOMEM) – vérifier l’utilisation de la mémoire avec ‘libre’ etc.
  • Mémoire insuffisante pour que le kernel puisse copier les tables de pages et autres informations comptables du processus parent (cela se traduit par errno EAGAIN)
  • Existe-t-il une limite globale de processus? (résultats dans errno EAGAIN également?)
  • Existe-t-il une limite de processus par utilisateur? Comment puis-je savoir ce que c’est?
  • …?

Et comment savoir si l’un d’entre eux se produit?

Vérifiez la valeur errno si le résultat (valeur de retour) est -1

Depuis la page de manuel sous Linux:

VALEUR DE RETOUR
En cas de succès, le PID du processus enfant est renvoyé dans le parent et 0 est renvoyé dans l’enfant. En cas d’échec, -1 est renvoyé dans le parent, aucun processus enfant n’est créé et errno contient le code d’erreur approprié.

LES ERREURS
EAGAIN
fork () ne peut pas allouer suffisamment de mémoire pour copier les tables de pages du parent et allouer une structure de tâches pour l’enfant.
EAGAIN
Il n’était pas possible de créer un nouveau processus car la limite de ressources RLIMIT_NPROC de l’appelant était rencontrée. Pour dépasser cette limite, le processus doit avoir la capacité CAP_SYS_ADMIN ou CAP_SYS_RESOURCE.
ENOMEM
fork () n’a pas réussi à allouer les structures de kernel nécessaires car la mémoire est restreinte.

CONFORMÉMENT À SVr4, 4.3BSD, POSIX.1-2001.

nproc dans /etc/security/limits.conf peut limiter le nombre de processus par utilisateur.

Vous pouvez vérifier l’échec en examinant le retour de la fourchette. Un 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 un nombre négatif signifie que le fork a échoué. Lorsque fork échoue, il définit la variable externe errno. Vous pouvez utiliser les fonctions dans errno.h pour l’examiner. Normalement, j’utilise perror pour imprimer l’erreur (avec du texte ajouté au préalable) à stderr.

#include  #include  #include  int main(int argc, char** argv) { pid_t pid; pid = fork(); if (pid == -1) { perror("Could not fork: "); return 1; } else if (pid == 0) { printf("in child\n"); return 0; }; printf("in parent, child is %d\n", pid); return 0; }