Dir ist bewusst, dass ein FILE* nicht ein Filedeskriptor ist, sondern ein File-Handle den du z.B. für fread() und co. brauchst. Wogegen read() einen FD haben will (dies ist einfach eine Zahl die beim Öffnen einer Datei vom Kernel vergeben wird...)
Code:
#include <stdio.h>
/* unistd.h brauchst du gar nicht ... */
#include <stdlib.h>
int main( int argc, char *argv[] )
{
FILE *fd;
/* Buffer mit 0 initialisieren, dann kommt nicht am Schluss noch Müll
* wenn der Buffer zu gross ist.
*/
char buffer[1024] = {0};
fd = popen("ls", "r");
/* fread anstatt read
* Argument 1: Zielbuffer
* Argument 2: Blockgrösse zum Lesen
* Argument 3: Anzahl Blöcke zum Lesen
* Argument 4: FILE* Struktur von welcher gelesen wird
*/
fread(buffer, 512, sizeof(buffer)/512, fd );
printf("%s", buffer ); /* gibt "GNU" aus */
/* wenn schon exit() -- return 0 würde auch reichen --
* dann doch auch gerade mit den Standard-Exit-Werten EXIT_SUCCESS
* und EXIT_FAILURE, dann funktionierts nämlich auch auf
* einem System das nicht 0 als OK beim Rückgabewert hat wie
* erwartet
*/
exit(EXIT_SUCCESS);
}
Ist ganz kurz getestet. Wenn allerdings die Ausgabe von ls länger als dein Buffer ist wird einfach abgeschnitten.
Lesezeichen