Mit popen() öffnet ein Programm in der Kommandozeile?
Ist es möglich, öffnen Sie ein Programm mit einem anderen Programm? Zum Beispiel:
Ich möchte eine Befehlszeile-Anwendung, die in C, wird der Benutzer aufgefordert, geben Sie den Namen ein Programm (sagen wir Microsoft Word.app), und das Programm wird gestartet. Würde ich etwas wie das hier tun:
#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);
}
Jedoch, popen (), bittet mich für einen anderen char. Wie würde ich mich über die mit popen (), um das Programm zu öffnen?
EDIT: Der folgende code funktioniert!
#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);
}
Obwohl Ihr folgende code funktioniert, es hat das Potenzial, Absturz aus, die über die Puffer in strcat, den Sie hinzufügen, eine vielleicht 1000-Zeichen-array in ein Ziel, dass nur maximal 100 Zeichen. char openApp[100]; muss mindestens char openApp[100 + 1000 + 20];
InformationsquelleAutor Mike | 2011-05-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
popen
können Sie ein Programm starten und eine Datei-Deskriptor für Ihren Eingang oder Ausgang, ähnlich wiefopen
funktioniert für Dateien. Zum Beispiel, wenn Sie wollte, Lesen Sie die Ausgabe Ihres Programms, die Sie verwenden würdenpopen("program", "r")
. Auf der anderen Seite, wenn Sie möchten, schreiben Sie an Ihrem Eingang, die Sie verwenden würdenpopen("program", "w")
. Mac OS X ermöglicht auchr+
können Sie die Ausgabe Lesen und schreiben, um den input, sondern diese Funktion ist nicht standard und sollte nicht herangezogen werden, für cross-Plattform-code.Wenn Sie wollen einfach nur ein Programm starten, Sie könnte genauso gut verwenden Sie die
system
- Funktion, die das tut und wartet bis das Programm beendet wird, an welcher Stelle es liefert den status-code.system
tatsächlich ruft die shell zu arbeiten, so dass Argumente Durchlaufen expansion (Umgebungsvariablen, ~, etc).BEARBEITEN, nach deinem Kommentar, dass
system("Microsoft Word.app")
nicht funktioniert wie man es erwarten würde: es gibt mehrere Gründe für diese, eigentlich. Beginnend mit der Nachricht, die Sie erhalten: das ist, weil das, was du geschrieben hast ist äquivalent zu öffnen ein terminal-Fenster und TippenMicrosoft Word.app
. In anderen Worten, es versucht zu finden, ein Programm namens "Microsoft", dann übergeben Sie das argument "zu Wort.app". Sie müsste entweder nennen Sie den Namen des Programms oder der Flucht der Räume, um die shell zu verstehen, es ist ein ganzes Programm-name und kein Programm-name, dann ein argument:system("Microsoft\ Word.app")
Nun, dies sollte sich beschweren, sagen, dass die shell nicht finden können, das Programm "Microsoft Word.app", das ist schon ein Schritt nach vorne.
Dies ist, da auf Mac OS
app
Dateien sind keine ausführbaren Dateien: Sie sind Ordner, die im Finder angezeigt werden in einer einzigen Datei. Sie können überprüfen, dass durch Strg+Klick (oder Rechte Maustaste) auf eine app und wählen Sie "Paketinhalt Zeigen" (dieser öffnet den app-Ordner). Die eigentliche ausführbare Datei für Microsoft Word.app muss irgendwo auf dem Weg vonMicrosoft Word.app/Contents/MacOS/Microsoft Word
.Wie Sie sehen können, das ist irgendwie immer komplexer. Glücklicherweise bietet Apple die
open
ausführbare Datei, die eine Reihe von OS-services, um herauszufinden, die details. Es ermöglicht das starten von Anwendungen in der folgenden Weise:Dies sollte starten Sie Word. (Beachten Sie, wie Sie noch zu entkommen müssen die Leerzeichen). In reinen C-code, das würde Sie etwas erhalten wie:
Wenn du Objective-C und Cocoa, es gibt jedoch eine sehr einfache Möglichkeit zum öffnen von Anwendungen:
NSString
Objekte können erstellt werden, aus C-saite leicht genug:Oh, ich bin mit einem Mac
Ich bin fertig meine Antwort. Sorry für die Verspätung!
Also, wenn die Applikation nur ein Wort würde ich nicht brauchen, um die Flucht der Räume?
genau. Allerdings, wenn Sie nicht bestätigen diese Eingabe, sollten Sie sicherstellen, dass Ihre Benutzer nicht eingeben, Programm-Namen, die schädlich sein könnten. Wenn Sie bereit sind, gehen Sie in Objective-C und nutzen Sie das Cocoa-framework, können Sie einfach starten Sie Programme mit "komplizierten" Namen (ich habe bearbeitet meine Antwort zu reflektieren).
InformationsquelleAutor zneak
Es wäre besser, verwenden
system(3)
für diesen Zweck.Den
popen(3)
Funktion baut eine pipeline, die gelesen oder geschrieben werden können durch die Anrufer. Aber GUI-Anwendungen verwenden nicht die standard-Eingabe und standard-Ausgabe, verbinden Sie die grafische Benutzeroberfläche von server, manchmal auch als das "Fenster " server". Diesem server bereits läuft und auch schon entschieden hat, was seine Tastatureingaben werden, und es ist immer schriftlich, seinen Ausgang mit dem video-Gerät.Starten .app sollten Sie ausführen, tatsächlich das öffnen(1) Programm, also versuchen Sie so etwas wie:
Dieser funktioniert! Danke!
InformationsquelleAutor DigitalRoss