myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Linux & BSD
Seite neu laden

Linux/Unix Shell mit C/C++

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 16.11.15, 17:22   #1
depream
Newbie
 
Registriert seit: Jan 2013
Beiträge: 64
Bedankt: 147
depream ist noch neu hier! | 0 Respekt Punkte
Standard Linux/Unix Shell mit C/C++

Hi @ all,

ich weiß nicht genau ob ich dieses Thema im richtigen Forum erstelle, aber ich habe leider keinen besseren gefunden welches zu meinem Problem passt.

Mein Problem:
Ich habe Übungsaufgaben für meine Prüfungsvorbereitung jedoch komme ich nicht mehr weiter, habe jede Mögliche Art und Weise meinerseits ausprobiert aber ich komme zu keinem Erfolg.

Code:
#include <string.h>
#include <cstdlib>
#include <iostream>
#include <unistd.h>  
#include <sys/wait.h>  
#include <sys/types.h>  
#include <signal.h> // für SIGINT

using namespace std;

pid_t childpid = 0;

// SIGINT (Ctrl+C) = Unterbrechung eines Prozesses
// Beispiel: firefox -> Ctrl+C unterbricht den Prozess!

void signalhandler_SIGINT(int signum) {
    cout << endl;
    cout << "Ein SIGINT wurde erkannt!\n";
}


// SIGTSTP (Ctrl+Z) = Anhalten eines Prozesses

void signalhandler_SIGTSTP(int signum) {
    //    if (childpid!=0){
    //        vpid.push_back(childpid);
    //        cout << "Stopped "<< child
    //        pid<<"\n";
    //        kill(childpid,SIGTSTP);
    //        childpid=0;
    //    }
    cout << "\nCaught SIGTSTP\n";
}

// Bringt einen "angehaltenen Prozess" durch 'Ctrl+C' in den Vordergrund!

void fg() {
    ;
}

// Zerlegt die "Getline"

void zerlegen(char *line, char **argv) {
    while (*line != '\0') {
        while (*line == ' ' || *line == '\t' || *line == '\n') {
            *line++ = '\0';
        }
        *argv++ = line;
        while (*line != '\0' && *line != ' ' && *line != '\t' && *line != '\n') {
            line++;
        }
    }
    *argv = '\0';
}

// Prüft ob ein &-Symbol im Char enthalten ist

bool aufUNDpruefen(char *argv) {
    for (int i = 0; i <= sizeof (argv); i++) {
        if (argv[i] == '&') {
            return true;
        }
    }
}

// Falls ein &-Zeichen vorhanden ist wird dieser gelöscht

char* UNDentfernen(char *argv) {
    for (int i = 0; i <= sizeof (argv); i++) {
        if (argv[i] == '&') {
            argv[i] = '\0';
            return argv;
        }
    }
}

void ausfuehren(char **argv) {
    pid_t pid = fork();

    bool containsAnd = false;

    containsAnd = aufUNDpruefen(*argv);

    if (containsAnd == true) {
        *argv = UNDentfernen(*argv);
    }

    int status;
    // Ein Fork darf nicht kleiner 0 sein, sonst schlägt dieser fehl!
    if (pid < 0) {
        cout << "FEHLER: 'forking' eines Kind-Prozesses fehlgeschlagen!\n";
        exit(1);

        // KIND-PROZESS:
        // Erst wenn die PID uns eine 0 zurückgibt kommen wir in das Kindprozess!!
    } else if (pid == 0) {
        if (execvp(*argv, argv) < 0) {
            // Zum Hinweis 5:
            // Falls das COMMAND nicht exisiert kommt es zum ERROR
            cout << "FEHLER: 'exec'!\n";
            exit(1);
        }

        //ELTERN-PROZESS:
        //da der Wert nur noch größer 0 sein kann also, PID > 0!
    } else {
        if (containsAnd == true) {
            ;
        }
        while (waitpid(pid, &status, WNOHANG) != pid) { // Wartet auf Beendigung des aktuellen Prozesses
                ;  
        }
    }
}

int main() {

    signal(SIGINT, signalhandler_SIGINT);
    signal(SIGTSTP, signalhandler_SIGTSTP);
    cout << "Signal Handler Installed\n";

    char line[1024];
    char *argv[64];

    //    if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) {
    //        exit(1);
    //    }

    while (1) {
        cout << "SHELL-COMMAND: ";
        cin.getline(line, 1024);

        cout << "\n";
        zerlegen(line, argv);
        // Vergleiche ob Eingabe ein Logout ist [Aufgabe 1.4]
        if (strcmp(argv[0], "logout") == 0) {
            exit(0);
        } 
        ausfuehren(argv);
    }
    return 0;
}
Das ist mein bisheriger Code, dieser sei richtig, wobei es bestimmt ein Paar Verbesserungsvorschläge gibt



Das ist meine Aufgabenstellung. Da es leider keinen bestimmte Lösung gibt würde ich gerne mal hoffen, dass mir jemand behilflich sein könnte.

Ich erwarte keinen fertigen Code, besser wäre es, denn so verstehe ich einiges um so besser.

Danke im voraus.
depream ist offline   Mit Zitat antworten
Ungelesen 21.11.15, 15:06   #2
fightclub1
Anfänger
 
Registriert seit: Feb 2015
Beiträge: 1
Bedankt: 0
fightclub1 ist noch neu hier! | 3 Respekt Punkte
Standard

Hmm, sieht so aus, als ob Du ein paar ganz grundsätzliche Verständnisprobleme hast.

- Signal-Callbacks sind ja zumindest registriert

- der Kommando-Parser ist grottig
-> ein sizeof( char* ) liefert was anderes als ein strlen(), so in aufUNDpruefen, UNDentfernen
-> Grundlagen von Strings in C!

- der Executer ist auch nix besonderes
-> Null-Pointer werden dereferenziert ohne Prüfung auf Gültigkeit (*argv)
-> Grundlagen Pointer in C!

Btw:
char buf[64];
char* buf[64];

sind auch zwei verschieden Paar Schuhe...

Das sind aber Verständnisfragen, die du selber lösen musst. Literatur-Tipp: K&R: "Programmieren in C" oder Eckel: Thinking in C++
fightclub1 ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:23 Uhr.


Sitemap

().