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:
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;
} |