Pequeno Shell Unix em C++
Publicado por Fernando (última atualização em 02/03/2018)
[ Hits: 3.841 ]
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;
}
Calculo calorico visando perca de gordura e definicao muscular
Manipulação de letras maiusculas e minusculas
Nenhum comentário foi encontrado.
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Adicionar botão "mostrar área de trabalho" no Zorin OS
Como montar um servidor de backup no linux
Trazendo de volta o Serviços em Segundo Plano no Plasma6
Desenvolvi um programa de hot corner (você colocar o mouse nos cantos)... (0)
Atualizei meu ubuntu e desliguei e ele não inicia corretamente (13)









