À l'aide de popen() pour ouvrir un programme en ligne de commande?
Est-il possible d'ouvrir un programme à l'aide d'un autre programme? Par exemple:
Je veux faire une application en ligne de commande en C qui demande à l'utilisateur de taper le nom d'un programme (par exemple Microsoft Word.app), et que le programme va se lancer. Je ferais quelque chose comme ceci:
#include <stdio.h>
#include <time.h>
int main (int argc, const char * argv[]) {
char programName[1000];
printf("Type in the name of the program you would like to open: ");
scanf("%s", programName);
popen(programName);
}
Cependant, popen() me demande un autre char. Comment pourrais-je aller sur l'aide de popen() pour ouvrir le programme?
EDIT: Le code suivant fonctionne!
#include <stdio.h>
#include <time.h>
int main (int argc, const char * argv[]) {
char programName[1000];
char app[100] = ".app";
char openApp[100] = "open /Applications/";
printf("Type in the name of the program you would like to open: ");
scanf("%s", programName);
strcat(openApp, programName);
strcat(openApp, app);
system(openApp);
}
- Bien que votre code suivant fonctionne, il a le potentiel de crash de l'exécution sur le tampon de strcat, vous ajoutez un peut de 1000 tableau de caractères en une destination qui ne peut contenir un maximum de 100 caractères. char openApp[100]; doit être d'au moins char openApp[100 + 1000 + 20];
Vous devez vous connecter pour publier un commentaire.
popen
vous permet de lancer un programme et d'obtenir un descripteur de fichier de son entrée ou de sortie, un peu commefopen
fonctionne pour les fichiers. Par exemple, si vous voulez lire la sortie de votre programme, vous pouvez utiliserpopen("program", "r")
. D'autre part, si vous voulez écrire à son entrée, vous pouvez utiliserpopen("program", "w")
. Mac OS X permet également der+
, qui vous permet de lire la sortie et de l'écriture à l'entrée, mais cette capacité n'est pas standard et ne doit pas être invoqué pour la croix-plate-forme de code.Si vous voulez juste pour lancer un programme, vous pourriez aussi bien utiliser le
system
fonction, qui ne que et attend jusqu'à ce que le programme se termine, à quel point il retourne le code d'état.system
appelle en fait la coque de travail, de sorte que les arguments seront soumis à l'expansion (variables d'environnement, ~, etc).MODIFIER à la Suite de votre commentaire que
system("Microsoft Word.app")
ne fonctionne pas comme vous le souhaitez: il y a plusieurs raisons à cela, en fait. En commençant par le message que vous obtenez: c'est parce que ce que vous avez écrit est équivalent à l'ouverture d'une fenêtre de terminal et en tapantMicrosoft Word.app
. En d'autres termes, il essaie de trouver un programme appelé "Microsoft", puis passer à l'argument "Mot.app". Vous devez citer le nom du programme ou de l'évasion des espaces pour avoir le shell comprendre c'est tout un programme nom et non pas le nom d'un programme alors un argument:system("Microsoft\ Word.app")
Maintenant, cela devrait se plaindre en disant que le shell ne peut pas trouver le programme "Microsoft Word.app", qui est déjà un pas en avant.
C'est parce que sur Mac OS,
app
fichiers ne sont pas des fichiers exécutables: ils sont les dossiers que la recherche vous permet de trouver en un seul fichier. Vous pouvez le vérifier en le ctrl+clic (ou un clic droit) d'une application et en sélectionnant "Afficher le contenu du paquet" (ce qui permettra d'ouvrir le dossier app). Le réel de l'exécutable de Microsoft Word.l'app doit être quelque part le long du chemin deMicrosoft Word.app/Contents/MacOS/Microsoft Word
.Comme vous pouvez le voir, c'est se genre de complexe. Heureusement, Apple vous offre le
open
exécutable, qui peut utiliser un tas d'OS de services à la figure de ces détails. Il permet de lancer des applications de la manière suivante:Cela devrait lancer Word. (Remarquez comment vous vous encore besoin pour échapper à la des espaces.) Dans le plus pur du code C, que vous obtiendrez quelque chose comme ceci:
Si vous choisissez d'utiliser Objective-C et Cocoa, cependant, il y a un moyen très simple pour les applications ouvertes:
NSString
les objets peuvent être créés à partir de chaîne C assez facilement:.m
au lieu de.c
.Il serait préférable d'utiliser
system(3)
à cette fin.La
popen(3)
établir un pipeline qui peut être lue ou écrite par l'appelant. Mais GUI ne pas utiliser l'entrée standard et la sortie standard, ils se connectent à l'interface graphique du serveur, parfois appelé le la fenêtre "serveur". Ce serveur est déjà en cours d'exécution et a déjà décidé de ce que son entrée au clavier, et il est toujours écrit sa sortie de l'appareil vidéo.Pour démarrer une .app en fait, vous devez exécuter le ouvert(1) programme, alors essayez quelque chose comme: