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);
}