System call per la gestione di processi
La funzione di sistema fork permette di duplicare il processo attivo, creando un processo figlio.
/* ** fork.c ** ** Esempio di utilizzo della funzione "fork". ** Il processo padre genera un figlio e dopo 10 secondi lo ** termina inviando il segnale SIGKILL. ** ** #(@)20150304(liverani@mat.uniroma3.it) */ #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main() { pid_t pid; int retcode; printf("inizio prova\n"); /* crea processo figlio */ pid = fork(); /* l'esecuzione del processo figlio inizia da questa istruzione */ if (pid != 0) /* programma eseguito da processo padre */ { printf("PID processo figlio= %d\n", (int)pid); printf("processo padre inizia attesa di 10 secondi\n"); sleep(10); printf("processo padre elimina processo figlio\n"); retcode = kill(pid, SIGKILL); printf("processo figlio terminato\n"); sleep(10); printf("ora termina anche il processo padre\n"); } else /* programma eseguito da processo figlio */ { printf("processo figlio inizia\n"); pid = getpid(); while (1) { printf("processo figlio %d lavora\n", (int)pid); sleep(1); } } exit(0); }
La funzione system è una delle system call che permettono di eseguire un programma da un processo in esecuzione: anche in questo caso si crea un rapporto padre-figlio tra il processo che richiama la funzione system e il processo che viene eseguito mediante tale chiamata; tuttavia il processo padre rimane in attesa che il processo figlio abbia terminato l'esecuzione, prima di proseguire con le istruzioni successive alla chiamata system.
/* ** uno.c ** ** Programma chiamante, che segue la funzione system. ** ** #(@)20150304(liverani@mat.uniroma3.it) */ #include <stdlib.h> #include <stdio.h> int main(void) { printf("Questo e` uno\n"); system("./due"); printf("Questo e` di nuovo uno.\n"); return(0); }
/* ** due.c ** ** Programma richiamato dal programma precedente. Il file ** eseguibile si deve chiamare "due" e deve trovarsi nella ** stessa directory del programma chiamante. ** ** #(@)20150304(liverani@mat.uniroma3.it) */ #include <stdlib.h> #include <stdio.h> int main(void) { printf("Questo e` due\n"); return(0); }