Exercice 1 : Visualisation de processus
Solution :
- La commande
pspermet d'afficher la liste des processus en cours d'exécution au moment où elle est exécutée.C'est pourquoi les processus utilisateurbash(l'interpréteur de commandes du terminal) etps(la commande elle-même)apparaissent dans la liste. En revanche, les processusfirefoxetgeditne s'affichent pas car ils ne sont pas des processus utilisateur,mais des processus système. Pour lister tous les processus, utilisez les commandesps -eoups -ef.La colonneUID(User ID) indique l'identifiant de l'utilisateur ayant lancé le processus. - La fenêtre du navigateur
firefoxse ferme normalement. La fenêtre du terminal se ferme également car elle correspond à l'interpréteurbashqui vient d'être tué. - Il n'est pas possible d'exécuter d'autres commandes tant que
firefoxest lancé en avant-plan.L'appui surCTRL-Cferme la fenêtrefirefoxen affichant un message indiquant que le processus a été interrompu.
Exercice 2 : La fonction fork()
Solution :
Consultez la correction détaillée de ce sujet dans le document fourni.
Exercice 3 : La fonction execl()
Solution :
#include <stdio.h>int main(int argc, char * argv[]) {if(argc != 2) printf("usage: affichez message\n");else printf("%s\n", argv[1]);return 0;}#include <unistd.h> /* Nécessaire pour les fonctions exec */#include <sys/types.h> /* Nécessaire pour la fonction fork */#include <stdio.h> /* Nécessaire pour la fonction perror */int main() {pid_t pid;if ((pid = fork()) == 0) {execl("/comptes/queudet-f/affichez", "affichez", "salut", (char *)0);perror("execl error");} else if (pid == 0) {perror("fork error");}return 0;}
Exercice 4 : La fonction kill()
Solution :
#include <stdio.h>#include <unistd.h>#include <signal.h>int main() {int i = 0;int pidfils = fork();if(pidfils != 0) {sleep(10);kill(pidfils, SIGKILL);} else {while(1) {sleep(1);i++;printf("%d\n", i);}}return 0;}Exercice 5 : La fonction wait()
Solution :
#include <unistd.h> /* Nécessaire pour les fonctions exec */#include <sys/types.h> /* Nécessaire pour la fonction fork */#include <stdio.h> /* Nécessaire pour la fonction perror */int main(int argc, char * argv[]) {pid_t pid1, pid2, pid_premier;int status;switch(pid1 = fork()) {case -1:perror("fork error");break;case 0:execlp("ls", "ls", (char *)0);break;default:switch(pid2 = fork()) {case -1:perror("fork error");break;case 0:execlp("ps", "ps", (char *)0);break;default:break;}break;}pid_premier = wait(&status);wait(&status);if (pid_premier == pid1) {printf("Premier processus terminé : %d\n", pid1);} else {printf("Premier processus terminé : %d\n", pid2);}return 0;}Questions fréquentes (FAQ)
Qu'est-ce que le parallélisme dans les processus ?
Le parallélisme des processus désigne la capacité d'un système à exécuter plusieurs processus simultanément, en utilisant plusieurs cœurs de processeurou en alternant rapidement entre eux. Cela permet d'améliorer les performances et d'exécuter plusieurs tâches en même temps.
Comment utiliser la fonction wait() ?
La fonction wait() est utilisée pour suspendre l'exécution d'un processus parent jusqu'à ce qu'un de ses processus enfants se termine.Elle permet de récupérer le statut de sortie du processus enfant et son PID (Process ID).
Quelle est la différence entre execl et execlp ?
execl exécute un programme dont le chemin est donné explicitement, tandis que execlp recherche le programme dans les répertoiresspécifiés dans la variable d'environnement PATH. Cela simplifie l'utilisation lorsque le chemin exact du programme n'est pas connu.