Powłoka - dodanie własnych poleceń

0

Witam mam napisaną taką powłokę i potrzebuje dodać do niej jakieś własne polecenia.
Czy ktoś mógłby mi w tym pomóc i trochę zmodyfikować tą powłokę ? Tak aby były własne polecenia ?

  #include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/types.h>
#include <dirent.h>
#include <fstream>
#include <sstream>
using namespace std;

string PobierzSciezke();
string polecenie;
string domowy = PobierzSciezke();
const char * domowyKatalog = domowy.c_str();

//*****************************************************************************************


string PobierzSciezke(){
//funkcja zmieniajaca getcwd z jezyka C
	char *buffer = new char[256];
	// na zabezpieczona przed przeciekami pamieci
	getcwd(buffer,256);
	if(buffer != NULL){
		string ret(buffer);
		delete[] buffer;
		return ret;
	}else{
		delete[] buffer;
		return string();
	}
}
void pwd(){
//funkcja podajaca sciezke korzystajaca z PobierzSciezke
	cout << PobierzSciezke() <<endl;

}

void wyswietl_historie(vector <string> & historia ){
	for(unsigned int i = 0; i < (historia.size())-1; i++)
		cout << historia[i] << " ";
	cout <<endl;
}

void cd(string parametr2){
	const char *par2=parametr2.c_str();
	if (parametr2 == "")
		chdir(domowyKatalog);
	else{
		chdir(par2);

	}

}
void ls(){
	DIR *dpdf;
	struct dirent *epdf;
	dpdf = opendir("./");
	if (dpdf != NULL){
		while (epdf = readdir(dpdf)){
			cout << epdf->d_name << endl;
		}
	}
}
void kopiuj(string par2,string par3){

	ifstream plik1 (par2.c_str(), fstream::binary);
	if (!plik1.good() )
		cout << "plik nie istnieje" <<endl;
	else {
		ofstream plik2 (par3.c_str(), fstream::trunc|fstream::binary);
		if(!plik2.good())
			cout << "Nie mozna otworzyc pliku do zapisu" << endl;
		else{
			plik2 << plik1.rdbuf ();
			plik1.close();
			plik2.close();
			cout << " Wykonano " << endl;
		}
	}
}

void polacz(string in1,string in2,string out){
	ifstream plik1 (in1.c_str(), fstream::binary);
	ifstream plik2 (in2.c_str(), fstream::binary);

	if (!plik1.good())
		cout << "Plik "<< in1 << " nie istnieje lub nie można uzyskac dostepu "<< endl;
	else if (!plik2.good())
		cout << "Plik "<< in2 << " nie istnieje lub nie można uzyskac dostepu "<< endl;
	else {

		ofstream plik3 (out.c_str(), fstream::trunc|fstream::binary);
		if(!plik3.good())
			cout << "Nie mozna otworzyc pliku do zapisu" << endl;
		else{
			plik3 << plik1.rdbuf ();
			plik3 << plik2.rdbuf();
			plik1.close();
			plik2.close();
			plik3.close();
			cout << " Wykonano " << endl;
		}
	}
}

void wypisz(string inp){
	ifstream plik1 (inp.c_str(), fstream::in);
	if (!plik1.good() )
		cout << " Plik nie istnieje lub brak dostepu " <<endl;
	else {
		cout << plik1.rdbuf ();
		cout<<endl;
		plik1.close();
	}
}
void help(){
	cout << endl;
	cout << " Możliwe polecenia : "<< endl;
	cout << "'cd' 'ls' 'pwd' 'kopiuj' 'help' 'historia' 'polacz' 'wypisz' "<<endl;
	cout << " <nazwa polecenia> --help (Wyswietla pomoc do danego polecenia)"<<endl;
	cout << " exit -konczy dzialanie programu "<< endl;
	cout << endl;
}

int main()
{


	vector <string> historia;
	help();
	cout <<endl;
	while((polecenie !="exit") && (polecenie !="EXIT")){
		cout << PobierzSciezke() <<" -> ";
		getline(cin,polecenie);

		//###################################################
		string parametr_1, parametr_2, parametr_3,parametr_4,parametr_5;
		istringstream StrStream(polecenie);

		StrStream >> parametr_1;
		StrStream >> parametr_2;
		StrStream >> parametr_3;
		StrStream >> parametr_4;
		StrStream >> parametr_5;

		if (parametr_2 == "--help"){

			if (parametr_1=="pwd")
				cout << "Wyswietla aktualna sciezke "<<endl;

			if (parametr_1=="ls")
				cout << "Wyswietla listing biezacego katalogu "<< endl;

			if (parametr_1=="help")
				cout << "Wyswietla liste mozliwych komend " <<endl;

			if (parametr_1=="historia")
				cout << "Wyswietla historie wprowadzonych polecen"<< endl;

			if (parametr_1=="cd")
				cout << "cd <sciezka> -zmienia katalog roboczy. cd -zmienia na domowy."
						" cd / -zmienia na glowny. cd .. -cofa "<< endl;

			if (parametr_1=="kopiuj")
				cout << " kopiuj <plik zrodlowy> <plik docelowy> " <<
				"- Kopiuje plik zrodlowy pod nazwa zadana jako docelowy"<< endl;

			if (parametr_1=="polacz")
				cout<<"polacz <plik1> <plik2> <plik docelowy> - "<<
				"Laczy dwa pliki i zapisuje go jako plik docelowy"<< endl;

			if (parametr_1=="wypisz")
				cout <<"wypisz <plik> - Wypisuje zawartosc pliku jako tekst"<<endl;



		}

		else {
			if (parametr_1 == "historia"){
				if (historia.size()>1){
					wyswietl_historie(historia) ;
				}else
					cout <<"Historia jest pusta" <<endl;
			}
			if (parametr_1 == "pwd"){
				pwd();
				historia.push_back(polecenie);
			}
			if (parametr_1 == "cd"){
				cd(parametr_2);
				historia.push_back(polecenie);
			}
			if (parametr_1 == "ls"){
				ls();
				historia.push_back(polecenie);
			}
			if (parametr_1 == "kopiuj" && !parametr_2.empty() && !parametr_3.empty()){
				kopiuj(parametr_2,parametr_3);
				historia.push_back(polecenie);
			}
			if (parametr_1 == "help"){
				help();
				historia.push_back(polecenie);
			}
			if (parametr_1 == "polacz"&& !parametr_2.empty() && !parametr_3.empty()&& !parametr_4.empty()){
				polacz(parametr_2,parametr_3,parametr_4);
				historia.push_back(polecenie);
			}
			if (parametr_1 == "wypisz"){
				wypisz(parametr_2);
				historia.push_back(polecenie);
			}
			if (parametr_1 == "."){

			}

		}
	}



	return 0;
}
0

Witam mam napisaną taką powłokę i potrzebuje dodać do niej jakieś własne polecenia.

  1. jakie?
  2. przyjrzyj się kodowi a sposób dodania własnych poleceń będzie oczywisty.
1

Powłoka z reguły działa inaczej, nie ma wkodowanych w siebie poleceń, tylko się forkuje i odpala w procesie potomnym dane polecenie.

0

Polecenia mogą być własnego pomysłu.
Ogólnie polecenie mam takie:
Należy opracować projekt powłoki z własnego pomysłu poleceniami lub własnego modułu kernela linuksa.
Można ich użyć jako podstawy do implementacji własnych funkcji na powłoce w C i C++ przy czym można używać funkcji C w C++ wersji np. rysowania innych figur niż kwadraty i trójkąty (liter?), modyfikowania zawartości plików tekstowych (zamiana liter, wyrazów na inne m.in. szyfrowanie prostą zamianą liter).

0

Więc co tutaj można zrobić po swojemu ?
Jakie polecenia ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1