Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <sys/wait.h>
- #include <cstdlib>
- #include <sys/stat.h> // open()
- #include <signal.h> // signal()
- #include <fcntl.h> // open()
- #include <stdio.h> // printf(), ...
- #include <time.h> // time(), ...
- #include <string.h> // strtok()
- #include <iostream>
- #include <string>
- #include <X11/Xlib.h>
- #include <X11/keysym.h>
- #define MAXLINE 100
- #define MOD "exit with CTR C"
- using namespace std;
- int read_command(char *command, char *parameters[]) { // prompt for user input and read a command line
- char pfad[256];
- // *** Das Ausgeben des Aktuelen Pfades
- getcwd(pfad, 256); // Zwischenspeicher fuer den Pfad
- fprintf(stdout, "$ ");
- cout << pfad << "> " ; // Ausgabe des Aktuelen Pfads im Promt
- // ***************
- // *** Einlesen der eingaben in Command und parameters
- int i = 0;
- cin.getline(command,MAXLINE); // Lese eingabe von Prompt aus und schreibe sie in Command
- // *** Erstellen und eintragen einer Logfile
- time_t t;
- char* timechar; // Die Zeit Zwischenspeicehr um \n rauszuloesen
- timechar= ctime(&t); // Die Aktuele Zeit in timechar speichern
- timechar = strtok(timechar,"\n"); // \n herausloesen
- FILE* logfile; // Eine File anlegen
- logfile = fopen("logFile.txt", "a");// Die Logfile Oeffnen
- fprintf(logfile,"[%s] %s \n", timechar, command); // In die Logfile das Datum und den Komando speichern
- // ***************
- parameters[i++] = strtok(command," "); // Teile die Zeichenkette nach jedem Leerzeichen
- while(i<MAXLINE&&(parameters[i++] = strtok(NULL," ")) != NULL); //Schreibe die Teile der Zeichenkette in Parameters
- // ***************
- } // read_command
- void escapeHandler(int){
- char input;
- cout << " Wollen Sie die Shell beenden? (y/n)" << endl;
- cin >> input;
- if(input == 'y')
- exit(0);
- else
- return;
- }
- int main(int argc, char *argv[]) {
- int childPid;
- int status;
- char command[MAXLINE];
- char *parameters[MAXLINE];
- int noParams;
- bool backgroundCheck = false;
- chdir("/tmp");
- signal(SIGINT,escapeHandler); // CTR-C Handler
- while (1) {
- noParams = read_command(command, parameters); // read user input
- // *** Erkennen von &
- for(int i = 0; i<MAXLINE ; i++){
- if(parameters[i] == 0x0) // Wenn die Letzte Eingabe ereicht wurde und es kein & gibt springe raus und fuehre das Programm normal aus;
- break;
- else if(strcmp(parameters[i], "&") == 0){ // Vergleiche an der Possition i den Inhalt von parameters mit &
- parameters[i] = 0x0; // Entferne das & und Füge ein NULL ein
- backgroundCheck = true;
- break;
- }
- }
- // ***************
- // *** Abfangen von CD Befehlen
- if(strcmp(command, "cd") == 0){ // Es Wird geprüft ob der Befehl CD ist
- if(chdir(parameters[1])) // Führe chdir aus, wenn Pfad nicht Korrekt
- cout << "Pfad nicht gefunden"<< endl; // wird Fehlermeldung ausgegeben
- }
- // ***************
- else if ((childPid = fork()) == -1) { // create process
- fprintf(stderr, "can't fork!\n");
- exit(3);
- } else if (childPid == 0) { // child process
- execvp(command, parameters); // executes command
- exit(3);
- } else { // father
- if(backgroundCheck){
- waitpid(childPid,NULL,WNOHANG); // Erstelle Das Kind ohne auf das Kind zu Warten
- signal(SIGCHLD,SIG_IGN); // Killt das Kind nach der Ausfuehrung , verhindert Zombies
- cout << "[" << childPid << "]" << endl; // Ausgabe der erzeugten Kinder PID
- backgroundCheck = false; // Hintergrundcheck abschalten
- }
- else
- waitpid(childPid, &status, WUNTRACED | WCONTINUED); // Erstelle das Kind und Warte auf Beendigung des Kindes
- }
- }
- close(0);
- exit(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement