Bonjour,
je souhaite utiliser la fonction execvp et j'ai lu sur les différents post du forum qu'il faut inclure unistd.h et process.h .
Est ce que unistd.h est vraiment nécessaire ? Ou bien process.h est suffisant?
Merci
Madeline
Version imprimable
Bonjour,
je souhaite utiliser la fonction execvp et j'ai lu sur les différents post du forum qu'il faut inclure unistd.h et process.h .
Est ce que unistd.h est vraiment nécessaire ? Ou bien process.h est suffisant?
Merci
Madeline
La seule réponse, le man execvp()
et donc oui, unistd.h est bien nécessaire
merci !
Dans ce cas, est ce que c'est normal que mon programme compile (et qu'il rentre dans la fonction) alors que je n'inclus pas ce fichier ??
Peut être que le fichier unistd.h est inclus de manière indirecte par un autre fichier que tu inclus. Cela serait un effet de bord.
D'accord.
Donc le fait que la commande ne fasse pas ce que je veux ne vient pas de là mais d'une mauvaise utilisation de ma part...
Merci !!
Madeline
tu peux montrer ton code et dire ce que tu veux faire ?
Et bien tout ce que je souhaite en fait, c'est que la console ne s'ouvre pas quand je lance une commande depuis mon cpp. Comme je n'y connais rien, je pensais que cela venait peut être de la fonction que j'utilisais ( system() ).
Mais apparemment ce n'est pas le cas ! Cela vient du fait que j'utilise un projet Qt console !!
J'essaie donc maintenant de passer par Qt pour lancer des threads...
Merci de m'avoir répondu si vite en tout cas.
Décidement, j'ai du mal !
En fait non, j'ai fait une librairie donc l'ouverture de la console doit bien venir de system().
Est ce que tu sais qu'elle fonction je pourrais utiliser pour que la console ne s'ouvre pas ??
Il y a des alternatives à system() mais elle sont moins portables.
CreateProcess() sous Windows par exemple. Là c'est garanti, pas de fenêtre intempestive. Par contre, il faut lancer un executable (.exe), interdit de lacer un .bat.
J'ai essayé plein de fonctions différentes :
Code:
1
2
3 QString l_command = "svn ls --verbose " + p_pathDirectory + " > temp.txt"; system( l_command.toAscii().data() );
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 STARTUPINFO si; PROCESS_INFORMATION pi; CreateProcess( NULL, // No module name (use command line) (LPTSTR)l_command.toAscii().data(), // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE 0, // No creation flags NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi ) ; // Pointer to PROCESS_INFORMATION structure
Seule la solution avec system fonctionne ...Code:
1
2
3 char *argv[] = { "svn", "ls", "--verbose", p_pathDirectory.toAscii().data(), ">" , "temp.txt" ,NULL }; execvp("svn",argv);
Tu as une idée pourquoi ?
Remarque : les méthodes toAscii().data() permettent de passer d'un QString à un char*
Donc visiblement, la commande que tu veux lancer c'est
la redirection "> temp.txt" ne fonctionne pas avec CreateProcess. Les redirections, c'est le shell qui les gère, ce n'est pas un paramètre à passer au programme appelé.Citation:
svn ls --verbose " <path> > temp.txt
Un exemple qui fonctionne chez moi :
Bien relire la doc MSDN au sujet de cette fonction, il y a quelques pièges.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 PROCESS_INFORMATION pi; ::memset(&pi, 0, sizeof(pi)); STARTUPINFO si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); DWORD creation_flag = CREATE_NO_WINDOW; DWORD ret; ret = ::CreateProcess(NULL, // name of executable module command, // command line string NULL, // SD NULL, // SD FALSE, // handle inheritance option creation_flag, // creation flags NULL, // new environment block NULL, // current directory name &si, // startup information &pi); // process information if(ret != TRUE) { // traitement d'erreur } ::CloseHandle(pi.hThread);