Probleme fonction execl()
miki
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
Bonjour,a tous voila je suis debutant en c je le precise j'apprend donc grace au cours du net et codes source .Je suis tomber sur cette fontion execl() je sais quel permet de lancer un processus ou plutot de remplacer le processus apeler (pere) par un processus fils bref j'ai voulut la tester de cette façon ;
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
execl("c:\windows\system32\cmd.exe","ftp",null);
}
mais dev c++ refuse la compilation, si quelque un pouvait me dire ou est l'erreur ou plutot les erreurs je crois ce serait cool merci d'avance.
ps; je le redi je ne suis qu'un new biz en c merci encore
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
execl("c:\windows\system32\cmd.exe","ftp",null);
}
mais dev c++ refuse la compilation, si quelque un pouvait me dire ou est l'erreur ou plutot les erreurs je crois ce serait cool merci d'avance.
ps; je le redi je ne suis qu'un new biz en c merci encore
12 réponses
Hello.
Plusieurs choses:
- null n'existe pas en C, c'est NULL
- dans une chaine, "\" c'est un caractère d'échappement, donc il ne comprend pas ton path, il faut donc échapper tes "\" avec une autre "\" :)
- les deux premiers arguments de execl doivent être les mêmes (voir http://fr.wikibooks.org/wiki/Programmation_POSIX:Processus pour plus d'informations)
-ftp n'est pas une option de l'application 'cmd.exe'. Il faut appeler soit 'cmd.exe', soit 'ftp.exe', qui se trouve dans le même répertoire. Dans l'exemple ci-dessous, j'ai appelé 'ftp.exe'
Cordialement
Plusieurs choses:
- null n'existe pas en C, c'est NULL
- dans une chaine, "\" c'est un caractère d'échappement, donc il ne comprend pas ton path, il faut donc échapper tes "\" avec une autre "\" :)
- les deux premiers arguments de execl doivent être les mêmes (voir http://fr.wikibooks.org/wiki/Programmation_POSIX:Processus pour plus d'informations)
-ftp n'est pas une option de l'application 'cmd.exe'. Il faut appeler soit 'cmd.exe', soit 'ftp.exe', qui se trouve dans le même répertoire. Dans l'exemple ci-dessous, j'ai appelé 'ftp.exe'
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
if(execl("c:\\WINDOWS\\system32\\ftp.exe","c:\\WINDOWS\\system32\\ftp.exe", NULL) == -1)
perror("execl");
return EXIT_SUCCESS;
}
Cordialement
Salut,
Les fonctions exec sont plutôt reservées à Linux/Unix. Sous windows je me demande bien ce que ça peut donner. J'imagine mal qu'on puisse adapter cette fonction sous Windows, la gestion des processus y est beaucoup trop différente. A mon avis ils ont pas dû l'implémenter.
Sinon teste avec NULL en majuscule (le null en minuscule n'existe pas). Mais regarde ce que te dis dev c++ après tentative de compilation.
Les fonctions exec sont plutôt reservées à Linux/Unix. Sous windows je me demande bien ce que ça peut donner. J'imagine mal qu'on puisse adapter cette fonction sous Windows, la gestion des processus y est beaucoup trop différente. A mon avis ils ont pas dû l'implémenter.
Sinon teste avec NULL en majuscule (le null en minuscule n'existe pas). Mais regarde ce que te dis dev c++ après tentative de compilation.
merci d'avoir repondu a mon message kilian j'ai essayer avec null en majuscule toujour la meme chose et dev me dit ça :
7:9 C:\Users\miki\Desktop\main.c [Warning] unknown escape sequence '\w'
7:9 C:\Users\miki\Desktop\main.c [Warning] unknown escape sequence '\s'
7:9 C:\Users\miki\Desktop\main.c [Warning] unknown escape sequence '\c'
a tu une idee du pourquoi ça plante ?merci
7:9 C:\Users\miki\Desktop\main.c [Warning] unknown escape sequence '\w'
7:9 C:\Users\miki\Desktop\main.c [Warning] unknown escape sequence '\s'
7:9 C:\Users\miki\Desktop\main.c [Warning] unknown escape sequence '\c'
a tu une idee du pourquoi ça plante ?merci
Au fait execl ne fait pas forcément ce que tu penses. Ca transforme ton programme en un autre programme. Donc tu créeras bien un autre processus mais ton programme de départ sera arrêté.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
oui j'ai taper le code sur dev c++ mais apres plusieur recherche sur google oui execl et speciale bref connait tu une autre commande en c qui pourrai me permettre d'executer un programme hormi system() merci
Y'aurait éventuellement popen
Exemple:
Au départ c'est plutôt pour écrire en entrée d'un programme lancé, mais ça peut être quand même pratique dans ton cas, juste pour lancer un programme.
Sinon le mieux sous windows c'est la fonction CreateProcess de la librairie windows. Mais si tu débutes en C elle est quand même trop compliquée.
Exemple:
FILE *fp = popen("c:/monprog.exe", "r");
Au départ c'est plutôt pour écrire en entrée d'un programme lancé, mais ça peut être quand même pratique dans ton cas, juste pour lancer un programme.
Sinon le mieux sous windows c'est la fonction CreateProcess de la librairie windows. Mais si tu débutes en C elle est quand même trop compliquée.
et puis execl() est dans la lib unistd.h donc la lib des fonction unix standard donc ça m'etonnerait qu'il marche avec window....
merci Marco mais avec ton code dev c++ refuse tj la compile
7 C:\Users\miki\Desktop\main.c missing terminating " character
8 C:\Users\miki\Desktop\main.c expected `)' before ';' token
8 C:\Users\miki\Desktop\main.c expected `)' before ';' token
C:\Users\miki\Desktop\Makefile.win [Build Error] [main.o] Error 1
sinon j'ai essayer popen comme tu me la dit killian ça marche si vous avez d'autre tuyau de fonction qui permette d'apeler un programme et de lui passer des arguments je suis proneur merci beaucoup pour vos conseil
7 C:\Users\miki\Desktop\main.c missing terminating " character
8 C:\Users\miki\Desktop\main.c expected `)' before ';' token
8 C:\Users\miki\Desktop\main.c expected `)' before ';' token
C:\Users\miki\Desktop\Makefile.win [Build Error] [main.o] Error 1
sinon j'ai essayer popen comme tu me la dit killian ça marche si vous avez d'autre tuyau de fonction qui permette d'apeler un programme et de lui passer des arguments je suis proneur merci beaucoup pour vos conseil
merci kilian sympa je chercher en ce moment meme sur google mais pas top les renseignement que je trouve et pour progresser c'est dur lol
Voilà pour le code avec CreateProcess. Bon il est pas facile pour un débutant, je me dis que ça vaut même pas le coup d'expliquer, ça prendrait une page. Mais sous Windows, basiquement un processus se crée comme ça. Par contre pour ça sous Dev C++ il faut que tu ailles dans les options du compilateur, tu coches "Ajouter ces commandes lors de l'appel à l'éditeur de liens" puis tu ajoutes en dessous:
Le code:
Bon j'ai pas de quoi tester, tu me diras.
-mwindows
Le code:
#include <windows.h>
int main()
{
STARTUPINFO inf;
PROCESS_INFORMATION procinfo;
GetStartupInfo(&inf);
CreateProcess("c:\\WINDOWS\\system32\\ftp.exe", "c:\\WINDOWS\\system32\\ftp.exe", NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &inf, &procinfo);
return 0;
}
Bon j'ai pas de quoi tester, tu me diras.
nikel merci kilian mais juste une petit precision pourqoi il y a deux NULL dans la derniere ligne a savoir createprocess ?
Y'en a quatre en fait :-)
Faisons un peu le tour de cette fonction:
https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa?redirectedfrom=MSDN
Quand tu vois __in c'est que le paramètre sert en entrée pour la fonction. Pour __out c'est que le paramètre sera un pointeur et que la fonction va écrire des trucs dans cette variable pointée que tu pourras lire à la sortie de cette fonction.
Et __in_opt signifie que le paramètre est optionnel, généralement je suppose que ça veut dire que tu mettre NULL si ça te chante.
LPCTSTR (long pointer to string) c'est un équivalent de char *
DWORD (double word) c'est la même chose que int
LPVOID (long pointer to void) c'est void *
Le reste c'est des structures propres à Windows.
_ lpApplicationName c'est le chemin vers ton ton programme à executer.
_ lpCommandLine c'est la ligne de commande (tu mets la même chose que lpApplicationName)
_ lpProcessAttributes c'est les attributs de sécurité de ton programme créé. C'est une structure avec plein de paramètre, si tu mets NULL il leur mets des valeurs par défaut.
_ lpThreadAttributes, même chose mais pour le thread de ce processus. Le thread c'est le fil d'execution de ton processus. Tu peux avoir plusieurs thread, donc plusieurs fonctions qui s'executent en même temps.
_bInheritHandles : définit si ce processus hérite des Handles du processus qui l'a créé. Donc est-ce qu'il peut réutiliser tes descripteurs de fichiers etc...
_ dwCreationFlags: la priorité de ce processus
_ lpEnvironment : l'envirronnement de ce nouveau processus. En metant NULL il reprend ton envirronnement.
_ lpCurrentDirectory: le repertoire courant, si NULL alors ce sera le même que le tiens.
_ lpStartupInfo: une structure qui définit les attributs de la fenêtre de ce processus (taille etc...), j'ai choisi de prendre la même que celle du processus courant
_lpProcessInformation: un pointeur vers une structure. Windows écrira dedans, tu pourras la consulter pour savoir les informations sur le processus qu tu as créé.
Pfiouh! Crois moi, la création de processus sous Linux c'est franchement plus simple.
Faisons un peu le tour de cette fonction:
https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa?redirectedfrom=MSDN
BOOL WINAPI CreateProcess( __in_opt LPCTSTR lpApplicationName, __inout_opt LPTSTR lpCommandLine, __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCTSTR lpCurrentDirectory, __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation );
Quand tu vois __in c'est que le paramètre sert en entrée pour la fonction. Pour __out c'est que le paramètre sera un pointeur et que la fonction va écrire des trucs dans cette variable pointée que tu pourras lire à la sortie de cette fonction.
Et __in_opt signifie que le paramètre est optionnel, généralement je suppose que ça veut dire que tu mettre NULL si ça te chante.
LPCTSTR (long pointer to string) c'est un équivalent de char *
DWORD (double word) c'est la même chose que int
LPVOID (long pointer to void) c'est void *
Le reste c'est des structures propres à Windows.
_ lpApplicationName c'est le chemin vers ton ton programme à executer.
_ lpCommandLine c'est la ligne de commande (tu mets la même chose que lpApplicationName)
_ lpProcessAttributes c'est les attributs de sécurité de ton programme créé. C'est une structure avec plein de paramètre, si tu mets NULL il leur mets des valeurs par défaut.
_ lpThreadAttributes, même chose mais pour le thread de ce processus. Le thread c'est le fil d'execution de ton processus. Tu peux avoir plusieurs thread, donc plusieurs fonctions qui s'executent en même temps.
_bInheritHandles : définit si ce processus hérite des Handles du processus qui l'a créé. Donc est-ce qu'il peut réutiliser tes descripteurs de fichiers etc...
_ dwCreationFlags: la priorité de ce processus
_ lpEnvironment : l'envirronnement de ce nouveau processus. En metant NULL il reprend ton envirronnement.
_ lpCurrentDirectory: le repertoire courant, si NULL alors ce sera le même que le tiens.
_ lpStartupInfo: une structure qui définit les attributs de la fenêtre de ce processus (taille etc...), j'ai choisi de prendre la même que celle du processus courant
_lpProcessInformation: un pointeur vers une structure. Windows écrira dedans, tu pourras la consulter pour savoir les informations sur le processus qu tu as créé.
Pfiouh! Crois moi, la création de processus sous Linux c'est franchement plus simple.
bon merci quand meme kilian je poste le resultat en resolu etant donne que j'au eu reponse a ma question merci a tout les deux bonne soiree