Qu'advient-il si vous exécutez 'exec ls' dans votre coquille et pourquoi?
La question est dans le titre. Je ne pouvais pas comprendre pourquoi le terminal va s'arrêter immédiatement après " ls " est exécutée. Un shell Linux, c'est comme cela:
1.while (1) {
2. char *cmd = read_command();
3. int child_pid = fork();
4. si (child_pid == 0) {
5. exec(cmd);
6. }else {
7. waitpid(child_pid);
8. }
9.}
Donc, si nous courons 'exec ls" dans le shell, cmd est une chaîne de 'exec ls'. Un processus enfant est fourchue dans la ligne 3. Dans la ligne 5, exec(cmd) remplacera le processus de l'enfant, mais n'affectera pas le processus père. Si le processus père n'est pas affectée, pourquoi le terminal s'arrête alors?
Veuillez me montrer les failles dans mon raisonnement ci-dessus.
bash
, type help exec
.OriginalL'auteur zcb | 2013-01-28
Vous devez vous connecter pour publier un commentaire.
Si vous exécutez
ls
, votre processus de shell démarre un autre processus pour exécuter lels
programme, alors il va attendre qu'elle se termine. Quand il a fini, le contrôle est retourné à la coquille.Avec
exec ls
, vous avez réellement remplacer votre programme de shell dans le actuel processus avec lels
programme, de sorte que, quand il se termine, il n'y a pas de shell en attente pour elle.Le plus probable, vous aurez soit un programme de terminal ou
init
que le parent qui est ce qui va prendre le relais lors de votre processus s'arrête. C'est pourquoi votre shell disparaît, parce que vous avez dit explicitement qu'il.Voir cette réponse pour une explication de la
shell/ls
(non-exec) de la situation.Comme pour votre mise à jour, le shell ne pas toujours créer un processus distinct pour faire des trucs. Il existe un grand nombre de commandes internes (tels que
cd
oualias
) qui n'impliquent pas de faire d'autres processus (cela dépend de votre shell, bien sûr, mais, comme un exemple, vous pouvez voir l'bash
commandes internes en entrantman bash-builtins
à l'invite de commande).exec
est l'un de ces. Il remplace simplement le shell lui-même (c'est à dire, pas fourchue processus enfant) avec le programme que vous spécifiez. C'est pourquoi il ne fonctionne pas comme vous le pensez.consultez la mise à jour de réponse. Les coquilles ne sont pas toujours d'exécuter un processus enfant pour chaque commande. Des choses comme
exec
,cd
,alias
et ainsi de suite affecter le courant shell.exec
est une demande explicite de la coquille (dans courant processus) pour remplacer lui-même. Voirman bash-builtins
pour quelques exemples.Oh, je comprends enfin maintenant! Merci beaucoup!
OriginalL'auteur paxdiablo
Exec remplace le processus en cours avec un autre. Normalement, lorsque vous appelez "ls", un nouveau processus est créé, qui s'exécute en tant qu'enfant de votre coquille. "exec ls" remplace votre coque, avec "ls" du processus. Ainsi, dès que "ls" met fin à votre terminal se ferme.
En effet. exec est intégré dans la commande shell qui n'est pas à la fourche d'un nouveau processus, mais remplace lui-même.
OriginalL'auteur bikeshedder
exec
remplace le processus en cours d'exécution avec une nouvelle image de processus. Ainsi, dans le processus actuel, le shell que vous utilisez est remplacé par lels
image exécutable, et une foisls
sorties, le processus est arrêté.OriginalL'auteur radical7