操作系统作业,最终代码找不到了,这个是最初版,不确定是否可用,仅供参考学习
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<readline/readline.h>
#include<readline/history.h>
#define MAXCOM 1000 // max number of letters to be supported
#define MAXLIST 100 // max number of commands to be supported
#define clear() printf("\033[H\033[J") //功能同bash的clear命令
int takeInput(char* str)
{
char* buf;
buf = readline(">>> ");
if (strlen(buf) != 0) {
add_history(buf);
strcpy(str, buf);
return 0;
} else {
return 1;
}
}
void printDir()
{
char* username = getenv("USER");
char hostname[100];
int a = gethostname(hostname, sizeof(hostname));
char cwd[1024];
getcwd(cwd, sizeof(cwd));
printf("%s@%s%s$", username, hostname, cwd);
}
void execArgs(char** parsed)
{
pid_t pid = fork();
if (pid == -1) {
printf("\nFailed forking child..");
return;
} else if (pid == 0) {
if (strcmp(parsed[0], "cat")==0){
printf("%s\n", parsed[0]);
parsed[0] = "./cat";
execvp(parsed[0], parsed);
}
else if (strcmp(parsed[0], "cp")==0){
parsed[0] = "./cp";
execvp(parsed[0], parsed);
}
else if (strcmp(parsed[0], "lsdir")==0){
printf("------------------------\n");
parsed[0] = "./lsdir";
execvp(parsed[0], parsed);
}
else if (strcmp(parsed[0], "pwd")==0){
printf("-----------\n");
parsed[0] = "./pwd";
execvp(parsed[0], parsed);
}
else if (strcmp(parsed[0], "rm")==0){
parsed[0] = "./rm";
execvp(parsed[0], parsed);
}
else{
printf("\nCould not execute command..");
}
exit(0);
} else {
wait(NULL);
return;
}
}
// Help command builtin
void openHelp()
{
puts("\n***WELCOME TO MY SHELL HELP***"
"\nCopyright @ Suprotik Dey"
"\n-Use the shell at your own risk..."
"\nList of Commands supported:"
"\n>cd"
"\n>ls"
"\n>exit"
"\n>all other general commands available in UNIX shell"
"\n>pipe handling"
"\n>improper space handling");
return;
}
void parseSpace(char* str, char** parsed)
{
int i;
for (i = 0; i < MAXLIST; i++) {
parsed[i] = strsep(&str, " ");
if (parsed[i] == NULL)
break;
if (strlen(parsed[i]) == 0) // 用户在两个words之间输入了多个空格的情况
i--;
}
}
int processString(char* str, char** parsed, char** parsedpipe)
{
parseSpace(str, parsed);
return 1;
}
int main()
{
char inputString[MAXCOM], *parsedArgs[MAXLIST];
char* parsedArgsPiped[MAXLIST];
int execFlag = 0;
while (1) {
printDir();
if (takeInput(inputString))
continue;
execFlag = processString(inputString,
parsedArgs, parsedArgsPiped);
if(execFlag==1){
execArgs(parsedArgs);
}
}
return 0;
}