Comment appeler execl() en C avec les arguments appropriés?
j'ai vlc (programme de reproduire des vidéos)
si je tape dans un shell:
/home/vlc "/home/mes films/le film que je veux voir.mkv"
il ouvre une reproduit le film.
cependant, lorsque je lance le programme suivant:
#include <unistd.h>
int main(void) {
execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL);
return 0;
}
vlc s'ouvre mais n'a pas de reproduire quoi que ce soit. Comment puis-je résoudre ce problème?
Choses que j'ai essayé:
J'ai deviné
execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL);
était équivalent à taper dans le shell:
/home/vlc /home/my movies/the movie i want to see.mkv
qui ne fonctionne pas, donc j'ai essayé
execl("/home/vlc", "\"/home/my movies/the movie i want to see.mkv\"",NULL);
et vlc s'ouvre mais ne pas les reproduire.
Au lieu d'écrire la valeur NULL à la fin, j'ai essayé de 0, (char*) 0, 1 .... pas utile.
À l'aide!!!!
Pourquoi ne pas vous regardez
errno
après l'échec de l'execl? Il aurait dû vous apprendre plus au sujet de votre problème. Ce qui est devenu de la lecture de la page de man pour execl soigneusement? 🙂OriginalL'auteur Matias Morant | 2012-09-26
Vous devez vous connecter pour publier un commentaire.
Vous devez spécifier tous les arguments, inclus
argv[0]
qui n'est pas prise à partir de l'exécutable.Assurez-vous également de la finale
NULL
est rejeté àchar*
.Détails sont ici: http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html
s/jeton/prises ?
Pourquoi est-ce que /home/vlc besoin d'être spécifiée deux fois?
premier est le chemin d'accès complet, le deuxième est le nom du processus, généralement "vlc" est assez dans le deuxième paramètre
Il devrait être
... , (char*) NULL);
OriginalL'auteur AProgrammer
Si vous avez besoin pour exécuter votre VLC processus de lecture et uniquement à donner de contrôle de votre processus de demande quand c'est fait et rien de plus complexe, alors je suppose que vous pouvez utiliser simplement:
system("The same thing you type into console");
Je crois comprendre votre point de vue et votre fortune est raisonnable. Mais lorsque l'on traite avec des besoins simples, est-il d'autres avantages de l'utilisation de execl() à la place de system(), en plus d'éviter de jouer avec la séquence d'échappement antislash dans le système()?
Il pourrait y avoir des raisons de sécurité, si vous avez par exemple une chaîne créée comme,
sprintf(buf, "ls -la %s", var)
qui vous exécuter avecsystem(buf)
, quelqu'un pourrait vous donner un nom de fichier,"somefile; rm -rf ~"
, par exemple.OriginalL'auteur Erik Kaju