Pequeno Shell Unix em C++
Publicado por Fernando (última atualização em 02/03/2018)
[ Hits: 3.877 ]
Homepage: https://github.com/phoemur/
Pequeno Shell Unix em C++.
Compilação:
$ g++ -o shell shell.cpp -O3 -Wall -Wpedantic -std=c++11
// 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;
}
programa para solucionar problemas com triangulos
Gerador de numeros da mega-sena tabajara
Método de Power para calcular o autovelor dominante de uma matriz
Nenhum comentário foi encontrado.
Como atualizar sua versão estável do Debian
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Script de montagem de chroot automatica
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Conky, alerta de temperatura alta (12)
De volta para o futuro - ou melhor, para o presente (parte 2) (2)
Por que passar nas disciplinas da faculdade é ruim e ser reprovado é b... (7)









