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 :

executer un programme externe sans fork/kill


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut executer un programme externe sans fork/kill
    Bonjour,

    Je suis débutant en C, car j'essaye de contourner un soucis sur un OS "exotique".

    Je shouterais trouver un bout de code qui serais capable d'executer une application (binaire) externe, sans forker (copier mon binaire pere completement), ni qui tue le pere (comme le fait execlp).

    Vous allez me dire "system", mais system ne fonction pas, car celui-ci fait exactement ceci :
    /bin/sh -c macommande

    Mais sur mon OS, /bin/sh existe pas.

    Donc, comment avoir, system, mais qui execute mon binaire, directemnt, sans sh, ou, lui dire que sh est pas dans /bin/sh mais dans /system/bin/sh.

    De plus, sur ce bout de code, j'aimerais lire, la première ligne de sortie du binaire, j'ai lu qu'il falais faire des pipes, j'ai reussi à faire un code qui marche, mais avec des fork --> Ca plante constament, manque de mémoire ... (téléphone portable :-)).
    Voici mon code de test, mais celui-ci seras en fait le contenu d'une fonction, d'un "gros" programme en static, d'où l'interdiction de forker.
    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
     
      #include <stdio.h>
      #include <memory.h>
      #include <unistd.h>
     
      int main( int argc, char ** argv )
      {
              char buffer[BUFSIZ+1];
       /* create the pipe */
       int pfd[2];
       if (pipe(pfd) == -1)
         {
           printf("pipe failed\n");
           return 1;
         }
       /* create the child */
       int pid;
       if ((pid = fork()) < 0)
         {
           printf("fork failed\n");
           return 2;
         }
       if (pid == 0)
         {
           /* child */
           close(pfd[1]); /* close the unused write side */
    //       dup2(pfd[0], 0); /* connect the read side with stdin */
           read(pfd[0], buffer, BUFSIZ);
           close(pfd[0]); /* close the read side */
           /* execute the process (wc command) */
    //       execlp("wc", "wc", (char *) 0);
    //       printf("wc failed"); /* if execlp returns, it's an error */
    //       return 3;
           printf("%s", buffer);
         }
       else
       {
           /* parent */
           close(pfd[0]); /* close the unused read side */
           dup2(pfd[1], 1); /* connect the write side with stdout */
           close(pfd[1]); /* close the write side */
           /* execute the process (ls command) */
           execlp("/data/data/com.galoula.Privoxy/bin/dnslookup", "/data/data/com.galoula.Privoxy/bin/dnslookup", "2", "www.Galoula.com", (char *)0);
           printf("ls failed"); /* if execlp returns, it's an error */
           return 4;
       }
       return 0;
      }

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Bonjour,

    Je suis très curieux de connaître l'O.S. exotique en question. Apparemment, cela reste un unixoïde tout de même (exit CreateProcess() et autres…).

    Pour que /bin/sh aille directement invoquer /system/bin/sh, il te suffit de créer un lien symbolique (voire même dur). Mais cela affectera tous les programmes de ton système, pas seulement le tien.

    Sinon, en général, on utilise un combiné fork-exec pour lancer des programmes. On se duplique d'abord puis on remplace la copie, de telle sorte que l'on obtient bien deux processus, père et fils.

    Enfin, regarde du côté de popen() qui est probablement ce qu'il y a de plus proche de ce que tu cherches à faire, mais cela passe quand même par /bin/sh.

  3. #3
    Membre émérite Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Par défaut
    Bonjour,
    system(3) se base sur excve(2) pour s'exécuter.

Discussions similaires

  1. [C#] Comment executer un programme externe ?
    Par Worldofdada dans le forum C#
    Réponses: 7
    Dernier message: 11/02/2009, 14h36
  2. [Système] execution des programmes externes
    Par jadoo dans le forum Langage
    Réponses: 2
    Dernier message: 06/11/2006, 16h55
  3. Exécuter un programme externe et détecter sa terminaison
    Par leserapheen dans le forum Pascal
    Réponses: 10
    Dernier message: 04/10/2006, 17h19
  4. [VB6]Executer un programme externe et récuperer les sorties
    Par agro dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 29/03/2006, 13h08
  5. [Système] Executer un programme externe depuis un scripte php
    Par Scorpion Rouge dans le forum Langage
    Réponses: 1
    Dernier message: 24/01/2006, 11h59

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