Processi
In ambienti UNIX il processo radice generatore è Init.
PID (Process Identifier) = 1.
Genera un sottoalbero di processi denominato processi del SO:
Esempio: coordina stampante (spooler di stampa).
Getty, processi legati al terminale. Sono dei processi “dormienti” perché se nessuno fa nulla non si attivano.
Quando si attiva, si avvia il programma di login si attribuiscono le giuste autorizzazioni.
Serve il programma interprete programmi.
A sua volta genera un processo figlio con l’interprete comandi shell.
L’interprete programmi quando riceve un comando genera un altro processo e chiede di eseguire un programma (copy, mov ecc). Alla terminazione del processo muore.
Processo:
PID: serve per identificare in modo univoco un processo.
Si creano 3 parti logiche:
Segmento codice: contiene l’eseguibile del nostro programma inteso come istruzioni. Solo le istruzioni eseguibili. Program Counter seguirà il programma un’intruzione alla volta.
Segmento dat: contiene tutte le tipologie di dati. Dati globali, dati locali dei sottoprogrammi (stack), area dati dinamica (heap).
Segmento di sistema: serve per la gestione sincrona o asincrona del programma con altri processi. L’area è gestita dal sistema operativo. Contiene la tabella dei file aperti.
Quando si crea un processo figlio, quest’ultimo assume una copia identica al padre di entrambe le 3 parti logiche.
Manualetto per i processi:
Include:
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
pid_t fork():
Crea un nuovo processo chiamato “processo figlio”. Effettua un clone del padre ossia copia le stesse parti del programma (Segmento codice, segmento dati, segmento di sistema).
Nel processo padre la funzione fork() restituisce un valore diverso da 0; normalmente tale valore indica il pid del figlio appena generato, tranne -1, che indica un errore e quindi che la fork() non è stata eseguita.
Nel processo figlio la funzione fork() restituisce il valore 0.
pid_t getpid():
Restituisce al processo che la invoca il valore del suo pid.
pid_t getppid():
Restituisce al processo che la invoca il valore del pid del processo padre.
pid_t wait(int *):
La funzione wait sospende l’esecuzione del processo che la esegue ed attende la terminazione di un qualsiasi processo figlio.
pid = wait(&stato).
1
Dopo l’esecuzione la variabile pid assume il valore del pid del figlio terminato.
La variabile stato assume il valore del codice di terminazione del processo figlio. Dato che il valore restituito dalla exit(valore) è contenuto negli 8 bit superiori, lo stato ricevuto dalla wait() è lo stato della exit() diviso per 256.
pid_t waitpid(pid_t pid, int *status, int options):
La funzione waitpid sospende l’esecuzione del processo che la esegue ed attende la terminazione del processo figlio specificato dal pid.
Il pid può assumere i seguenti valori:
< -1: La funzione attende ciascun figlio avente il pid uguale al valore assoluto del pid.
-1: La funzione attende qualsiasi figlio, analogamente alla funzione wait.
0: La funzione attende ciascun figlio avente il pid uguale a quello del processo corrente.
> 0: La funzione attende il figlio con pid corrispondente al valore del pid.
void exit(int):
Termina il processo corrente e si ha la possibilità di passare un valore tramite l’argomento di tipo intero. Tale valore verrà passato al processo padre.
int execl (char *path_e_nome_programma, char *arg0, char *arg1, ...NULL ):
Il parametro path_e_nome_programma è una stringa che deve contenere l’identificazione completa (con tutto il pathname, relativo o assoluto) di un file eseguibile contenente il nuovo programma da lanciare in esecuzione.
Il parametro arg0 è il nome del programma.
I parametri arg1, arg2, ecc... sono puntatori a stringhe che verranno passate al main del nuovo programma lanciato in esecuzione.
L’ultimo parametro passato deve essere NULL per indicare la fine dei parametri.
In caso di errore viene restituito il valore -1.
int main(int argc, char * argv[ ]):
Il parametro argc è un intero che indica il numero di parametri ricevuti su linea di comando contenuti in argv[].
Il parametro argv[] è un vettore di puntatori a stringhe contenente i valori passati su linea di comando.
Area SO:
Tabella globale dei file aperti: tiene traccia di tutti i file aperti con fopen().
2