Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » pipes oder auf fremdprogramminput/output direkt steuern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.01.2003, 19:42 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
hat jemand ein bsp für mich wie man sowas realisiert:

pipe -> programm start
lesen aus pipe (programm output)
schreiben in pipe (programm führt das aus was ich reinschreib)

und alles möglichst so das es unter linux funktioniert

thx
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.01.2003, 09:23 Uhr
~0xdeadbeef
Gast


Das Programm sollte von stdin lesen - würde ich zumindest vermuten - von daher solltest du genau dahin schreiben. Versuch mal, irgendwas nach /dev/console zu schreiben, während das Programm aktiv ist. Und schreib danach, ob's funktioniert hat.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.01.2003, 10:00 Uhr
virtual
Sexiest Bit alive
(Operator)


Hallo,

Prinzipiell geht das, mangels Zeit kann ich Dir aber kein komplettes Beispiel liefern (oder du wartest bis nach dem Wochenende). Das was Du willst nennt sich "Coprozess". Aber mal langsam:

Wenn Du nur die Eingabe oder nur die Ausgabe kontrollieren willst, kannst Du popen nehmen. Das ist relativ leicht zu bedienen und Du solltest Dir überlegen, ob du dies nicht vorziehen möchtest. Ein Coprozess ist ungleich komplizierter. Ohne jetzt auf alle Hintergründe einzugehen mußt Du in etwa so vorgehen:

1. Du rufts zweimal pipe(2) auf. Daruch bekommst du zwei Filedescriptorpaare, nennen wir sie mal pipe1 und pipe2. Das, was nach pipe1[0] geschrieben wird, kann man in pipe1[1] auslesen; analoges gilt natürlich für pipe2. Diese Descriptorpaare sind also miteinander verbunden.

2. Du rufst fork(2) auf. Wie alles andere auch, werden auch die offenen Descriptoren in den entstehenden Childprocess kopiert; die Assoziation bleibt auch erhalten - besser noch: die Assoziation der pipe bleibt über die Processgrenzen erhalten.

3. Du schliesst im Parent process pipe1[0] sowie pipe2[1]. Im Child process schliesst Du pipe1[1] und pipe2[0]. Dies bewirkt, daß wenn der Parent nach pipe1[1] schreibt, das Child dies aus pipe1[0] lesen kann; umgekehrt kann Parent aus pipe2[0] lesen, was Child nach pipe2[1] geschrieben hat.

4. Im Child wird man nun üblichweise stdin und stdout mit den Enden der Pipes verbinden wollen und anschliessend ein execl (o.ae) aufrufen wollen. Also muß im Child ein dup2() für jedes Pipe Ende abgesetzt werden; nicht vergessen danach die originalen Pipedescriptoren zu schliessen!

5. Im Parent ist eigenlich nun alles Ready to use, wenn man sich Damit begnügt, daß man über Systemcalls mit dem Child reden. Wenn Du mit hilfe von stdio.h - Routinen wie zB fprintf arbeiten willst, wirst Du hier auch mittels fopen und dup2 dir ein FILE* basteln müssen (ist aber in der Regel alles nicht notwendig)

Je nach ausbaustufe Deines Programms solltest Du ggf. noch eine Pipe für stderr bauen sowie einen Signalhandler für SIGPIPE implementieren.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.01.2003, 14:53 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


@virtual: dann warte ich doch lieber bis zum wochenende

@0xdeadbeef: das probier ich mal aus, funktioniert das auch WENN man da programm per screen -dmS ... gestartet hat?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.06.2003, 09:53 Uhr
Tody



Hallo zusammen!

ich habe eben diesen thread hier gefunden und wollte da mal drin rum bohren. ich möchte nämlich auch was in eine konsole schreiben nachdem ich darin eine programm gestartet hab.
ich habe das problem schon in einem anderen thread geäußert aber ich bin erst kürzlich auf das thema pipes gestoßen.

bis jetzt habe ich es geschafft, mir nach ausführen eines createprocess() die "antwort" über eine pipe ausgeben zu lassen. allerdings schaffe ich es nicht die pipe zu erstellen, mit der ich dann wieder, zu einem bestimmten zeitpunkt, in die mit createprocess erstellte konsole schreiben kann.

hier ist mein bisheriger code:


C++:
#include "stdafx.h"

int cmd(char *cmd, char *output, DWORD maxbuffer);

int _tmain(int argc, _TCHAR* argv[])
{
    char output[50000];

    cmd("plink + parameter",output, 50000);

    MessageBox(0,output,"PipeTest",0);

    return 0;
}

int cmd(char *cmd, char *output, DWORD maxbuffer)
{
    HANDLE readHandle;
    HANDLE writeHandle;
    HANDLE stdHandle;
    DWORD bytesRead;
    SECURITY_ATTRIBUTES sa;
    PROCESS_INFORMATION pi;
    STARTUPINFO si;
    
    ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES));
    ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
    ZeroMemory(&si,sizeof(STARTUPINFO));

    sa.bInheritHandle=true;
    sa.lpSecurityDescriptor=NULL;
    sa.nLength=sizeof(SECURITY_ATTRIBUTES);
    si.cb=sizeof(STARTUPINFO);
    si.dwFlags=STARTF_USESHOWWINDOW;
    si.wShowWindow=SW_HIDE;

    if (!CreatePipe(&readHandle,&writeHandle,&sa,NULL))
    {
        OutputDebugString("cmd: CreatePipe failed!\n");
        return 0;
    }
    stdHandle=GetStdHandle(STD_OUTPUT_HANDLE);

    if (!SetStdHandle(STD_OUTPUT_HANDLE,writeHandle))
    {
        OutputDebugString("cmd: SetStdHandle(writeHandle) failed!\n");
        return 0;
    }
    if (!CreateProcess(NULL,cmd,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
    {
        OutputDebugString("cmd: CreateProcess failed!\n");
        return 0;
    }
    //Sleep(2000);

    if (!ReadFile(readHandle,output,maxbuffer,&bytesRead,NULL))
    {
        OutputDebugString("cmd: ReadFile failed!\n");
        return 0;
    }
    output[bytesRead]='\0';

    if (!SetStdHandle(STD_OUTPUT_HANDLE,stdHandle))
    {
        OutputDebugString("cmd: SetStdHandle(stdHandle) failed!\n");
        return 0;
    }
    if (!CloseHandle(readHandle))
    {
        OutputDebugString("cmd: CloseHandle(readHandle) failed!\n");
    }
    if (!CloseHandle(writeHandle))
    {
        OutputDebugString("cmd: CloseHandle(writeHandle) failed!\n");
    }
    return 1;
}  

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.06.2003, 09:55 Uhr
Tody



natürlich passiert mir sowas!
ich war mal wieder zu schnell und habe ins falsche forum gepostet.
sollte eigentlich in winapi.

sorry!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.06.2003, 14:35 Uhr
Pablo
Supertux
(Operator)



Zitat:
Tody postete

Errare Humanum Est! ;o)



Da hast du aber Recht!

----------------------------------------------------------
Ich kenn ein Buch, das heisst Linux Systemprogrammierung (aber ich weiss nicht zur Zeit andere Sachen übers Buch, da ich in der Uni bin und dich hab das Buch zu Hause) , ich gluabe es ist ein gutes Buch und es gibt sehr schöne Beispielprogramme, wie man solche Sachen macht. Ich weiss, dass es sowas gibt, weil ich ein Beispielprogramm abgeschrieben hab.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 30.06.2003 um 14:38 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.06.2003, 18:43 Uhr
Pablo
Supertux
(Operator)


Also, das Buch heißt Linux · Unix Systemprogrammierung von Helmut Herold, Verlag ADDISON-WESLEY.
Es ist ein ziemlich dickes Buch mit schönen Sachen für Linux fans!

Übrigens, im Kapitel 19 steht, das was du wills:t:
Stream Pipes, Client-Server-Realisierungen und netzwerkprogrammierung, und im 17. Kapitel Pipes und FIFOs

--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 30.06.2003 um 18:45 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.07.2003, 10:21 Uhr
Tody



@ Pablo
danke für deine buchtips. werde ich mir mal ansehen.

ich habe jetzt mit hilfe der msdn das problem fast gelöst. durch etwas rumprobieren habe ich in etwa rausgefunden wie die pipes funktionieren. ich glaube, dass ich es nicht richtig erklären könnte aber es funktioniert fast so wie ich es will.

danke!

gruß
tody
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ GNU/Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: