Prima di tutto, ogni volta che si esegue un comando, la shell eseguirà il fork di un nuovo processo, indipendentemente dal fatto che lo si esegua &
o meno. &
significa solo che lo stai eseguendo in background.
Nota che questo non è molto preciso. Alcuni comandi, come ad esempio cd
sono funzioni di shell e di solito non eseguono il fork di un nuovo processo. type cmd
di solito ti dirà se cmd
è un comando esterno o una funzione di shell. type type
ti dice che type
è di per sé una funzione di shell.
nohup
è qualcosa di diverso. Indica al nuovo processo di ignorare SIGHUP
. È il segnale inviato dal kernel quando la shell genitore è chiusa.
Per rispondere alla tua domanda, procedi come segue:
- esegui
emacs &
(per impostazione predefinita dovrebbe essere eseguito in una finestra X separata) .
- sulla shell padre, esegui
exit
.
Noterai che la emacs
finestra viene uccisa, nonostante sia in esecuzione in background. Questo è il comportamento predefinito e nohup
viene utilizzato proprio per modificarlo.
Eseguire un lavoro in background (con &
o bg
, scommetto che anche altre shell hanno anche altre sintassi) è una funzione di shell, derivante dalla capacità dei sistemi moderni di eseguire il multitasking. Invece di sborsare una nuova istanza di shell per ogni programma che si desidera avviare, gusci moderni ( bash
, zsh
, ksh
, ...) avranno la possibilità di gestire un elenco di programmi (o lavori ). Solo uno di questi alla volta può essere in primo piano , il che significa che ottiene il focus shell. Vorrei che qualcuno potesse ampliare maggiormente le differenze tra un processo in esecuzione in primo piano e uno in background (il principale è l'accesso a stdin
/ stdout
).
In ogni caso, ciò non influisce sul modo in cui il processo figlio reagisce SIGHUP
. nohup
lo fa.
nohup
fa. Quale parte hai confuso?