Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Ausgabe von Systemaufrufen komplett umleiten!

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 < [ 2 ]
000
10.10.2006, 16:08 Uhr
~RisingSun
Gast


Hallo!
Ich habe schon seit längerer Zeit folgendes Problem:
Wenn ich per system("command"); einen Befehl ausführe werden in der Konsole mögliche Fehlermeldungen des Programms ausgegeben SELBST wenn ich den output in eine Datei umleite (command > datei)!
Meine Vermutung daher, das Programm (zB route) verwendet cerr, was laut meinem schlauen Buch bewirkt, dass der entsprechende Text nicht im ausgabestrom sondern immer in der konsole ankommt.... Sogar mein versuch die programme mit pipe anzusteuern blieb erfolglos. Jedoch benötige ich die informationen von route nicht und dessen ausgabe stört gewaltig in meinen konsolenanwendungen! Gibt es da eine Lösung?

Herzlichen dank im Vorraus!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.10.2006, 16:17 Uhr
Blubber2063



Fork doch einfach und führe das Programm selber aus, dann kannst du vorher stdin, stdout und stderr umleiten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.10.2006, 17:11 Uhr
Pablo
Supertux
(Operator)


So einfach geht das nicht.

sowas wie system("command >file.txt 2>&1") würde ich vermeiden, denn du weißt nicht, ob du die Berechtigung hast, file.txt zu schreiben.

Du musst die Funktionen exec(3) benutzen. Also zuerst ein fork, dann musst du stdout/stderr duplizieren mit dup(2) oder dup2, also so etwas in der Art


C++:
pid_t child;
int df[2];

if(pipe(df) < 0)
{
  perror("pipe");
  exit(1);
}

child = fork();

if (child < 0) {
  perror("fork");
  close(df[0]);
  close(fd[1]);
  exit(1);
}

if(child)
{
   /* Vater */
   close(fd[1]); /* schreibende Seite der Pipe schliessen */
   waitpid(child, NULL, 0);
  
   /* Um stdout vom Programm zu lesen, einfach read(fd[0], buffer, len_of_buffer) benutzen */
} else {
    /* Kind */

   /* lesende Seite schließen */

   close(df[0]);

   if(fd[1] != STDOUT_FILENO) /* diese IF Anweisung ist sehr wichtig !!! */
   {
       if(dup2(df[1], STDOUT_FILENO) != STDOUT_FILENO)
       {
            perror("dup2");
            exit(1);
       }
    }

    execlp("sh", "-c", "command", NULL);
    exit(1);
}



das gleiche kann man mit STDERR machen, nochmal eine pipe anlegen und weiterleiten.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 10.10.2006 um 23:22 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.10.2006, 17:11 Uhr
Pler
Einer von Vielen
(Operator)


mit > leitest du ja auch nur stdout um. Du musst auch stderr umleiten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.10.2006, 18:46 Uhr
~RisingSun
Gast


Danke für die Antworten! Aber ich glaube dazu bin ich noch nicht in der Lage ... child und so etwas kommt erst ganz spät in dem Buch, nach dem ich lerne.... ich werde mir aber alles notieren!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.10.2006, 22:39 Uhr
Pablo
Supertux
(Operator)


tja, leider gibt es sonst keine andere vernüftige Lösung für dein Vorhaben
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.10.2006, 22:57 Uhr
Blubber2063



So kompliziert ist das nicht, du forkst, dann machst du die Umleitungen, am besten mit dup2, und dann machst du einen der vielen Exec Aufrufe. Danach musst du nur noch mit Sigaction einen Signalhandler für Sigchild installieren, damit dein Programm danach nicht unabgeholt im System bleibt. Viel mehr als den Code von Pablo brauchst du dafür nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.10.2006, 11:22 Uhr
Pler
Einer von Vielen
(Operator)



Zitat:
So kompliziert ist das nicht, du forkst, dann machst du die Umleitungen, am besten mit dup2, und dann machst du einen der vielen Exec Aufrufe. Danach musst du nur noch mit Sigaction einen Signalhandler für Sigchild installieren, damit dein Programm danach nicht unabgeholt im System bleibt. Viel mehr als den Code von Pablo brauchst du dafür nicht.

Naja ... Wenn jemand grad anfängt und wahrscheinlich noch nicht mal was von Signalen gehört hat wirds wohl doch nicht so leicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.10.2006, 11:42 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich würde es bei diesen Rahmenbedingungen mit popen machen:

C++:
FILE* cmd = popen("Dein_Commando 2>&1", "r"); // Führt das Kommando aus
// Hier kannst Du dier aussuchen, ob du lesen willst oder nicht. Im zweifel die zwei zeilen löschen:
int c;
while((c=fgetc(cmd))!=EOF) putchar(c);
// cmd schliessen
fclose(cmd);


--
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
009
11.10.2006, 14:33 Uhr
Pablo
Supertux
(Operator)


an popen habe ich auch gedacht, aber ich dachte popen wäre genauso böse wie system
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 11.10.2006 um 14:33 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: