Czy jest lepszy sposób to zrobić?Uzyskaj dane wyjściowe polecenia systemowego w programie C
Nie chcę tworzyć pliku pośrednika, a następnie go usunąć.
EDIT:
Tu nie chodzi o czytanie z pliku. Polecenie może brzmieć "ls" lub "echo" Hello world "
Czy jest lepszy sposób to zrobić?Uzyskaj dane wyjściowe polecenia systemowego w programie C
Nie chcę tworzyć pliku pośrednika, a następnie go usunąć.
EDIT:
Tu nie chodzi o czytanie z pliku. Polecenie może brzmieć "ls" lub "echo" Hello world "
Ok, byłem zmieszany w mojej drugiej odpowiedzi. W każdym razie filozofia w tej odpowiedzi jest taka sama. Możesz użyć bezpośrednio funkcji popen.
Wtedy masz coś takiego:
int numOfCPU;
FILE *fp = popen("grep -c ^processor /proc/cpuinfo", "r");
fscanf(fp, "%d", &numOfCPU);
pclose(fp);
Mam nadzieję, że będzie użyteczny.
Musisz użyć przekierowania i potoków, aby zrobić to, co próbujesz zrobić.
Zadzwoń pod numer , ale jeśli potrzebujesz czegoś bardziej elastycznego, np. Przekierowującego dane wejściowe lub bardziej bezpiecznego, np. Nie uruchamiającego łańcucha w powłoce, powinieneś wykonać ten przykład, biorąc od manualna strona potoku.
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int
main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;
if (argc != 2) {
fprintf(stderr, "Usage: %s <string>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* Child reads from pipe */
close(pipefd[1]); /* Close unused write end */
while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);
} else { /* Parent writes argv[1] to pipe */
close(pipefd[0]); /* Close unused read end */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
}
Należy zmodyfikować proces dziecko do korzystania dup2 przekierować standardowe wyjście do rury i następnie exec polecenie, które chcesz go uruchomić.
Stosując awk:
#include <stdlib.h>
#include <stdio.h>
void main()
{
int numOfCPU =0;
system ("awk '/processor/{numOfCPU++}END{print numOfCPU}' /proc/cpuinfo");
}
Czy ktoś może wyjaśnić, jak to działa? – tangrs
Wątpię, że działa ... – user172818
to kod C. Chciałem powiedzieć C++, ale potem zauważyłem PLIK *. – Dennis
Zamieniłem tag java na c, ponieważ kod znajduje się w c. – AlexR
możliwy duplikat [Jak mogę uruchomić zewnętrzny program z C i przeanalizować jego wyjście?] (Http://stackoverflow.com/questions/43116/how-can-i-run-an-external-program-from-c i przeanalizuj jego wyjście) – GSerg