IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[C] Création de processus


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 73
    Par défaut [C] Création de processus
    Bonjour,

    Je voudrais que vous m'aidez d'écrire un Programme en C qui crée 4 fils F1,F2,F3 et F4. chaque fils a le même code (fonction void fils(...)) qui permet, entre autre, d’afficher le numéro du fils (1 a 4) ainsi que son PID. Le père affiche, quant a lui, un simple message a chaque création de fils puis un dernier message avant de terminer.

    1 ) Peut-on passer en paramètre la fonction fils le PID du fils ? Ecrire ce programme en le généralisant à n processus.

    2 ) Nous désirons ajouter dans la fonction fils une attente aléatoire de 1 à 10 secondes différente pour chacun des fils. Le fils indiquera le temps pendant lequel il va s’endormir et affichera un message lors de son réveil. Pour rappel, le code suivant permet d’initialiser le générateur de nombres aléatoires grâce à la commande time et d'endormir le programme pendant un temps aléatoire :
    double attente;
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    time_t t;
    time(&t);
    srand(t);
    attente = rand() * 10.0 / RAND_MAX;
    sleep(attente);

    voila mon code :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<sys/types.h>
     
    void fils(int);
    int main ()
    {
     
    int i;
    for (i=1; i<=4; i++) {
    if(fork()== 0) {
    printf ("creation du fils: ", i);
    fils(i);
    exit(0);
    }
    }
    printf ("Voila un dernier message \n" );
    return (0);
    }
    void fils (int i) {
    printf ("je suis le Fils nimero: %i mon PID est : %i \n", i, getpid());
    exit(0);
    }


    Cordialement

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Ce code doit faire ce que tu demandes néanmoins, pour je ne sais quel raison, rand() renvoi systématiquement la même valeur, est ce ma bécane qui déconne?

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <time.h>
    #define N 4
     
    static void fils (unsigned, long);
     
    int main (void)
    {    
        for (unsigned i = 1; i <= N; i++) 
        {
            long pid;
            switch (pid = fork())
            {
                case -1 : perror ("erreur creation du fils"); break;
                case  0 : fils (i, getpid()); return EXIT_SUCCESS;
                default : printf("PERE creation FILS n°%u / pid : %ld\n", 
                          i, pid); break;
            }
        }
        puts ("Voila un dernier message du pere");    
        return EXIT_SUCCESS;
    }
     
    static void fils (unsigned i, long pid) 
    { 
        srand ((unsigned)time (NULL));
        int attente = rand () * 10.0 / RAND_MAX;
        printf ("FILS n°%u / pid : %ld / ppid : %ld\n",
                i, pid, (long)getppid());
        printf ("FILS n°%u va s'endormir pdt %d sec\n", i, attente);
        sleep ((unsigned)attente);
        printf ("FILS n°%u se reveille\n", i);
    }

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    telle qu'ecrite, la division est entiere.....

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Oui mais je ne vois pas pourquoi ça me sort le même nombre pour les 4 tirages?
    Une idée souviron34?

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et c'est quoi ce nombre ??

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Le nombre est aléatoire, à chaque lancement de programme, mais est le même dans les N processus créés.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    telle qu'ecrite, la division est entiere.....
    Quelle division?

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/11/2014, 10h24
  2. problème de création de processus
    Par nedoura20doudi dans le forum Débuter
    Réponses: 1
    Dernier message: 28/11/2009, 16h08
  3. Echec lors de la création du processus pour initdb
    Par madfu dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 02/04/2008, 17h52
  4. Réponses: 6
    Dernier message: 20/12/2006, 08h55
  5. fork & création de processus
    Par seb__ dans le forum POSIX
    Réponses: 3
    Dernier message: 08/10/2006, 23h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo