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 cdsono funzioni di shell e di solito non eseguono il fork di un nuovo processo. type cmddi solito ti dirà se cmdè un comando esterno o una funzione di shell. type typeti 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 emacsfinestra viene uccisa, nonostante sia in esecuzione in background. Questo è il comportamento predefinito e nohupviene 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. nohuplo fa.
nohupfa. Quale parte hai confuso?