2009-03-14 11 views
106

Powiel możliwe:
How can I run an external program from C and parse its output?C: Uruchom polecenie systemowe i pobierz dane wyjściowe?

Chcę uruchomić polecenie w Linuksie i uzyskać tekst zwracany co wyprowadza, ale ja nie chcesz ten tekst wydrukowany na ekranie . Czy istnieje bardziej elegancki sposób niż tworzenie pliku tymczasowego?

+1

Już omówiony wielokrotnie. – dmckee

+5

Oznaczone jako powielone, ale nie wskaż tego. Nie sądzę, że jest to idealne rozwiązanie. W tym samym czasie, kiedy mówisz, że jest duplikatem, będziesz na to wskazywał. Albo lepiej!! wykonać przekierowanie na podstawie liczby zduplikowanych reporterów. – erm3nda

Odpowiedz

4

Potrzebujesz jakiejś komunikacji między procesami. Użyj pipe lub współużytkowanego bufora.

198

Potrzebujesz funkcji "popen". Oto przykład uruchomienia polecenia "ls/etc" i wyprowadzenia na konsolę.

#include <stdio.h> 
#include <stdlib.h> 


int main(int argc, char *argv[]) 
{ 

    FILE *fp; 
    char path[1035]; 

    /* Open the command for reading. */ 
    fp = popen("/bin/ls /etc/", "r"); 
    if (fp == NULL) { 
    printf("Failed to run command\n"); 
    exit(1); 
    } 

    /* Read the output a line at a time - output it. */ 
    while (fgets(path, sizeof(path)-1, fp) != NULL) { 
    printf("%s", path); 
    } 

    /* close */ 
    pclose(fp); 

    return 0; 
} 
+1

Przekierowanie stderr na stdout może być dobrym pomysłem, więc możesz złapać błędy. –

+0

Jak przekierować stderr na stdout? –

+8

powinieneś użyć 'fgets (ścieżka, sizeof (ścieżka), fp)' not' sizeof (path) -1'. przeczytaj instrukcję – user102008

-6

Zwykle, jeśli polecenie jest programem zewnętrznym, można skorzystać z systemu operacyjnego, aby uzyskać pomoc.

command > file_output.txt 

Więc kod C robiłbym coś

exec("command > file_output.txt"); 

Następnie można użyć pliku file_output.txt.

+1

Plakat wyraźnie wyklucza użycie plików tymczasowych, ale jest to poprawne podejście w niektórych przypadkach. Upewnij się tylko, że nie używasz statycznej nazwy pliku, użyj bezpiecznej, losowej nazwy pliku lub otwierasz się w celu dowiązania symbolicznego do ataków, które są problemami bezpieczeństwa .. –

+5

ta odpowiedź jest całkowicie niepoprawna, ponieważ argument przekazany do exec nie jest poleceniem powłoki. – Alnitak

+0

@Alnitak ale to * jest * przykładem ... kogo to obchodzi, jeśli argument nie jest faktycznym poleceniem - czy nie jest to oczywiście * nie * polecenie? –

Powiązane problemy