/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Kald til ext. program fra c++ fil...
Fra : Beelze


Dato : 22-09-02 02:13

Hvordan kan man lave et kald fra C++ (Linux) til et andet program, f.eks. ls
og caputre outputtet?



 
 
Byrial Jensen (22-09-2002)
Kommentar
Fra : Byrial Jensen


Dato : 22-09-02 09:52

Beelze <johnni@nordata.dk> skrev:
> Hvordan kan man lave et kald fra C++ (Linux) til et andet program, f.eks. ls
> og caputre outputtet?

Du skal grundlæggende kigge på linux/unix-systemkaldene pipe, fork,
dup2, close og execve (eller en af exec varianterne). Herunder er
en simpel løsning i C. Den læser stdout fra det kaldte program
gennem en pipe. Princippet kan nemt udvides med stderr og stdin.

Jeg kan endnu ikke nok C++ til en C++-løsning, men jeg kunne godt
tænke mig at se en. Det drejer sig sikkert primært om at erstatte
fdopen()-kaldet som returnerer en FILE *, med noget som kan give en
istream ud fra en åben file descriptor.


// Kald "ls" og læs resultatet gennem en strøm.
// Tilføj selv manglende fejlcheck ...

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

int main (int argc, char *argv[])
{
int inpipe[2];
pipe (inpipe); // Create pipe to read output from child
pid_t pid = fork ();
if (pid == 0)
{
// The child
close (inpipe[0]); // Close read end of pipe
dup2 (inpipe[1], STDOUT_FILENO); // Copy write end of pipe to stdout
close (inpipe[1]); // Close write end of pipe

execlp ("ls", "ls", NULL);
}

// Parent
close (inpipe[1]); // Close write end of pipe
FILE *in = fdopen (inpipe[0], "r"); // Associate a stream with the pipe

int ch;
while ((ch = getc (in)) != EOF)
putchar (ch);
fclose (in);

int status;
wait (&status);
if (WIFSIGNALED (status))
{
printf ("Child process killed with signal %d.\n", WTERMSIG (status));
}
else if (WIFEXITED (status))
{
printf ("Child process returned %d.\n", WEXITSTATUS (status));
}
return 0;
}

Soeren Sandmann (22-09-2002)
Kommentar
Fra : Soeren Sandmann


Dato : 22-09-02 11:58

"Beelze" <johnni@nordata.dk> writes:

> Hvordan kan man lave et kald fra C++ (Linux) til et andet program, f.eks. ls
> og caputre outputtet?

Se på popen() og pclose().

Hvis du har brug for både at læse og skrive til det andet program, så
bliver du formentlig nødt til at bruge systemkaldene som Byrial skrev
om.


Beelze (23-09-2002)
Kommentar
Fra : Beelze


Dato : 23-09-02 12:32

"Beelze" <johnni@nordata.dk> skrev i en meddelelse
news:3d8d1931$0$62716$edfadb0f@dspool01.news.tele.dk...
> Hvordan kan man lave et kald fra C++ (Linux) til et andet program, f.eks.
ls
> og caputre outputtet?

Tak for hjælpen
Skal nok give svar fra mig når jeg har lavet det i C++...



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste