échec de l'utilisation de popen() en C?
Je peux exécuter la commande suivante
xwd -root | xwdtopnm | pnmtojpeg > screen.jpg
dans un terminal sous linux et il va produire une capture d'écran de mon écran actuel.
J'essaie de faire ce qui suit avec le 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);
}
puis-je compiler et exécuter le programme ./popen > screen.jpg
mais le fichier résultant screen.jpg est unrecongizable. Comment puis-je faire ce que je peux pipe à travers mon programme correctement?
OriginalL'auteur | 2009-05-08
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas utiliser
fgets
etputs
pour traiter des données binaires.fgets
va s'arrêter quand il voit un retour à la ligne. Pire,puts
sera de sortie supplémentaire des sauts de ligne et il sera également arrêter quand il s'agit d'un \0. Utilisationfread
etfwrite
à la place.Désolé, je voulais dire fread et fwrite, pas lire et écrire. (juste édité ma réponse)
J'ai fini par utiliser la lecture/écriture de toute façon 😛
OriginalL'auteur Laurence Gonsalves
Les fonctions
fgets
etputs
ne sont pas destinés à être utilisés avec des données binaires comme des fichiers image. Ils doivent seulement être utilisés avec des chaînes de texte. En C, les chaînes de terminer par un octet nul ('\0'
). Depuis c'est vraiment juste un zéro, il peut apparaître n'importe où dans un fichier binaire. Disons queline[]
est rempli avec 256 caractères de données. Lorsque vous appelezputs
, la fonction lit la matrice jusqu'à ce qu'il rencontre un octet null suppose alors qu'il a atteint la fin de la chaîne et s'arrête. Depuis dans un fichier binaire d'un octet null peut apparaître n'importe où (et pas seulement à la fin du tableau), leputs
fonction pourrait facilement ne parviennent pas à imprimer les sections de vos données.Si j'étais vous, je serais la recherche de la
fread
etfwrite
fonctions et de les utiliser à la place. Sur une machine Linux, vous devez juste être capable de taperman 3 fread
à lire la documentation pour les deux fonctions.OriginalL'auteur Stephen Van Dahm
Pour ceux qui ont ce même problème, j'ai fini par enfin en train de travailler à l'aide de la Unix système de lecture/écriture des appels:
OriginalL'auteur
Sans tester votre code, j'ai l'hépatite a des doutes que "xwd -root | xwdtopnm | pnmtojpeg" fonctionne comme un argument en faveur d'une Pipe.
Je ne voudrais pas utiliser un programme C de toute façon pour un tel problème. L'utilisation d'un simple script Bash à la place.
Si vous connaissez le C++, essayez de Qt. doc.qt.io/qt-5/qscreen.html#grabWindow
OriginalL'auteur Chris