2016-05-08 8 views
0

Wer weiß, wie ich das beheben kann?C - Popen zeigt keine richtige Ausgabe

char bash_cmd[256] = "curl"; 
char buffer[1000]; 
FILE *pipe; 
int len; 

pipe = popen(bash_cmd, "r"); 


if (NULL == pipe) { 
    perror("pipe"); 
    exit(1); 
} 
fgets(buffer, sizeof(buffer), pipe); 
printf("OUTPUT: %s", buffer); 
pclose(pipe); 

Der obige Code snippit kehrt die folgenden:

OUTPUT: (�3B 

statt dessen, was er zurückgespielt werden sollte, das ist:

curl: try 'curl --help' or 'curl --manual' for more information 

Irgend etwas stimmt nicht, ich kann nicht herausfinden Was. Wenn ich "curl" durch zB "ls -la" ersetze, funktioniert es gut, aber aus welchem ​​Grund auch immer, wenn ich curl verwende, speichert es die Ausgabe nicht richtig im Puffer. Was könnte ich tun, um das zu beheben? Vielen Dank im Voraus

Auch "Curl" mit dem vollständigen Pfad zum Curl zu ersetzen, (/ usr/bin/curl) funktioniert auch nicht. ; (

+1

Zunächst haben Sie den Rückgabewert Ihrer Funktionen nicht überprüft. –

Antwort

1

Wenn ich deinen Code ausführe, finde ich, dass die Ausgabe tatsächlich ungefähr das ist, was du beschreibst, aber dass die Ausgabe, die du erwartest auch gedruckt unmittelbar vorher. Es scheint daher sehr wahrscheinlich, dass curl t drucken Er verwendet die Nachricht an seine stderr anstatt an seine stdout, wie es in der Tat tun sollte.

Sie überprüfen nicht den Rückgabewert von fgets(); Ich vermute, Sie würden feststellen, dass es NULL ist, dass das Ende des Streams aufgetreten ist, bevor alle Daten gelesen wurden. In diesem Fall glaube ich nicht fgets() ändert den bereitgestellten Puffer.

Wenn Sie curl ‚s stderr zusätzlich zu seiner stdout aufnehmen möchten, dann können Sie E/A-Umleitung auf das Problem anwenden:

char bash_cmd[256] = "curl 2>&1"; 

Das ist nicht -Familie mit dem execve() (direkt) funktionieren würde, Funktionen, aber popen() führt den gegebenen Befehl über eine Shell, die den Umleitungs-Operator gut behandeln sollte.

Für allgemeine Zwecke jedoch möglicherweise Kombination von curl Ausgabe und Fehler Streams möglicherweise nicht was Sie wollen. Wenn sowohl die reale Ausgabe als auch die echte Diagnose ausgegeben würden, würden sie sich vermischen.

+0

Das hat es behoben. Danke – BradyUnger

+0

Duplikate meiner Antwort :( – augurar

0

Die Ausgabe, die Sie von curl erwarten wird sich stderr nicht stdout In der Tat nichts zu stdout geschrieben Die Ausgabe Sie drucken die nicht initialisierten Inhalt des Puffers ist

Der Code sollte die Rückkehr überprüfen... Wert von fgets, der Null sein wird, wenn keine Zeichen gelesen wurden (oder wenn ein Fehler auftrat)