Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ohjelmien tulosteiden kaappaus

arcatan [12.12.2004 18:46:06]

#

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 ^_^

Antti Laaksonen [12.12.2004 18:52:14]

#

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.

arcatan [13.12.2004 16:08:49]

#

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");

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta