J'apprends les commandes fork () et exec (). Il semble que fork () et exec () soient généralement appelés ensemble. (fork () crée un nouveau processus enfant et exec () remplace l'image de processus actuelle par une nouvelle.) Cependant, dans quels scénarios pourriez-vous appeler chaque fonction seule? Existe-t-il des scénarios comme ceux-ci?
system-calls
exec
fork
quil
la source
la source
Réponses:
Sûr! Un modèle courant dans les programmes "wrapper" est de faire diverses choses et de se remplacer ensuite par un autre programme avec seulement un
exec
appel (pas de fork)Un exemple réel de ceci est
GIT_SSH
(biengit(1)
qu'il offre égalementGIT_SSH_COMMAND
si vous ne voulez pas faire la méthode de programme wrapper ci-dessus).Fork-only est utilisé lors de la génération d'un tas de processus typiquement ouvriers (par exemple Apache
httpd
en mode fork (bien que fork-only convienne mieux aux processus qui ont besoin de brûler le CPU et non à ceux qui tournent les pouces en attendant que les E / S réseau se produisent) ) ou pour la séparation de privilèges utilisée parsshd
et d'autres programmes sur OpenBSD (pas d'exéc)Le
root
sshd a sur la connexion cliente dérivé une copie de lui-même (28571) puis une autre copie (14625) pour la séparation des privilèges.la source
Il y a plein.
Les programmes qui appellent
fork()
sansexec()
suivent généralement un schéma de processus de génération d'enfants travailleurs pour effectuer diverses tâches dans des processus distincts du processus principal. Vous trouverez dans des programmes aussi variés quedhclient
,php-fpm
eturxvtd
.Un programme qui appelle
exec()
sansfork()
est le chargement en chaîne , superposant son processus avec une image de programme différente. Il existe toute une sous-culture d'utilitaires de chargement de chaîne qui font des choses particulières pour traiter l'état, puis exécutent un autre programme pour s'exécuter avec cet état de processus révisé. De tels utilitaires sont courants dans la famille de jeux d'outils de gestion de systèmes et de services daemontools, mais ne sont pas limités à ceux-ci. Quelques exemples:chpst
de Gerrit Pape's runits6-softlimit
ets6-envdir
du s6 de Laurent Bercotlocal-reaper
etmove-to-control-group
de ma trousse à outilsrdprio
etidprio
sur FreeBSDnumactl
sur FreeBSD et LinuxLes boîtes à outils de la famille daemontools ont beaucoup de ces outils, de
machineenv
parfind-matching-jvm
àruntool
.la source
En plus d'autres réponses, les débogueurs utilisant utilisent
ptrace
généralement l'écart entrefork
etexec
. Un débogueur doit se marquer avecPTRACE_TRACEME
pour indiquer qu'il est tracé par son processus parent - le débogueur. Il s'agit de donner les autorisations requises au débogueur.Ainsi, un débogueur se bifurquerait d'abord. L'enfant appelait
ptrace
avecPTRACE_TRACEME
puis appelaitexec
. Quel que soit le programme, les enfants exécutables seront désormais traçables par le parent.la source
exec sans fourche
Il y a au moins deux raisons pour lesquelles vous voudriez faire une telle chose:
fourche sans exec
C'est ce que fait chaque démon à chaque démarrage (deux fois, en effet). Cela fait plusieurs choses, parmi lesquelles le shell ne se bloque pas (puisque le processus d'origine sur lequel le shell attend se termine) et le démon n'est plus contrôlé par le terminal, donc la fermeture de la fenêtre du shell ne tue pas le démon.
Une autre utilisation courante est le fait de bifurquer les enfants travailleurs, qui a été rendu célèbre par le serveur Web Apache il y a environ 25 ans (de nos jours, cela n'est plus considéré comme étant à la pointe de la technologie en raison de sa prédisposition au problème du troupeau tonitruant, mais il fournit certainement la serveur le plus simple et le plus robuste possible).
Pourtant, une autre utilisation courante consiste à créer un instantané cohérent.
fork
crée non seulement un processus, mais copie également (en théorie, il ne marque que les pages copiées sur écriture) l'espace d'adressage. Cela (atomiquement) crée un instantané des données complètes du programme que le parent ne peut plus modifier.Certains programmes en profitent. Par exemple, redis enregistre les données sur le disque (dans un état cohérent) tout en modifiant simultanément l'ensemble de données. Cela ne fonctionne que parce
fork
que vous avez créé un instantané cohérent qui ne voit pas les modifications apportées par le processus parent.la source