Home > C > Processes in C

Processes in C


Carissimi amici eccomi qua! Il mio portatile è defunto, ciao caro iBook..ti ho voluto bene!

Questo mi ha creato dei grossi problemi…infatti ho perso tutte le cosette che avevo salvato in quella deliziosa macchina…spero comunque di recuperare i dati in qualche modo!

Questo incoveniente mi permette tuttavia di scrivere un post sui processi in C, argomento totalmente nuovo per me, che mi sono stati introdotti nel corso di Distributed Systems in università.

Il primo esercizio da fare era il seguente:

Tramite i comandi messi a disposizione da C scrivere un programma che:

  • crei un nuovo thread
  • il nuovo thread (figlio) dorme per 4 secondi
  • il processo genitore aspetta finchè il figlio non finisce la propria esecuzione e mostra un messaggio

Il codice da me scritto è il seguente: (la spiegazione come al solito viene dopo!)🙂

//es1.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main() {
  pid_t pid; //type could have been int

  pid = fork();

  if (pid > 0) {
    sleep(4);
    exit(0);
  } else if (pid == 0) {
    wait();
    printf("Child terminated\n");
  } else {
    printf("Error in fork command\n");
    exit(1);
  }
}

Tale codice va compilato ed eseguito usando tali comandi:

bellerofonte@pegaso:~/Desktop$ gcc -o es1 es1.c
bellerofonte@pegaso:~/Desktop$ ./es1
Child has died

Il codice inizia includendo le 3 librerie che ci serviranno nel programma, esse vengono importate usando il comando #include.

Passiamo alla dichiarazione del main: si comincia dichiarando una variabile di tipo pid_t (che avrebbe potuto essere di tipo int), tale variabile servirà per rappresentare il Process Identifier dei vari processi, ovvero un numero personale che viene associato ad ogni processo e che lo identifica all’interno del sistema. A tale variabile viene in seguito assegnato il valore ottenuto dall’esecuzione del comando fork().

L’esecuzione di fork() può restituire diversi valori che vengono comunque inclusi in uno dei seguenti due casi:

  • 0 se il processo è un processo padre
  • un numero maggiore di 0 se il processo è un processo figlio

A simple fork

A questo punto come potete vedere usando un if-else o uno switch possiamo fare eseguire diversi codici a seconda che il processo risultante dal fork sia di tipo padre o figlio. Nel nostro esempio se il processo è di tipo figlio, esso “dorme” per 4 secondi utilizzando il comando sleep(Seconds) e poi termina la propria esecuzione; se il processo è invece di tipo padre usiamo il comando wait() che mette in pausa l’esecuzione finchè un processo figlio non termina la propria esecuzione. A tale istruzione potrebbe essere passato un PID come parametro….in tal caso il processo padre aspetta finchè non riceve un segnale dal processo identificato da tale PID che segnala la propria fine; Inoltre esso potrebbe ritornare un 127 se il PID passato non è associato a un processo esistente o 0 se non vi sono processi attivi oltre al padre.

Prossima volta (visto che non ho erlang sui PC della facoltà) vi mostrerò cosa sono le PIPE e i SEMAFORI in C.

Categories: C
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: