Corso di Sistemi per l'elaborazione delle informazioni (IN530)

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

Università degli Studi Roma Tre - Dipartimento di Matematica e Fisica - Corso di laurea in Matematica - Corso di Sistemi per l'elaborazione delle informazioni (IN530)

Author: Marco Liverani - Last modified: Sunday February 09, 2020 - Document URI: https://www.mat.uniroma3.it/users/liverani/IN530/fork.shtml