- The problem statement, all variables and given/known data:
Hello!
I currently got the task of programming a UNIX Shell for practice. The functionality is as follows:
- Entering commands with the keyboard. Enter stops the input and creates a process which should start any program
- the shell waits for termination of each command before another command can be accepted
- parameters should be extracted and correctly delivered to the specific programm
- "logout" ends the shell (more of that later)
- commands which have an '&' appended should be executed in the background. new commands can be entered thereafter
-> commands are not to be hardcoded
- entering CTRL-C should deliver the currently running foreground process the signal SIGINT (not the shell)
- entering CTRL-Z should deliver the currently running foregruond process the signal SIGSTP
- implement a command "fg" that brings back a process back to the foreground which has been stopped by CTRL-Z
- implement a command "bg" that lets a stopped process (by CTRL-Z) run again in the background
- the shell can only be terminated if all background processes have been terminated, else give an error message, and make sure there should not be any zombie processes
I already started doing some of the tasks but I'm terribly unsure of how to exactly handle processes, it's very new to me. I would be delighted if someone could lend me a hand, maybe some pseudocode, so I can get the picture of it.
- Relevant commands, code, scripts, algorithms:
Relevant commands that should be executed (for example):
- firefox
- gedit
- ls
- not cd
- CTRL-C
- CTRL-Z
- fg
- bg
Relevant systemcalls that should be used:
- fork
- waitpid
- execvp or a variant
- not system
- signal
- sigaction
- setpgid
- The attempts at a solution (include all code and scripts):
My code so far:
#include <cstdlib>
#include <iostream>
#include <string>
#include <time.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <vector>
using namespace std;
void getArguments();
string input = "";
vector<char*> arguments;
int main(int argc, char** argv) {
cout << "Welcome to my shell. Exit with �logout�.0" << endl;
while (input != "logout") {
getline(cin, input);
//getArguments();
size_t space = input.find(" ");
string command = input.substr(0, space);
int end = input.length() - space;
string text = input.substr(space + 1, ende);
string path = "/usr/bin/" + command;
pid_t pid = fork();
if (pid == 0)
{
cout << "Process " << command << " wird ausgef�hrt: \n";
execlp(path.c_str(), NULL);
}
if (text != "&")
waitpid(pid, 0, 0);
}
return 0;
}
- Complete Name of School (University), City (State), Country, Name of Professor, and Course Number (Link to Course):
University: University of Applied Sciences in Darmstadt, Germany
Professor: Lars-Olof Burchard
Homepage: https://www.fbi.h-da.de/organisation/personen/burchard-lars-olof/betriebssysteme.html
Best regards,
Dan