Tarvitsisin apua seuraavaan: haluaisin ohjelmastani ajaa toisen ohjelman ja kaapata sen tulosteen (stdout) oman ohjelmani käsiteltäväkseni. Haluaisin nimittäin tietää vapaan muistin määrän NetBSD-koneellani ohjelmani avulla, ja vaikuttaa siltä, että ainoa tapa tähän siten, että ohjelma voidaan ajaa ihan normaaleilla usereilla ja groupeilla, on kaapata jonkin toisen ohjelman ulosteet, jolla on pääsy näihin tietoihin (=vmstat). En nimittäin luota omiin taitoihin ihan hirmuisesti ^_^
Helppo tapa on käynnistellä ohjelma näin:
ohjelma | oma
Nyt oma saa syötteenään ohjelman tulostuksen.
Sitten voit käynnistää ohjelman näin:
ohjelma > tiedot.txt
Tulostus on luettavissa jälkeenpäin tiedostosta tiedot.txt.
Nuo ohjauskomennot toimivat ainakin DOSissa, muissa käyttöjärjestelmissä on varmaan samanlaisia juttuja.
Juu, toimivat nuo toki *NIX-varianteillakin, mutta tuollainen ei käy päinsä, koska ohjelma täytyy suorittaa ajon aikana useamman kerran. Joka tapauksessa, fijusal auttoi minua löytämään ratkaisun, joka siis NetBSD:llä on tälläinen
#include <sys/stat.h> #include <unistd.h> #include <errno.h> int main (int argc, char **argv) { int fildes[2]; int done = 0; char buf [1025]; char *newargs[] = { "vmstat", NULL }; pid_t lapsi; if (pipe(fildes) < 0) { printf("pipe error %d: %s", errno, strerror(errno)); return 1; } switch( lapsi = fork() ) { case 0: close(fildes[0]); if (dup2(fildes[1], STDOUT_FILENO) < 0) { printf("dup2 error %d: %s\n", errno, strerror(errno)); return 1; } if (execvp("vmstat", newargs) < 0) { printf("execvp error %d: %s\n", errno, strerror(errno)); return 1; } _exit(1); break; default: close(fildes[1]); for (;;) { memset(buf,0,1025); done = read(fildes[0], buf, 1024); if (done < 0) { printf("read error %d: %s\n", errno, strerror(errno)); break; } else if (buf[0] == 0) { break; } else { printf("%s", buf); } } waitpid(lapsi, NULL, 0); } return 0; }
edit: ai, mutta ehkä tarkoititkin, että tekisin tyyliin system("vmstat > tiedot.txt");
Aihe on jo aika vanha, joten et voi enää vastata siihen.