Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ C / C++ (ANSI-Standard) » system is bad

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 <
010
22.10.2004, 13:43 Uhr
derphilipder



Ich weiß gar nicht, wie ich in einer Konsolenanwendung unter XP ohne system("cls") den Inhalt lösche...

Wie gehtn des?
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
22.10.2004, 13:45 Uhr
virtual
Sexiest Bit alive
(Operator)


@derphilpder
Irgendwie gehts, cls machts ja auch. Ist aber kein ANSI.
--
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
012
22.10.2004, 13:52 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


irgendwie SetConsoleAttribute usw, einfach mal forensuche benutzen. diese ganzen *Console*-Funktionen ersetzen dir vieles (Auch text farbig usw sogar OHNE ansi.sys)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
23.10.2004, 13:54 Uhr
~mike
Gast


Hi!
Hmm. Also ich hab gelesen, dass system ein fork startet alla:

C++:
#include  <sys/types.h>
#include  <sys/wait.h>
#include  <errno.h>
#include  <unistd.h>

int  system(const char *kdozeile)   /*--- Version ohne Signalbehandlung ---*/
{
   pid_t   pid;
   int     status;

   if (kdozeile == NULL)
      return(1);   /* In Unix ist immer Kommandoprozessor vorhanden */

   if ( (pid=fork()) < 0)
      status = -1;

   else if (pid == 0) {
      execl("/bin/sh", "sh", "-c", kdozeile, NULL);
      _exit(127);

   } else
      while (waitpid(pid, &status, 0) < 0)
         if (errno != EINTR) {
            status = -1;
            break;
         }
  
   return(status);
}




Vorteil: system kümmert sich ums Fehlerhandling selbst. Ich behaupte mal, system kann man je nach Bedarf einsetzen wenn man die Übergabe vorher überprüft - oder so

mfg

Dieser Post wurde am 23.10.2004 um 13:56 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
25.10.2004, 09:25 Uhr
virtual
Sexiest Bit alive
(Operator)


@mike
Dass beim execl das /bin/sh wirklich hardcodiert ist, möchte ich mal bezweifeln. Denkbar ist, daß man eine entsprechende Vereinfachung in der Literatur macht, um das anonsten von dir richtig zitierte Prinzip nicht zu kompliziert zu machen. Ansonsten sind nach wie vor die Nachteile, die ich nannte, nicht ausgeräumt.

Was die Fehlerbehandlung angeht: zum einen ists so, daß in dem von Dir zitierten Code auch nicht alle Fehler abegefangen werden (execl kann auch schiefgehen), zum anderen kann man am Fehlercode, den system zurückliefert, auch nicht besonders viel erkennen, außer daß es eben gut, oder eben "irgendwie" falsch gelaufen ist.

Ich weiß, daß Fehlerbehandlung ist, um das sich viele gerne drücken; nur leider ist führt die Verwendung von System in letzter konsequenz auch nur zur meldung "Irgendwas ist schiefgegangen", was schonmal ziemlicher Unfug ist, weil der Anwendner in der Regel wissen will, was denn nun nicht tut. Wenn du zB das nicht existente Programm "grmpf" ausführen willst, dann sollte man eigentlich sowas bekommen wie "Die Anwendung kann Hilfsprogramm 'grmpf' nicht nicht finden". Nur leider müsstest Du - um eine solche Meldung ausgeben - im Falle eines Falles eine bei weitem komplexere Fehlerbehandlung schreiben, als wenn du das System gleich fortlassen würdest und es per Hand machst.
--
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
015
26.10.2004, 11:03 Uhr
~mike
Gast


hmm. das stimmt. die fehlercodes kann man wirklich schwer interpretieren. das "Irgendwas ist schiefgegangen" ist dann schlussendlich auch schlecht - werde system auch auf meine schwarze liste setzen

Zur ergänzung noch der fbsd src; bin grade drübergestolpert. ein paar ansätze sind ident:

C++:
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)system.c    8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */

#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdlib.h>
#include <stddef.h>
#include <unistd.h>
#include <paths.h>
#include <errno.h>

int
__system(command)
    const char *command;
{
    pid_t pid, savedpid;
    int pstat;
    struct sigaction ign, intact, quitact;
    sigset_t newsigblock, oldsigblock;

    if (!command)        /* just checking... */
        return(1);

    /*
     * Ignore SIGINT and SIGQUIT, block SIGCHLD. Remember to save
     * existing signal dispositions.
     */

    ign.sa_handler = SIG_IGN;
    (void)sigemptyset(&ign.sa_mask);
    ign.sa_flags = 0;
    (void)sigaction(SIGINT, &ign, &intact);
    (void)sigaction(SIGQUIT, &ign, &quitact);
    (void)sigemptyset(&newsigblock);
    (void)sigaddset(&newsigblock, SIGCHLD);
    (void)sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock);
    switch(pid = fork()) {
    case -1:            /* error */
        break;
    case 0:                /* child */
        /*
         * Restore original signal dispositions and exec the command.
         */

        (void)sigaction(SIGINT, &intact, NULL);
        (void)sigaction(SIGQUIT,  &quitact, NULL);
        (void)sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
        execl(_PATH_BSHELL, "sh", "-c", command, (char *)NULL);
        _exit(127);
    default:            /* parent */
        savedpid = pid;
        do {
            pid = _wait4(savedpid, &pstat, 0, (struct rusage *)0);
        } while (pid == -1 && errno == EINTR);
        break;
    }
    (void)sigaction(SIGINT, &intact, NULL);
    (void)sigaction(SIGQUIT,  &quitact, NULL);
    (void)sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
    return(pid == -1 ? -1 : pstat);
}

#ifndef _THREAD_SAFE
__weak_reference(__system, system);
#endif



Jetzt versteh ich auch warums der autor vereinfacht hat

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
05.11.2004, 11:09 Uhr
virtual
Sexiest Bit alive
(Operator)


Okay, die diskussion ist ja deutlich zurückgegangen -> Ab in die FAQ
--
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
017
08.03.2005, 17:55 Uhr
Pablo
Supertux
(Operator)



Zitat von derphilipder:
Ich weiß gar nicht, wie ich in einer Konsolenanwendung unter XP ohne system("cls") den Inhalt lösche...

Wie gehtn des?


Ich weiß nicht, wozu du die Konsole überhaupt löschen willst? Das sollte eine Entscheidung des Anwender sein, nicht des Programmiers.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ FAQ C / C++ (ANSI-Standard) ]  


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: