Probleme fonction execl()

miki -  
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

12 réponses

Marco la baraque Messages postés 1030 Statut Contributeur 329
 
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'

#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
1
kilian Messages postés 8854 Statut Modérateur 1 526
 
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.
0
miki
 
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
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Euh tu es sûr que tu as tapé ton code sur Dev C++ ? Tu n'aurais pas plutôt ouvert un fichier qui a été créé sur un autre logiciel?
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
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é.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
miki
 
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
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Y'aurait éventuellement popen
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.
0
mype Messages postés 2449 Statut Membre 437
 
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....
0
miki
 
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
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Bon, bouge pas je te le fais pour CreateProcess, ça peut être instructif après tout :-)
0
Marco la baraque Messages postés 1030 Statut Contributeur 329
 
oui, le copié-collé buggue... étrange.

Il faut remplacer le "&q­uot;" par ".
0
miki
 
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
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
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:
-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.
0
miki
 
nikel merci kilian mais juste une petit precision pourqoi il y a deux NULL dans la derniere ligne a savoir createprocess ?
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
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
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.
0
miki
 
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
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Ca marche au fait? (oublie pas de regarder ma réponse au dessus)
0
Lum
 
C'est un peu tard mais en espérant que sa aidera un débutant :
Il faut faire un cast sur NULL en dérnier argument de execl.

C'est à dire (char *)NULL en dernier argument de la fonction execl.
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Salut,
Non, pas besoin de caster.
L'erreur a déjà été expliquée (NULL au lieu de null, et execl fait partie d'unistd. Il faut utiliser CreateProcess sur Windows).
Cdlt
0