nicht erfolgreiche Verwendung von popen() in C?
Ich kann den folgenden Befehl ausführen
xwd -root | xwdtopnm | pnmtojpeg > screen.jpg
in ein terminal unter linux und es wird produzieren ein screenshot von meinem aktuellen Bildschirm.
Ich versuche, das mit dem folgenden code:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fpipe;
char *command="xwd -root | xwdtopnm | pnmtojpeg";
char line[256];
if ( !(fpipe = (FILE*)popen(command,"r")) )
{ //If fpipe is NULL
perror("Problems with pipe");
exit(1);
}
while ( fgets( line, sizeof line, fpipe))
{
//printf("%s", line);
puts(line);
}
pclose(fpipe);
}
dann habe ich das Programm kompilieren und ausführen ./popen > screen.jpg
aber die resultierende Datei screen.jpg ist unrecongizable. Wie kann ich dies tun, so dass ich die Leitung durch mein Programm korrekt?
InformationsquelleAutor | 2009-05-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nicht verwenden
fgets
undputs
für den Umgang mit binären Daten.fgets
wird, zu stoppen, Wann immer es sieht ein Zeilenumbruch. Schlimmer noch,puts
- Ausgabe wird zusätzliche Zeilenumbrüche und es wird auch beenden, wenn es läuft in eine \0. Verwendenfread
undfwrite
statt.Sorry, ich meinte mit fread und fwrite, der nicht Lesen und schreiben. (gerade bearbeitet meine Antwort)
Landete ich mit Lesen/schreiben sowieso 😛
InformationsquelleAutor Laurence Gonsalves
Funktionen
fgets
undputs
nicht verwendet werden soll, mit binären Daten, wie Bild-Dateien. Sie sollte nur verwendet werden, mit strings von text. In C sind strings mit einer null enden ('\0'
). Denn das ist wirklich nur eine null, es kann überall auftreten, in einer binären Datei. Lassen Sie uns sagen, dassline[]
ist gefüllt mit 256 Zeichen der Daten. Wenn Sie anrufenputs
die Funktion liest das array, bis auf ein null-byte, dann meint er erreichte das Ende der Schnur und Stoppt. Da in einer binären Datei ein null byte erscheinen mag, wird überall (und nicht nur am Ende des Arrays), dieputs
Funktion könnte leicht scheitern, drucken Sie die Abschnitte Ihrer Daten.Wenn ich du wäre, würde ich die Forschung der
fread
undfwrite
Funktionen und verwenden Sie Sie statt dessen. Auf einem Linux-Rechner sind, sollten Sie nur in der Lage sein zu gebenman 3 fread
zu Lesen Sie die Dokumentation, für beide Funktionen.InformationsquelleAutor Stephen Van Dahm
Für diejenigen, die das gleiche problem haben, landete ich schließlich bekommen es arbeitet durch die Verwendung der Unix-lese - /schreib-system-Aufrufe:
InformationsquelleAutor
Ohne testen Ihren code, ich hab Zweifel, dass "xwd -root | xwdtopnm | pnmtojpeg" funktioniert als argument für einen C - Rohr.
Ich würde nicht verwenden ein C-Programm sowieso für solch ein problem. Verwenden Sie ein einfaches Bash-Skript statt.
Wenn Sie wissen, C++, versuchen Qt. doc.qt.io/qt-5/qscreen.html#grabWindow
InformationsquelleAutor Chris