Ausführen von bash-Befehl und die Ausgabe in C
Hallo, ich habe einige Lösungen gesehen, die auf dem internet, alle von Ihnen sind im Grunde erstellen Sie eine Datei, aber ich wollen, speichern Sie Sie in ein array von char. Geschwindigkeit ist für mich wirklich wichtig und ich will nicht zu verbringen keine Zeit zum arbeiten auf der Festplatte. So popen()
ist nicht wirklich eine Lösung für mich.
popen
nicht öffnen Sie eine Datei. Es läuft ein Programm und verbindet die Ausgabe direkt in eine C-input-stream. Ich kenne den stream-Typ heißtFILE*
aber es ist nicht wirklich eine Datei.- Was ist Ihr Einwand gegen
popen
? Das wäre der normale Weg, dies zu tun. - prüfen Sie hier:theunixshell.blogspot.com/2013/01/...
- Wenn die Geschwindigkeit ist Ihr Hauptanliegen, warum sind Sie versuchen zum ausführen eines bash-Befehls in den ersten Platz?
- Auch, bitte Lesen Sie
man 3 popen
es enthält alles, was Sie wissen müssen, einschließlich, warumpopen
ist der Weg hier zu gehen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein funktionierendes code-snippet:
buffer
variable nichtbash_cmd
nachfgets
Nie vergessen Knuth sagt, dass "vorzeitige Optimierung ist die Wurzel allen übels". Mach dir keine sorgen über die performance, bis es ankommt, und dann Messen, bevor etwas zu tun. Außer für den sehr seltenen Situationen, den Wert Ihrer Zeit, ist viel höher als die Kosten des Programms ausgeführt wird.
Jon Bentley ' s "Schreiben effiziente Programme" (leider vergriffen, in seinem "Programming Pearls" ein Kapitel ist eine Zusammenfassung) ist eine ausführliche Diskussion auf, wie man Programme schneller laufen (wenn es lohnt); und nur als die allerletzte Maßnahme, squeeze-out die letzten möglichen 2% der Leistungen (nach dem schneiden Laufzeit nach unten durch die Hälfte) es empfiehlt änderungen, wie Sie vorschlagen. Das zitierte Buch enthält einige sehr unterhaltsame Krieg Geschichten von "performance-Optimierungen", die waren eine komplette Verschwendung (optimieren von code, die nicht immer verwendet, oprimize der code ausgeführt wird, während das Betriebssystem twiddles seinen Daumen, ...).
Wenn Sie Lesen Sie die manpage von popen, würden Sie Folgendes feststellen:
(Hervorhebung von mir)
Wie Sie sehen können, einen Anruf zu
popen
Ergebnisse in derstdout
von der Befehls-Pipe, die in Ihrem Programm durch eine I/O-stream -, das hat nichts zu tun mit disk I/O, sondern von der Kommunikation zwischen Prozessen vom Betriebssystem verwaltet.(Nebenbei: Es ist generell eine gute Idee, sich auf die grundlegende Funktionalität des Betriebssystems, innerhalb Grund, um gemeinsame Probleme zu lösen. Und da
popen
ist TeilPOSIX.1-2001
Sie können sich darauf verlassen, dass es verfügbar sein auf allen standards kompatibel operarting-Systemen, sogar windows)EDIT: wenn Sie mehr wissen wollen, Lesen Sie diese: http://linux.die.net/man/3/popen
Wenn die Geschwindigkeit für Sie wichtig ist, Sie können schreiben Sie Ihre eigene version des popen.
Kann es Sinn machen, da popen()
- erstellt eine pipe
- Gabeln
- führt die shell (sehr teuer!)
- die shell erstellt eine pipe, Gabeln, führt Ihr Programm
Ihre angepasste version reduzieren könnten, die Prozedur zu:
- erstellt eine pipe
- Gabeln
- führt Ihr Programm
Könnte man auch erweitern popen zur Steuerung der Befehle, die STDOUT, STDERR und STDIN getrennt.
Ich schrieb eine solche routine, sehen, https://github.com/rockdaboot/mget/blob/master/libmget/pipe.c
Es ist GPL.
Rufen Sie mget_popen3() mit der FILE-Zeiger oder mget_fd_popen3 (), mit Datei-Deskriptoren.
Zumindest, es sollte Ihnen eine Idee geben, wie es zu tun.
Tun Sie etwas dagegen, mit mehr als einem C-Programme?Wenn Sie nicht ,können Sie machen verwenden von der Befehl Linie Argumente. In der ersten C-Programm können Sie die folgenden
Den
SecondProgram
werden die "ausführbare" der zweite C-Programm, das Sie schreiben. In der zweiten C-Programm können Sie die Ausgabe des BefehlsYourCommand
als ein command line argument in derSecondProgram
. Für diesen Zweck können Sie beginnen, die main() der zweite C-Programm, wie untenArray
argv
wird die Ausgabe vonYourCommand
undargc
enthält die Anzahl der Elemente im arrayargv
.system
ist nie eine gute Idee