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

Windows Discussion :

Problème portage code Linux vers Windows


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut Problème portage code Linux vers Windows
    Bonsoir,

    Voila j'essaie de porter un code que je me suis amusé à faire sous linux sous windows. Celui-ci un mini shell. Seulement je ne connais pas les équivalents de certaines fonctions sous windows . Voici le code que j'essaie de porter:

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    /* Interpretation de la ligne de commande */
    
    void	interpreter ()
    
    {
    	printf("\n\nInterpretation");
    	if (strcmp (commandes [PREMIERE_COMMANDE] [0], "exit") == 0) {printf ("\n"); exit (0);}
    	if (commandes [PREMIERE_COMMANDE] [0])
    	{
    		if ((pid_commande_1 = fork ()) == -1)
    		{
    			printf("\n*** Premier fils non cree ***");
    			exit(0);
    		}
    		/* printf ("\n --> Fils pour la premiere commande cree"); */
    
    		if (pid_commande_1) 	/* Chez le pere */
    		{
    			wait (0);
    		}
    		else 			/* Chez le fils */
    		{
    			if (commandes [SECONDE_COMMANDE] [0])
    			{
    				if (pipe (num_pipe) == -1)  /* Creation du tube */
    				{
    					printf("\n*** Tube non ouvert ***");
    					exit (1);
    				}
    				/* printf("\n  ** Fils 1 : --> Tube cree dans le premier fils"); */
    				
    				if ((pid_commande_2 = fork()) == -1)  /* Creation du fils */
    				{
    					printf("\n*** Second fils non cree ***");
    					exit(0);
    				}
    				/* printf ("\n  ** Fils 1 : --> Fils pour la seconde commande cree"); */
    
    				if (pid_commande_2)  	/* Processus pere */
    				{
    					if (position_fichier_entree)
    					{
    						fd1 = open (fichier_entree, 0);
    						dup2 (fd1, ENTREE_STANDARD);
    						/* printf("\n  ** Fils 1 : --> Creation de la redirection en entree"); */
    					}
    					close (num_pipe [LECTURE]);
    					/* printf("\n  ** Fils 1 : --> Creation de la redirection en sortie sur le pipe"); */
    					dup2 (num_pipe [ECRITURE], SORTIE_STANDARD);
    					/* printf("\n  ** Fils 1 : --> Recouvrement de la premiere commande"); */
    					execvp (commandes [PREMIERE_COMMANDE] [0], commandes [0]);
    				}
    				else			/* Processus fils */
    				{
    					if (position_fichier_sortie)
    					{
    						fd2 = creat (fichier_sortie, 0644);
    						dup2 (fd2, SORTIE_STANDARD);
    						/* printf("\n  ** Fils 2 : --> Creation de la redirection en sortie"); */
    					}
    					close (num_pipe [ECRITURE]);
    					/* printf("\n    **** Fils 2 : --> Creation de la redirection en entree sur le pipe"); */
    					dup2 (num_pipe [LECTURE], ENTREE_STANDARD);
    					/* printf("\n    **** Fils 2 : --> Recouvrement de la seconde commande"); */
    					execvp (commandes [1] [0], commandes [1]);
    				}
    			}
    			else	/* Il n'y a pas de seconde commande */
    			{
    				if (position_fichier_entree)
    				{
    					fd1 = open (fichier_entree, 0);
    					dup2 (fd1, ENTREE_STANDARD);
    					/* printf("\n  ** Fils 1 : --> Creation de la redirection en entree"); */
    				}
    				if (position_fichier_sortie)
    				{
    					fd2 = creat (fichier_sortie, 0644);
    					dup2 (fd2, SORTIE_STANDARD);
    					/* printf("\n  ** Fils 1 : --> Creation de la redirection en sortie"); */
    				}
    
    				/* printf("\n  ** Fils 1 : --> Recouvrement de l'unique commande\n\n"); */
    				execvp (commandes [PREMIERE_COMMANDE] [0], commandes [PREMIERE_COMMANDE]);
    			}
    		}
    
    	}
    	else
    	{
    		/* printf("\n*** Pas de commande ***\n\n"); */
    		exit (0);
    	}
    }
    Si quelqu'un à une idée de à quoi cela pourrait ressembler sous windows je l'en remercie d'avance de bien vouloir me le montrer

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Oula j'aurais jamais pensé que cela serait aussi compliqué que ça les 3/4 des types utilisés me sont inconnus et je ne sais même pas à quoi ils correspondent

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Bah oui bienvenu dans le monde de Windows . Les types que tu ne connais pas sont en fait de simples typedefs de int, de pointeurs, de structures, etc. Mais je peux te donner quelques notions :

    1. Les descriptors (que ce soit des file descriptors ou des je ne sais quoi descriptors) sont appelés des HANDLEs. Pour les E/S :
    - creat -> CreateFile
    - open -> OpenFile
    - read -> ReadFile
    - write -> WriteFile
    - close -> CloseFile
    - pipe -> CreatePipe
    - dup2 -> DuplicateHandle

    2. Processus
    - Le plus simple c'est d'aller voir la FAQ C.

    3. Généralités sur la programmation Windows
    - Documentation gratuite sur l'API Windows

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Alors voila ce que j'ai fais, par contre je ne sais pas si cela correspond bien à mon code plus haut.

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    void interpreter ()
    {
        PROCESS_INFORMATION processus_info1;
        PROCESS_INFORMATION processus_info2;
        STARTUPINFO info_demarage1;
        STARTUPINFO info_demarage2;
        typedef DWORD id1;
        typedef DWORD id2;
        SECURITY_ATTRIBUTES attributs;
        
        ZeroMemory (&info_demarrage1, sizeof (STARTUPINFO));
        ZeroMemory (&info_demarrage2, sizeof (STARTUPINFO));
        attributs.nLength = sizeof (SECURITY_ATTRIBUTES);
        attributs.bInheritHandle = TRUE;
        attributs.lpSecurityDescriptor = NULL;
        if (CreateProcess ("nom_executable", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &info_demarrage1, &processus_info1))
        {
            *id1 = processus_info1.dwProcessId;
            
            if (!(*id1))
            {
                if (commandes[SECONDE_COMMANDE][0])
                {
                    if (CreatePipe (num_pipe[LECTURE], num_pipe[ecriture], &attributs, 0)
                    {
                        if (CreateProcess ("nom_executable", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &info_demarrage2, &processus_info2))
                        {
                            *id2 = processus_info2.dwProcessId;
                        
                            if (*id2)
                            {
                                if (position_fichier_entree)
                                {
                                    fd1 = open (fichier_entree, 0);
                                    
                                    dup2 (fd1, ENTREE_STANDARD);
                                }
                                close (num_pipe[LECTURE]);
                                dup2 (num_pipe[ECRITURE], SORTIE_STANDARD);
                                _spawnvp (_P_WAIT, commandes[PREMIERE_COMMANDE][0], commandes[0]);
                            }
                            else
                            {
                                if (position_fichier_sortie)
                                {
                                    fd2 = creat (fichier_sortie, 0644);
                                    
                                    dup2 (fd2, SORTIE_STANDARD);
                                }
                                close (num_pipe[ECRITURE]);
                                dup2 (num_pipe[LECTURE], ENTREE_STANDARD);
                                _spawnvp (_P_WAIT, commandes[1][0], commandes[1];
                            }
                        }
                        else
                        {
                            printf ("probleme de precessus numero 2");
                        }
                    }
                    else
                    {
                        printf ("probleme de pipe");
                    }
                }
                else
                {
                    if (position_fichier_entree)
                    {
                        fd1 = open (fichier_entree, 0);
                        
                        dup2 (fd1, ENTREE_STANDARD);
                    }
                    if (position_fichier_sortie)
                    {
                        fd2 = open (fichier_sortie, 0644);
                        
                        dup2 (fd2, SORTIE_STANDARD);
                    }
                    _spawnvp (commandes[PREMIERE_COMMANDE][0], commandes[PREMIERE_COMMANDE]);
                }
            }
        }
        else
        {
            printf ("probleme de processus numero 1");
        }
    }
    J'ai juste modifié pour:
    fork => CreateProcess
    pipe => CreatePipe
    execvp => _spawnvp

    Pour les autres elles existent bien (vue qu'elles sont POSIX) mais elles sont juste déprécié, ce qui n'est pas trop grave, je m'occuperais ça ensuite car c'est pas le plus important.

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Mélanger du Win32 avec du POSIX, ce n'est pas une très bonne idée. CreatePipe par exemple te retourne des HANDLEs alors que tu passes ensuite ces handles à dup2, close, etc. qui elles attendent des files descriptors ... tu peux cependant créer un file descriptor qui encapsule un HANDLE à l'aide de _open_osfhanle.

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

Discussions similaires

  1. debogage et portage d'une biblio de linux vers windows
    Par shadowless dans le forum Langage
    Réponses: 3
    Dernier message: 03/05/2011, 09h08
  2. Portage de linux vers windows d'une bibliothèque
    Par shadowless dans le forum Débuter
    Réponses: 31
    Dernier message: 24/04/2011, 23h58
  3. problème portage ioctl socket Linux vers Windows
    Par progfou dans le forum Réseau
    Réponses: 19
    Dernier message: 06/10/2009, 19h44
  4. Problème de portage Linux vers Windows, wxwidgets
    Par zoom* dans le forum wxWidgets
    Réponses: 6
    Dernier message: 22/07/2008, 09h59
  5. Passage d'un code C++ Linux vers Windows
    Par GLDavid dans le forum C++
    Réponses: 10
    Dernier message: 22/05/2006, 17h43

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