Pequeno Shell Unix em C++

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

[ Hits: 1.020 ]

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

Gerador de Senhas

Usando medidas de comprimento

Par ou ímpar

Strspn

Locadora


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor HostGator.
Linux banner
Linux banner
Linux banner

Artigos

Dicas

Viva o Android

Tópicos

Top 10 do mês

Scripts