Risposte:
Il motivo è che Unix non blocca un file eseguibile mentre viene eseguito o anche se gli piace Linux, questo blocco si applica all'inode, non al nome del file. Ciò significa che un processo che lo tiene aperto sta accedendo agli stessi (vecchi) dati anche dopo che il file è stato eliminato (in realtà non collegato) e sostituito da uno nuovo con lo stesso nome che è essenzialmente ciò che fa un aggiornamento del pacchetto.
Questa è una delle principali differenze tra Unix e Windows. Quest'ultimo non è in grado di aggiornare un file bloccato poiché manca un livello tra nomi file e inode, il che rende una seccatura maggiore aggiornare o addirittura installare alcuni pacchetti poiché di solito richiede un riavvio completo.
Gli eseguibili vengono generalmente aperti una volta, collegati a un descrittore di file e non hanno un descrittore di file al loro binario riaperto durante un singolo periodo di esecuzione. Ad esempio, se si esegue bash
, in exec()
genere viene creato un descrittore di file per l'inode a cui fa riferimento /bin/bash
una sola volta alla chiamata.
Questo spesso significa che per i semplici binari che non tentano di rileggersi durante l'esecuzione (usando il percorso con cui sono stati invocati), il contenuto memorizzato nella cache rimane valido come inode pendente. Ciò significa che esiste essenzialmente una replica della versione precedente dell'eseguibile.
In casi più complessi, ciò può causare problemi. Ad esempio, un file di configurazione può essere aggiornato e successivamente riletto, oppure il programma può rieseguirsi tramite il percorso da cui è stato eseguito. Ci possono anche essere problemi se i programmi sono interconnessi e uno viene eseguito prima dell'aggiornamento e uno dopo (possibilmente dal primo programma). Questo vale anche per alcune librerie.
Per casi d'uso semplici, tuttavia, è sicuro eseguire l'aggiornamento senza riavviare il processo.
bash
binario è di circa 200 pagine 4K, non sono sicuro che siano tutte utilizzate in una sessione media.
ialloc()
di una struttura del kernel in lettura, non della mappatura della memoria delle pagine stesse. Non ho ragione nel pensare che sui moderni filesystem ext *, l'inode sia infine coerente nel kernel (e all'interno del sottosistema VM)?