Attention, tous les exemples que vous voyez ci-dessous ont été fait sous Linux (le principe reste le même pour Windows).
Il existe 2 types de processus : les lourds et les légers (ces derniers sont appelés aussi Threads)
Processus lourds
Un processus lourd est caractérisé par un PID pour que le système l'identifie, un état et une appartenance à un utilisateur ou à un groupe.
A chaque fois qu'un processus crée, le PID est incrémenté de 1. Le premier processus possède le numéro 0.
Un processus lourd peut se présenter sous quatre différents états qui sont :
Actif (appelé aussi Elu) : Processus en cours d'exécution,, il exploite le processeur à cet instant
Exécutable : Candidat à l'éxécution , il attend que l'ordonnanceur le fasse devenir actif
Endormi : Ne fait rien, attend qu'une condition soit validée pour passer à l'état Exécutable
Zombie : Processus terminé mais qui n'a pas libéré correctement la mémoire allouée de l'ordinateur.
Deux systèmes de gestion des processus
Coopératif : Les processsus ont la possibilité de répondre à l'ordonnanceur quand ce dernier lui demande, ou continue à exécuter ses instructions
Préhentif : Chaque processus est contrôlé par l'ordonnanceur, ce qui rend le système plus stable et sûre en cas de plantage d'un processus.
Pour créer un processus enfant, on fait appel à la fonction fork(). Elle se contente de dupliquer l'espace de code, la pile et les données. Pour effecuter un recouvrement d'espace, on utilisera exec().
On identifiera les processus enfant et parent par leur PID en faisant soit getpid() renvoyant le PID courant, soit getppid() (pour get Parent PID) qui renvoi le PID du parent.
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char** argv){
if (fork()){ //processus parent
printf("PID processus parent : %d\n",getpid());
}
else { //processus enfant fork envoi une valeur égale de zéro
printf("PID processus enfant %d\n",getpid());
}
return 0;
}
Résultat :
PID processus enfant : 22450
PID processus parent 22449
Gestion de signaux
int action_signal () {
system("ipcs -q");
exit(EXIT_SUCCESS);
}
int main(int argc, char *argv[]){
signal(SIGINT, action_signal); // équivalent du Ctrl + C à la console
}