Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1703 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Gestion des signaux/processus en C ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Gestion des signaux/processus en C ...

n°137507
404notfoun​d
Posté le 11-05-2002 à 14:37:46  profilanswer
 

J'ai eu un sujet d'interro sur ce thème :
Ecrire un programme qui réalise le traitement suivant :
 
-  Un processus père crée successivement 2 processus fils puis se met en attente de leur terminaison. Chaque fois qu?un processus fils se termine, le père affiche sur la sortie standard e PID et le mot d?état (statut ou numéro du signal) retourné par ce fils.
 
-  Le premier fils affiche sur la sortie standard son PID, puis se termine normalement par l?instruction « exit » en retournant un statut égal à 3.
 
-  Le second fils affiche sur la sortie standard son PID, puis se termine anormalement en tentant une écriture en mémoire à l?adresse pointée par NULL.
 
Le programme source sera codé dans le fichier proc1.c et le programme exécutable sera codé dans le fichier proc1.
 
Et voilà ce que j'ai réalisé, ce qui me semble tout à fait juste ... jvous dit pas combien de temps il m'a fallu pour faire ça ... j'ai honte .......
 
 
 
 
 
 
 
 
 
 
 
 
\\PROGRAMME SOURCE PROCESSUS/EXERCICE1/proc1.c:
 
 
 
 
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
 
 
 
int main ()
{
// déclaration des variables
pid_t pid;
pid_t pid2;
pid_t idProc;
int rapport;  
int numSig;  
int statut;
// déclaration du pointeur d?adresse
int * toto = NULL;
// création d?une copie du processus père grâce à fork()
// envoi du résultat de la fonction dans la variable pid
// la fonction retourne 0 dans le processus fils et le pid du fils dans le  
// processus père
pid = fork();
switch (pid)
    {
// si le contenu de pid =-1 il s?est produit une erreur
        case -1 :  
            printf("erreur\n" );
            exit(-1);
            break;
         
        case 0 :
// le fils 1 affiche son pid et retourne un statut égal à 3  
            printf("je suis le fils1 %d\n",getpid());
            exit(3);
            break;
             
        default :
// le père affiche le pid du fils et le sien
             printf("je suis le processus père, j ai crée le fils %d\n",pid);
             printf("et mon numéro de pid père est %d\n",getpid());
             
    }
     
 
 
 
 
 
 
 
 
 
// création d?un second processus fils
pid2 = fork();
 
// comme auparavant, analyse du contenu de la variable pid2 pour
// détecter le fils2 du père
switch (pid2)
    {
        case -1 :  
            printf("erreur\n" );
            exit(-2);
            break;
         
        case 0 :
// le fils2 affiche son pid et se termine anormalement en tentant d?écrire 10
// dans une adresse égale à NULL
            printf("je suis le fils2 %d\n",getpid());
            * toto = 10;
            exit(4);
            break;
        default :
             printf("je suis toujours le processus père, j ai crée le fils %d\n",pid2);
             printf("et mon numéro de pid père est toujours %d\n",getpid());
 
    }
 
// wait() va nous permettre de suspendre l?exécution du père en attendant qu?un  
// de ces fils se termine, cette fonction retournera 0 si le fils s?est terminé // correctement et un signal sinon
idProc = wait(&rapport);
// Tant que les processus fils n?ont pas étés détruits on traite le signal  
// envoyé par les fils
while (idProc != -1)
{
    numSig = rapport % 128;
    switch (numSig)
    {    
// cas probable du fils1
        case 0: /*fin normale*/
            statut=(rapport % 65536)/256;
            printf("fin normale \n" );
            break;
// cas probable du fils2
        default: /*fin anormale*/
            printf("fin anormale \n" );
            break;
    }
    idProc=wait(&rapport);
}
}
 
 
 
Donc à priori ça marche .... seul pb , je dois modifier ce programme pour un TP(j'imagine le remanier à fond) pour réaliser un algo en C qui permette lors d'une déconnexion du shell d'envoyer à tous les procesus ayant l'utilisateur comme propriétaire effectif le signal SIGTERM, puis il attend qu'il se terminent tous avant de se terminer lui-même ....
Avec juste un polycop de C et quleques algos, je vois pas trop comment je peux faire ça ....
Je ne vous demande PAS de me faire le soft, j'aimerais juste savoir vers quelle solution m'orienter, en gros un algo général en français m'aiderait énormément.
Merci à tous d'avance.

 

[jfdsdjhfuetppo]--Message édité par 404notfound le 11-05-2002 à 14:41:08--[/jfdsdjhfuetppo]

mood
Publicité
Posté le 11-05-2002 à 14:37:46  profilanswer
 

n°137745
apolon34
Vive Linux!!
Posté le 12-05-2002 à 02:38:20  profilanswer
 

moi je dirais
 
lancement du (pseudo) shell
 
->demarrage de processus, tu stockes les pid
 
si tu quittes, tu envoie un sigterm au premier pid, tu atends sa reponse et ainsi de suite jusqu'a ce qu'il y en ait plus
 
 
je suis pas specialiste des processus alors si quelqu'un a une autre idee, qu'il le fasse savoir
 
sinon je pense pas que ca soit une bonne idee de stopper tous les process de l'utilisateur, il peut avoir envie de les laisser tourner avec nohup par exemple et de se deconnecter pour aller pisser (attitude du mec responsable!)

n°137931
404notfoun​d
Posté le 12-05-2002 à 19:56:12  profilanswer
 

Merci , déjà ça me fait partir sur de bonnes bases!!!!!
et à partir du pgid , c'est jouable aussi non ???

n°138027
apolon34
Vive Linux!!
Posté le 13-05-2002 à 02:43:34  profilanswer
 

la tu m'en demandes deja trop.....(newb en programmation)

n°138448
404notfoun​d
Posté le 13-05-2002 à 23:35:37  profilanswer
 

Merci c'est déjà bcp ! :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Gestion des signaux/processus en C ...

 

Sujets relatifs
Recherche exemple de programme de gestion de carte E/S[ DreamweaverMX ] Mauvaise gestion du PHP??
Gestion du bufferGestion de bases XML en Java : quels tools a utiliser ?.
Gestion de transparence sous delphi[ASP] gestion des login et mots de passe
Gestion de données en Visual BasicORACLE gestion des utilisateurs
[C] Question gestion du tempsGestion du niveau sonore sur l'entrée line in (microphone)
Plus de sujets relatifs à : Gestion des signaux/processus en C ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR