Pequeno Shell Unix em C++

Publicado por Fernando (última atualização em 02/03/2018)

[ Hits: 3.562 ]

Homepage: https://github.com/phoemur/

Download shell.cpp




Pequeno Shell Unix em C++.

Compilação:

$ g++ -o shell shell.cpp -O3 -Wall -Wpedantic -std=c++11

  



Esconder código-fonte

// g++ -o shell shell.cpp -O3 -Wall -Wpedantic -std=c++11
#include <iostream>
#include <string>
#include <sstream>
#include <vector>

#include <sys/wait.h>
#include <unistd.h>

using namespace std;

vector<string> split_string(const string& input,
                            const char delimiter) 
{
    stringstream ss {input};
    vector<string> result;
    
    for (string buffer; 
         getline(ss, buffer, delimiter);) 
            {result.push_back(move(buffer));}
    
    return result;
}

int launch_execute(const vector<string>& command)
{
    // handle builtins
    if (command.size() == 0) return 1;
    else if (command[0] == "exit") return 0;
    else if (command[0] == "cd") {
        if (command.size() == 1 || command.size() > 2) {
            cerr << "shell: expected 1 argument to \"cd\"\n";
        }
        else {
            if (chdir(command[1].c_str()) != 0) {
                perror("shell");
            }
        }
        
        return 1;
    }
    
    
    // cast vector<string> to const char**
    const char **argv = new const char* [command.size()+1];
    
    for (unsigned j = 0;  j < command.size();  ++j) {
        argv [j] = command[j].c_str();
    }

    argv[command.size()] = NULL;

    // fork
    int status = 0;
    pid_t pid = fork();
    if (pid == 0) {
        // Child process
        if (execvp(argv[0], (char **)argv) == -1) {
            perror("shell");
        }
        delete[] argv;
        exit(EXIT_FAILURE);
        
    } else if (pid < 0) {
        // Error forking
        perror("shell");
        
    } else {
        // Parent process
        do {
            waitpid(pid, &status, WUNTRACED);
        } while (!WIFEXITED(status) && !WIFSIGNALED(status));
    }
    
    delete[] argv;
    return 1;
}


int main()
{
    int status = 0;
    string line = "";
    
    do {
        cout << "shell> ";
        getline(cin, line);
        vector<string> args = split_string(line, ' ');
        
        status = launch_execute(args);
        
    } while (status);
    
    return 0;
}

Scripts recomendados

Menu com teclas direcionais

Seqüência de Fibonacci

Usando medidas de comprimento

Url visitor

Campo Elétrico do Quadripolo


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts