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

C Discussion :

Ordonnancement Unix en langage C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut Ordonnancement Unix en langage C
    Bonjour à tous,

    Avant tout j'espère être dans la bonne catégorie.

    J'ai un problème que je n'arrive pas à résoudre. Le but est de se mettre dans un mode d'ordonnancement (dans mon cas le FIFO) et de prouver que je suis bien dans ce mode.

    Si je suis en FIFO et que je crée 2 processus par exemple, celui qui prendra la main en premier s'exécutera et le deuxième ne pourra s'exécuter si seulement si le premier a fini de s'exécuter. J'ai donc réaliser le code suivant :

    Code : 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sched.h>
    #include <sys/types.h>
    #include <unistd.h>
     
    void main (void)
    {
        int valeur;
        struct sched_param p1;
        sched_setscheduler(getpid(),SCHED_FIFO,&p1);
        valeur = fork();
        if(valeur==0){ //fils
            printf("Je suis le fils\n");
            getchar();
            exit(1);
        }
        else{ //pere
            printf("Je suis le pere\n");
            getchar();
     
        }
    }
    En gros, le deuxième processus doit s'exécuter si j'appuie sur une touche (getchar()) car c'est à cette condition que le premier se termine. Si le fils s'exécute en premier et que je suis bien en FIFO, je dois avoir ceci:

    je suis le fils

    (appui sur une touche)

    je suis le pere

    Or ce n'est pas le cas , les deux process effectuent leurs printf sans que j'appuie sur une touche (je ne suis donc pas en FIFO).

    Quelqu'un sait-il pourquoi ?
    Je devais effectuer la même chose en Round Robin et cela fonctionne mais en FIFO je ne sais pas pourquoi cela ne fonctionne pas.

    Par avance merci.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Par défaut
    Bonjour,
    d'après le man :
    A SCHED_FIFO process runs until either it is blocked by an I/O request, it is preempted by a higher priority process, or it calls sched_yield(2).
    Comme ton appel à getchar() est une demande d'entrée/sortie, ton processus père passe la main.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut
    Bonjour,

    Merci de la réponse, je me suis donc fait une tempo "maison" pour être sûr que mon process père ne donne pas la main et j'ai toujours le même problème.

    Code : 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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sched.h>
    #include <sys/types.h>
    #include <unistd.h>
     
    void main (void)
    {
    	int valeur,etat;
    	unsigned long int i,j;
    	struct sched_param p1;
    	sched_setscheduler(getpid(),SCHED_FIFO,&p1);
    	valeur = fork();
        if(valeur==0){ //fils
     
    		printf("Je suis le fils\n");
    		exit(1);
        }
        else{ //pere
    		for(i=0;i<500;i++) {
    			for(j=0;j<4000000;j++){
     
    			}
    		}
    		printf("Je suis le pere\n");
     
        }
    }

  4. #4
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    L'appel à sched_setscheduler(getpid(),SCHED_FIFO,&p1) échoue puisque p1 n'est pas initialisée...

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut
    Je ne sais pas trop comment initialiser p1.
    Je pensais également que lorsque j'étais en Round Robin cela fonctionnait mais en réalité non.
    Je pense que je m'y prend mal pour changer de mode d'ordonnancement.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut
    Et merci pour vos réponses mais je pense que je vais abandonner. C'est dans le cas d'un devoir que je dois rendre demain, je n'aurai pas le temps de trouver la solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. programmation systeme sous unix avec langage C
    Par bramschs dans le forum Unix
    Réponses: 4
    Dernier message: 05/01/2014, 00h35
  2. [langage] fichier DOS et unix, retour chariot Mac unix
    Par Kinethe dans le forum Langage
    Réponses: 5
    Dernier message: 25/10/2004, 14h05
  3. [langage] Windows -> Unix
    Par Jibees dans le forum Langage
    Réponses: 6
    Dernier message: 17/04/2003, 09h16
  4. [langage] Commande Unix en Perl
    Par totox17 dans le forum Langage
    Réponses: 3
    Dernier message: 20/11/2002, 10h59

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