/* Programme 1 */ int main() { main(); }
/* Programme 2 */ int main() { while (1) fork(); }
/* Programme 3 */ int main(int argc,char *argv[]) { execvp(argv[0],argv); }Décrivez le comportement de chacun de ces programmes.
/* Programme p1.c */ void ma_fonction(int signal_recu) { printf("J'ai bien recu le signal %d\n",signal_recu); } int main(int argc,char *argv[]) { struct sigaction action; pid_t pid; int retour; action.sa_handler = ma_fonction; sigemptyset(&(action.sa_mask)); action.sa_flags = 0; sigaction(SIGUSR1,&action,NULL); switch (pid=fork()) { case -1: fprintf(stderr,"Rate\n"); exit(EXIT_FAILURE); case 0: execlp("p2","p2",NULL); fprintf(stderr,"Fils rate\n"); exit(EXIT_FAILURE); default: kill(getpid(),SIGUSR1); kill(pid,SIGUSR1); wait(&retour); } if (WIFEXITED(retour)) { printf("Le fils a pour code de retour %d\n",WEXITSTATUS(retour)); } else if (WIFSIGNALED(retour)) { printf("Le fils est mort apres avoir recu %d\n",WTERMSIG(retour)); } else { printf("Le fils a ete suspendu apres avoir recu %d\n",WSTOPSIG(retour)); } exit(EXIT_SUCCESS); }
/* Programme p2.c */ #include <stdlib.h> #include <stdio.h> void ma_fonction(int signal_recu) { printf("J'ai bien recu le signal %d\n",signal_recu); exit(EXIT_SUCCESS); } int main(int argc,char *argv[]) { while (1) pause(); exit(EXIT_SUCCESS); }Le lancement de la commande p1 produit un résultat commençant par :
J'ai bien recu le signal 16
NAME popen, pclose - créé un tube sur une commande shell SYNOPSIS #include <stdio.h> FILE *popen(const char *command, const char *type); int pclose (FILE *stream); DESCRIPTION La fonction popen() créé un tube anonyme entre le processus appelant et la commande à exécuter. << command >> est une ligne de commande shell. << type >> est le mode d'entrée/sortie à utiliser, ses valeurs sont r pour lire ou w pour écrire. La valeur renvoyée est un pointeur sur un flux représentant l'entrée standard de la commande (si le mode est w), ou représentant la sortie standard de la commande (si le mode est r). La commande est invoquée par l'intermédiaire d'un shell (bourne ou korn) en utilisant l'option suivante : <shell> -c <ligne_de_commande> Exemple : /bin/sh -c "ls *.c" D'autre part, le flux ouvert par popen() doit être fermé par pclose(), qui ferme le tube, attends que le processus associé termine et renvoie le code de retour de l'interpréteur de commande.
Cette mémoire de taille (LONGMAXTUBE) sera << circulaire >> comme le suggère le dessin ci-dessous :