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 :

Problème avec le PID


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Responsable de trafic
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Bahamas

    Informations professionnelles :
    Activité : Responsable de trafic
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Par défaut Problème avec le PID
    salut la communauté j'ai trouvé un algorithme sur le net et j'ai essayé de le compiler avec la commande "gcc" mais ce dernier affiche un message d'erreur .

    Pouvez vous m'aider les gars ?

    voici l’énoncé :

    Écrire deux programmes qui bouclent et qui affichent les messages « ping » et « pong » respectivement lorsqu'ils recoivent un signal à définir. La synchronisation entre les processus correspondants aux deux programmes (pour afficher de manière alternative les messages « ping » et « pong ») est assurée par un troisième processus : l'ordonnanceur.

    On lancera trois terminaux, puis on exécutera dans deux d'entre eux les programmes « ping » et « pong » et dans le troisième terminal l'ordonnanceur, avec comme argument les pid des deux processus maintenant en attente.

    voici le code :

    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
    #include ‹stdio.h›
    #includesignal.h›
    #include ‹unistd.h›
     
    void interrupt(int s)
    {
      printf("Ping\n");
      signal(s,interrupt);
    }
     
    int main()
    {
      // Pour des raisons pratiques...
      printf("Mon PID est : %d\n",getpid());
     
      signal(SIGUSR1,interrupt);
     
     
      // Boucle infinie :
      while(1) 
        {
          pause();
        }
     
      return 0;
    }

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include ‹stdio.h›
    #includesignal.h›
    #include ‹stdlib.h›
    #include ‹unistd.h›
     
    // Numero de processus actuel, et pid correspondants :
    int procactuel,pid1,pid2;
     
    // Donne la main aux processsus l'un apres l'autre :
    void swap(int s)
    {
      if(procactuel==0)
        {
          printf("Main au processus 2\n");
          kill(pid2,SIGUSR1);
          procactuel=1;
        }
      else
        {
          printf("Main au processus 1\n");
          kill(pid1,SIGUSR1);
          procactuel=0;
        }
     
      // Reprise :
      alarm(1);
      signal(s,swap);
    }
     
     
    void detruit(int s)
    {
      // L'ordonnanceur entraine dans sa chute les deux
      // processus fils :
      kill(pid1,SIGINT);
      kill(pid2,SIGINT);
      int mypid=getpid();
      alarm(0);
      kill(mypid,SIGKILL);
    }
     
     
    void usage(char *nomcommande)
    {
      printf("Usage : %s ‹pid1› ‹pid2›\n",nomcommande);
      printf("Execute de maniere alternative ‹pid1› et ‹pid2›.\n");
      exit(EXIT_FAILURE);
    }
     
     
    int main(int argc, char * argv[])
    {
      if (argc!=3)
        usage(argv[0]);
     
      // Recuperation des parametres :
      pid1=atoi(argv[1]);
      pid2=atoi(argv[2]);
     
      // Verification des deux pid :
      if(pid1#139;=0 || pid2#139;=0)
        usage(argv[0]);
     
      // Declaration des fonctions de traitement d'interruption :
      signal(SIGALRM,swap);
      signal(SIGINT,detruit);
     
      // Initialisation :
      printf("Pressez CTRL-C pour quitter !\n");
      printf("Mini-ordonnanceur pret.\n");
      procactuel=0;
      kill(pid1,SIGUSR1);
      alarm(1);
     
      // Boucle infinie :
      while(1) {pause();}
      return 0;
    }

    cette partie pose un problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     // Verification des deux pid :
      if(pid1#139;=0 || pid2#139;=0)

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    ta copie a foiré.
    * Apprends le langage C.
    * remplace #139; par un !

  3. #3
    Membre actif Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Par défaut
    Il suffit de remplacer ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Vérification des deux PID :
    if(pid1#139;=0 || pid2#139;=0)
    par ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Vérification des deux PID :
    if(pid1!=0 || pid2!=0)

  4. #4
    Membre actif
    Homme Profil pro
    Responsable de trafic
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Bahamas

    Informations professionnelles :
    Activité : Responsable de trafic
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Par défaut
    merci beaucoup les gars mais je n'arrive pas à le lancer . Pourtant j'ai ouvert trois terminal et pourtant je fais
    ./main 3145 3256

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2015
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 644
    Par défaut
    Je pense sincèrement qu'avant d'aller plus loin, tu devrais penser un peu à ce que ton code fait plutôt que de pomper du code comme ça.

    L'erreur qu'ils t'ont résolu plus haut, n'a pas lieu d'être sur un forum.

    Pour la suite, sans erreur, valgrind ou autre, difficile de t'en dire plus.


    EDIT : Tu compiles comment? Tu as deux mains. J'espère pour toi au moins que tu ne donnes pas à tes exécutables le même nom

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par magicarpe44 Voir le message
    EDIT : Je confirme mes deux lignes plus haut, tu ne sais absolument pas ce que tu fais. Tu lances un ./main [arg] [arg] alors que le prototype de ta fonction main() ne prend aucun argument.
    Tu te trompes. Le deuxième programme montré prends bien en paramètre deux arguments.


    Sinon, je plussoie.. Au lieu de pomper un code tout fait d'internet, as-tu lu un minimum de théorie sur le sujet ? Comprends-tu ce que les codes font et comment faut-il les utiliser ?

    ( pour un surplus de théorie sur le sujet : http://mtodorovic.developpez.com/lin...e/?page=page_3 )

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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