2017-08-08 4 views
1

Je suis relativement nouveau à la programmation linux. Je me demande si la fonction exec() appelée après fork() peut provoquer une perte de données dans le processus parent.Est-ce que exec() appelé après fork() cause la perte de données dans le processus existant

+0

Lequel? Vous avez deux processus après 'fork()'. –

+2

Cela causerait 0 perte de données dans le processus parent (sauf qu'ils pourraient continuer à partager des descripteurs de fichiers de sorte qu'une perte de données puisse survenir à moins qu'ils ne soient fermés dans l'enfant); et 100% de perte de données dans le processus de l'enfant si l'exec a réussi ...... –

+0

il y a une belle explication [ici] (https://stackoverflow.com/questions/1653340/differences-between-fork-and-exec) pour l'esprit confus –

Répondre

6

Après un appel réussi à fork, un nouveau processus est créé qui est un doublon du processus appelant. Une chose qui est dupliquée sont les descripteurs de fichiers, il est donc possible que le nouveau processus lise/écrive les mêmes descripteurs de fichier que le processus original. Il peut s'agir de fichiers, de sockets, de tuyaux, etc.

La fonction exec remplace le programme en cours d'exécution dans le processus en cours par un nouveau programme, en remplaçant la mémoire de l'ancien programme dans ce processus. Toutes les données stockées dans la mémoire de l'ancien programme sont donc perdues. Cela n'affecte cependant pas le processus parent qui a forké ce processus.

Lorsqu'un nouveau programme est exécuté par l'intermédiaire exec, les descripteurs de fichiers qui ne sont pas FD_CLOEXEC (close-on-exec) est défini (voir le fcntl man page) sont à nouveau conservés. Donc maintenant vous avez deux processus, chacun exécutant éventuellement un programme différent, qui peut écrire dans le même descripteur de fichier. Si cela se produit et que les processus ne se synchronisent pas correctement, les données écrites par un processus dans le fichier peuvent être écrasées par l'autre processus. Ainsi, des pertes de données peuvent survenir en ce qui concerne l'écriture dans les descripteurs de fichier que le processus fils a hérités du processus parent.

+1

* Lorsqu'un nouveau programme est exécuté via exec, les descripteurs de fichiers ouverts sont à nouveau préservés. * En général, c'est vrai. Mais les descripteurs de fichiers ouverts avec l'ensemble d'indicateurs ['FD_CLOEXEC' sont fermés sur les appels' exec * '] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/fcntl.h.html):" 'FD_CLOEXEC' Fermer le descripteur de fichier lors de l'exécution d'une fonction de famille * exec *. " –

+0

@AndrewHenle Merci d'avoir soulevé cette question. J'ai inclus ce détail dans la réponse. – dbush