linux-Befehl ausführen, indem Sie popen auf C-code
Habe ich den code unten, dass ich finden den thread auf hier zu verwenden, die popen
Funktion
int main(int argc,char *argv[]){
FILE* file = popen("ntpdate", "r");
char buffer[100];
fscanf(file, "%100s", buffer);
pclose(file);
printf("buffer is :%s\n", buffer);
return 0;
}
It-Ausgänge:
21 Apr 03:03:03 ntpdate[4393]: no server can be used, exiting
buffer is:
warum printf
keine Ausgabe etwas? Wenn ich ls
als Befehl, dann printf Ausgänge der ls-Ausgang. was mache ich falsch ntpdate
ausführen?
Wenn ich den code auszuführen unten (bezogen auf die Webseite)
#define COMMAND_LEN 8
#define DATA_SIZE 512
int main(int argc,char *argv[]){
FILE *pf;
char command[COMMAND_LEN];
char data[DATA_SIZE];
//Execute a process listing
sprintf(command, "ntpdate");
//Setup our pipe for reading and execute our command.
pf = popen(command,"r");
if(!pf){
fprintf(stderr, "Could not open pipe for output.\n");
return;
}
//Grab data from process execution
fgets(data, DATA_SIZE , pf);
//Print grabbed data to the screen.
fprintf(stdout, "-%s-\n",data);
if (pclose(pf) != 0)
fprintf(stderr," Error: Failed to close command stream \n");
return 0;
}
Bekomme ich
21 Apr 03:15:45 ntpdate[5334]: no servers can be used, exiting
-�2}�����"|�4#|�-
Error: Failed to close command stream
welche Unrecht auf die codes oben?
- Wenn wir das tun
ntpdate 2>/dev/null
können wir sehen, dass es mitstderr
so müssen Sie umleitenstderr
zu sehen-Ausgang
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da der Ausgang wird
stderr
müssen Sie umleitenstderr
etwa so:dieser leitet
stderr
zustdout
- und so sehen Sie Ausgabe von beiden. Zweite Ausgabefscanf
wird halt am ersten Platz, also können Sie ersetzen Sie mitfgets
:buffer is :21
hier, Server definiert sind/etc/ntp.conf
. wenn ichFILE* file = popen("ntpdate 79.99.6.190 2>&1", "r");
dass 79.99.6.190 ist ein ntp-server der pool.ntp.org . bin ich etwas fehlt? dies ist, wie genau ich den code pastebin.com/8g77zRF0Als Schafik Yaghmour richtig diagnostiziert, die Ausgabe, die Sie sehen aus
ntpdate
geschrieben ist (richtig) auf seine standard-Fehler, das ist das gleiche wie Ihre standard-Programme Fehler.Um die Fehlermeldungen geschickt, unten das Rohr, verwenden Sie:
Sendet die standard-Fehler-Ausgabe aus
ntpdate
auf die standard-Ausgabe von Befehl, der das Rohr, die Sie gerade Lesen, aus.Natürlich, wie sieht es mit
ntpdate
nicht gehen, um gut zu arbeiten, bis Sie so konfiguriert haben, dass etwas.