Commit bdd3856f authored by Dong Hung Pham's avatar Dong Hung Pham 🤡
Browse files

Add new file

parent ef604a2e
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include<sys/wait.h>
#define TOK_DELIM " \t\r\n\a"
char *read_line(void)
{
char *line = NULL;
size_t bufsize = 0; // have getline allocate a buffer for us
if (getline(&line, &bufsize, stdin) == -1){
if (feof(stdin)) {
exit(EXIT_SUCCESS); // We recieved an EOF
} else {
perror("readline");
exit(EXIT_FAILURE);
}
}
return line;
}
char **split_line(char *line)
{
int bufsize = 64, position = 0;
char **tokens = (char**)malloc(bufsize * sizeof(char*));
char *token;
if (!tokens) {
fprintf(stderr, "allocation error\n");
exit(EXIT_FAILURE);
}
token = strtok(line, TOK_DELIM);
while (token != NULL) {
tokens[position] = token;
position++;
token = strtok(NULL, TOK_DELIM);
}
tokens[position] = NULL;
return tokens;
}
void printshell(void){
printf("myshell<"); //display prompt
}
void initshell(void){
const char* CLEAR_SCREEN_ANSI = " \e[1;1H\e[2J"; //These two lines clear the console
write(STDOUT_FILENO, CLEAR_SCREEN_ANSI,12); //These two lines clear the console
}
void loop(void){
char *line;
char **args;
int status ;
while(1){
pid_t pid, wpid;
printshell();
line = read_line();
int size = strlen(line);
bool background = true;
if (line[size-2]=='&'){
background = false;
line[size-2] = '\0';
}
args = split_line(line);
if (strcmp(line, "logout") != 0) {
pid = fork();
}
else{
printf("press y to quit\n");
char c = getchar();
if ('y' == c){
break;
}
continue;
}
if (pid == 0) {
// Child process
if (execvp(args[0], args) == -1) {// excute command
perror("something bad happen");
}
exit(EXIT_FAILURE);
} else if (pid < 0) {
// Error forking
perror("something bad happen");
} else {
// Parent process
if (background){//parent process because pid bigger than 0
do {
wpid = waitpid(pid, &status, WUNTRACED);
}while (!WIFEXITED(status) && !WIFSIGNALED(status));
}
else{
do {
wpid = waitpid(pid, &status, WNOHANG);
printf("%ld Started\n",pid);
}while (!WIFEXITED(status) && !WIFSIGNALED(status));
}
}
}
}
int main()
{
initshell();
loop();
return 0;
}
/**
Was bedeutet Ausführung im Hintergrund? Ans: es wird sorfort weiter arbeiten ohne diese Process zu warten
Funktionsweise : wir haben einen Loop, am Anfang wird eine Line von terminal bekommen , dannch wird es zum viele token (um space oder andere zeichen zu vermeiden) aufgeteilt.
dann erstellen wir einen neuen Process mit fork().
Zombie: ist ein Prozess, der schon abgeschlossen ausgefuehrt ist (completed execution) ,hat aber immer noch einen Eintrag in der Prozesstabelle.
Vordergrundprozesse beziehen sich auf Anwendungen, die wir gerade ausführen und mit denen wir gerade interagieren. Dies gilt sowohl für grafische UI als auch für die Befehlszeile aka command line.
ps ax : https://man7.org/linux/man-pages/man1/ps.1.html
trasdasd : wird error ausgeben weil execvp() = -1
die Einzige Aenderung bemerke ich , dass alte ps ax ist schon von dem Tabelle ausgeloechst .
*/
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment