PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Standard Ein-/Ausgabe umlenken



joe2000
31-07-2001, 14:17
hi..

ich möchte von einem programm her ein anderes programm aufrufen und dessen stdin und stdout von meinem programm beschreiben bzw auslesen....

wie gehe ich da am besten vor ?

MfG Jörg

redhead
01-08-2001, 11:15
execute unix commands in 'c'; example:
#include{stdlib.h} // spitze Klammern verwenden (HTML)
int i = system("mkdir directory");
// if i==0, then the unix command was successful

Mit dem Befehl 'system' kannst Du also andere Programme aufrufen. Nun kann man natuerlich die Ausgaben mit '>' in eine Datei umlenken, die dann wieder vom Mutterprogramm verwendet werden kann. Ich hatte allerdings einige kleine Probleme mit den Pfaden; der 'system' Befehl scheint immer so ausgefuehrt zu werden, als wuerde man ihn im aktuellen Verzeichnis starten. 'cd' Befehle haben deswegen nicht so viel gebracht, stattdessen bin ich dann zu den vollen Dateinamen (incl. dem gesamten Pfad) uebergegangen und das hat dann auch funktioniert.

Ciao, redhead

[ 01. August 2001: Beitrag editiert von: redhead ]

mxxx
01-08-2001, 21:05
du kannst das auch ohne Umweg über ne File
machen mit pipe, fork, write, read und execX

das große X steht für viele Variationen
im Namen (es gibt viele exec funktionen.)

joe2000
01-08-2001, 22:38
mit fork usw schwebte mir auch so vor, aber was öffne ich um mit read und write zu arbeiten, brauche ja schliesslich einen deskriptor...

mxxx
02-08-2001, 20:59
pipe muss man soanwenden:

int filedesk[2];

pipe(filedes);

schau dir mal irgendwas über pipe an!

joe2000
03-08-2001, 16:37
das ist schon klar, das problem ist nur das ich stdin und stdout der anderen anwendung haben möchte. bei pipes muss doch die andere anwendung die pipe auch öffnen... ich möchte aber einfach nur ein programm starten und dessen standard ein/ausgabe beschreiben bzw auslesen

mxxx
03-08-2001, 19:23
du meinst, du musst den Code des Anderen programms auch ändern?
nein, so ist es nicht,
den wenn du ein Programm mit fork() konst
und dann mit dup2 oder mit fcntl den Filedeskriptor 1, oder 2 auf deine Pipe änderst.
Dann musst du mit exec... diesen code mit dem Anderen "überpsielen", aber die Filedeskriptioren 1 oder bzw. und 2 bleiben auf die Pipe gerichtet, d.h. du kannst ihm von deinem Program über die Pipe stdin schicken und aus der Pipe das stdout auslesen.

joe2000
04-08-2001, 13:49
ich glaub ich bin zu blöd dazu...

hier mal mein testprogramm. leider funktioniert das nicht ganz so wie ich will... was mach ich da noch falsch ?

btw wie kann ich eigentlich die eckigen klammern beim include hier einfügen ?

#include stdio.h
#include sys/types.h
#include unistd.h

int main()
{
pid_t pid2,retval;
int fd[2];
char buffer[1000];
int n=0;

if ((retval=fork())==0)
{
if (pipe(fd)==0)
{
dup2(STDOUT_FILENO,fd[1]);
dup2(STDIN_FILENO,fd[0]);
execlp("ls",NULL);
}
else
{
printf("konnte pipe nicht öffnen\n");
exit(0);
}
}
else if (retval >0)
{
pid2=retval;

if (pipe(fd)==-1)
{
printf("konnte pipe nicht öffnen\n");
exit(0);
}
else
{
n=read(fd[0],buffer,sizeof(buffer));
buffer[n]=0x00;
printf(">%s\n",buffer);
}
}
else printf("fork() nicht erfolgreich\n");

return 1;
}

[ 04. August 2001: Beitrag editiert von: joe2000 ]

mxxx
04-08-2001, 22:11
du kannst die Pipe nur so verwenden:

int fd[2];
pipe(fd);

dann kannst du in fd[0] von prog1 schreiben
und aus fd[1] von prog2 lesen

für deine Sache bruachst du dann
zwei Pipes!

jgbauman
04-08-2001, 22:16
Spitze Klammern gehen so ihn HTML: < fuer < und > fuer >

Ansonsten das pipe() vor dem fork()und die Argumente von dup2() umtauschen.
Um stdin zusaetzlich umzuleiten braeuchtest Du noch eine weitere pipe.


int main()
{
pid_t pid2,retval;
int fd[2];
char buffer[1000];
int n=0;

if (pipe(fd)!=0)
{
printf("konnte pipe nicht öffnen\n");
exit(0);
}

if ((retval=fork())==0)
{
dup2(fd[1], STDOUT_FILENO);
execlp("ls",NULL);
}
else if (retval >0)
{
pid2=retval;

n=read(fd[0],buffer,sizeof(buffer));
buffer[n]=0x00;
printf(">%s\n",buffer);
}
else printf("fork() nicht erfolgreich\n");

return 1;
}

joe2000
05-08-2001, 14:15
mist, ich glaub ich bin zu blöd dazu :(

ist das so richtig ? funktioniert irgendwie immer noch nicht :(

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>
int main()

{

    pid_t pid2,retval;

    int fd1[2];

    int fd2[2];

    char buffer[1000];

    int n=0;

    if (pipe(fd1)!=0)

    {

        printf("konnte pipe1 nicht
öffnen\n&quot ;);

        exit(0);

    }

   

    if (pipe(fd2)!=0)

    {

        printf("konnte pipe2 nicht
öffnen\n&quot ;);

        exit(0);

    }
    if ((retval=fork())==0)

    {

        dup2(fd1[0],STDIN_FILENO);

        dup2(fd2[1],STDOUT_FILENO);

        execl("ls",NULL);

    }

    else if (retval >0)

    {

        pid2=retval;

        while(1)

        {

           
n=read(fd1[0],buffer,sizeof(buffer));

            buffer[n]=0x00;

            printf(">%s\n",buffer);

        }

    }

    else printf("fork() nicht erfolgreich\n&quot ;);
    return 1;

}</p>

jgbauman
05-08-2001, 14:50
nachdem Du fd2 fuer stdout benutzt solltest Du auch von fd2 lesen anstatt von fd1

joe2000
05-08-2001, 15:05
ups. da ist was dran... aber funktionieren tuts trotzdem nicht :(