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

Unix Discussion :

programmation systeme sous unix avec langage C


Sujet :

Unix

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut programmation systeme sous unix avec langage C
    Bonjour,

    Je suis nouveau en programmation système et j'essaye de résoudre un exercice mais je n'arrive pas vraiment a le faire... alors j'ai besoin de votre aide svp !

    l'énoncé : suite de syracus

    après avoir fait un fork et crée 2 tube , l'utilisateur va entré un nombre :

    le fils commence : si le nombre%2!=0 alors il fait nombre=nombre*3+1 jusqu'a ce qu'il ait un résultat pair et le passe au pere via un tube.

    ensuite le pere : si nombre%2==0 alors nombre=nombre/2 jusqu'a ce qu'il ait un nombre impaire et le passe au fils via un tube , et ainsi de suite jusqu'a 1.

    mon premier essai :

    #include <unistd.h>

    #include <stdio.h>

    #include <stdlib.h>

    #include <signal.h>

    #include <sys/types.h>

    void handler (int sig){}

    main (int argc , char*argv[] ) {

    int tube1[2]; int tube2[2];

    int n=atoi(argv[1]), x , pid;

    int p = pipe(tube1),p2=pipe(tube2);

    signal(SIGUSR1,handler);

    pid=fork();

    do{

    if(pid==0) {

    close(tube2[1]);

    read(tube2[0],&n,sizeof(int));

    close(tube2[0]);

    while(n%2!=0) {n=n*3+1;

    printf("\n fils : %d",n);

    if(n==1) exit(0);}

    close(tube1[0]);

    write(tube1[1],&n,sizeof(int));

    close(tube1[1]);

    kill(getppid(),SIGUSR1); pause();

    }else {

    close(tube1[1]);

    read(tube1[0],&n,sizeof(int));

    close(tube1[0]);

    printf("\n père: %d",n);

    while(n%2==0) {n=n/2;

    printf("\n père : %d",n);

    if (n==1) exit(0);

    }

    close(tube2[0]);

    write(tube2[1],&n,sizeof(int));

    close(tube2[1]);

    kill(pid,SIGUSR1);

    }

    }while(1);

    }

  2. #2
    Membre actif
    Avatar de Thomas404
    Homme Profil pro
    dev
    Inscrit en
    Novembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Novembre 2009
    Messages : 99
    Points : 234
    Points
    234
    Par défaut
    Ou est la définition de ta fonction handler ? Je ne vois que son prototype.

    Sinon, j'ai l'impression qu'il manque des parentheses pour les while, regarde moi ce que j'ai écris, bien entendu en langage C je n'en suis pas encore là, mais certaines choses m'ont sembler etranges...

    Ce code n'est évidement pas bon, mais il a été corriger de certaines choses.

    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
    #include<unistd.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<signal.h>
    #include<sys/types.h>
     
    void handler(int sig);
     
    int main(int argc, char * argv[])
    {
    	int	tube1[2];
    	int	tube2[2];
    	int	n=atoi(argv[1]), x, pid;
    	int	p = pipe(tube1),p2=pipe(tube2);
     
    	signal(SIGUSR1,handler);
    	pid=fork();
     
    	while(1)
    	{
    		if(pid==0) {
    			close(tube2[1]);
    			read(tube2[0],&n,sizeof(int));
    			while(n % 2 != 0) {
    				n *=3+1;
    				printf("\n fils : %d",n);
    				if(n == 1){
    					exit(0);
    					write(tube1[1],&n,sizeof(int));
    					close(tube1[1]);
    					kill(getppid(),SIGUSR1);
    					pause();
    				} else {
    					close(tube1[1]);
    					read(tube1[0],&n,sizeof(int));
    					close(tube1[0]);
    					printf("\n pere: %d",n);
    				}
    			while(n%2==0) {
    				n /= 2;
    				printf("\n pere: %d",n);
    				if(n==1)
    					exit(0);
    			}
    		}
     
    	close(tube2[0]);
    	write(tube2[1],&n,sizeof(int));
    	close(tube2[1]);
    	kill(pid,SIGUSR1);
     
    	}
    }
    	return 0;
    }
     
    int handler(int sig)
    {
        // Que vas tu mettre ici?
    }

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Il n'a pas de définition c'est un signal vide juste pour réveiller le fils qui est en pause();

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    juste :
    void handler (int sig)
    {}

  5. #5
    Membre actif
    Avatar de Thomas404
    Homme Profil pro
    dev
    Inscrit en
    Novembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Novembre 2009
    Messages : 99
    Points : 234
    Points
    234
    Par défaut
    Oh, ok.

Discussions similaires

  1. Envoi mail sous Unix avec Java
    Par dimitris dans le forum Général Java
    Réponses: 6
    Dernier message: 15/03/2008, 22h57
  2. modification de programme .pc sous unix
    Par gege87270 dans le forum Shell et commandes GNU
    Réponses: 33
    Dernier message: 01/10/2007, 08h50
  3. Programmation system sous Windows XP
    Par docteurxt dans le forum Delphi
    Réponses: 3
    Dernier message: 19/03/2007, 00h23
  4. Comment lancer une application qui a été développée sous Unix avec le navigateur IE
    Par diamonds dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 26/09/2006, 14h43
  5. Programmation systeme sous Unix
    Par Premium dans le forum Linux
    Réponses: 9
    Dernier message: 11/03/2006, 09h40

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