Perché ls
richiedono un processo separato per la sua esecuzione?
Conosco il motivo per cui comandi come cd
non può essere eseguito tramite il meccanismo di fork, ma c'è qualche danno se ls
viene eseguito senza fork?
Risposta accettata:
La risposta è più o meno quella ls
è un eseguibile esterno. Puoi vedere la sua posizione eseguendo type -p ls
.
Perché non è ls
integrato nel guscio, quindi? Bene, perché dovrebbe essere? Il compito di una shell non è comprendere tutti i comandi disponibili, ma fornire un ambiente in grado di eseguirli. Alcune shell moderne hanno echo
, printf
, e simili come builtin, che non tecnicamente devono essere incorporati, ma lo sono per motivi di prestazioni quando vengono eseguiti ripetutamente (principalmente in cicli stretti). Senza renderli integrati, la shell dovrebbe eseguire il fork ed eseguire un nuovo processo per ogni chiamata, il che potrebbe essere estremamente lento.
Per lo meno, eseguendo ls
, un eseguibile esterno, richiede l'esecuzione di una delle chiamate di sistema della famiglia exec. Potresti fallo senza biforcare, ma sostituirebbe la shell principale che stai utilizzando. Puoi vedere cosa succede in quell'istanza procedendo come segue:
exec ls; echo "this never gets printed"
Poiché l'immagine di processo della shell è stata sostituita, la shell corrente non è più accessibile dopo aver eseguito questa operazione. Affinché la shell possa continuare a funzionare dopo l'esecuzione di ls, il comando dovrebbe essere integrato nella shell.
Il fork consente la sostituzione di un processo che non è la tua shell principale, il che significa che puoi continuare a eseguire la tua shell in seguito.