|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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++...
| |
|
|