Title: Sistemi Operativi / 02 - Pratica / 99 - Linguaggio C

Struttura del compilatore C

Q: ## avvio di un programma
A: Ogni programma viene fatto partire dalla funzione _start che nella maggior parte dei casi fa partire la funzione main.
Quando un programma viene eseguito ha un suo spazio di indirizzi e veiene eseguito in maniera indipendente dagli altri.
ld-linux è il programma che carica le librerie condivise (a meno di non aver utilizzato la flag --static) e le linka al file, poi nello standard ISO C la prima funzione che viene eseguita è
int main(int argc,char * argv[]) ; // funzione standard

Q: Chiudere un programma
A: ```c
void exit(int status);
void _exit(int status);
```
in entrambe le funzioni lo status è il valore con il quale viene terminato il programma può essere da 0 a 255, i due più importanti sono 0 (in caso di uscita senza problemi), 1 (in caso di uscita con errori)
_exit chiama direttamente la systemcall e termina immediatamente il programma.
exit chiama _exit, ma prima salva i buffer, eventualemnte chiama le funzioni atexit e on_exit che servono per eseguire del codice prima che il programma finisca

Q: Processi Su linux
A: Ogni processo viene avviato da un parent ( tranne l'init che è padre di tutti i processi), il kernel tiene una tabella con tutti i processi ognuno dei quali è memorizzato in task_struct (che tra i dati più importanti ha):
- file_struct: contiene tutti i file descriptor
- uid,pid,
- fs_struct : la home etc

Identificatori dei processi

Q: fork
A: può fallire se ci sono troppi processi nel sistema ( fork bomb )  o  se un utente ha ecceduto il numero di processi che può creare.
la funzione fork duplica nei processi figli tutti i file descritpro aperti nel processo padre, così condivide le voci nella file table.
altre voci uguali tra il padre e il figlio sono:

Q: Uscita dei processi figli
A: Si noti la distinzione fra exit status e termination status: quello che contraddistingue lo stato di chiusura del processo e viene riportato attraverso le funzioni wait o waitpid
processi che sono terminati, ma il cui stato di terminazione non `e stato ancora ricevuto dal padre sono chiamati zombie.
Si tenga presente infine che siccome gli zombie sono processi gi`a usciti, non c’`e modo di eliminarli con il comando kill; l’unica possibilit`a di cancellarli dalla tabella dei processi `e quella di terminare il processo che li ha generati, in modo che init possa adottarli e provvedere a concluderne la terminazione.