📄 shell.c
字号:
#include<unistd.h>#include<stdlib.h>#include<sys/wait.h>#include<stdio.h>#include<string.h>#define P_ID 1void parse (char *cmdname, char *cmdargv[], char *cmdline);void execute (char *fiename, char *argv[]);void cd (char *cmdargv[]);void environ (char *cmdargv[]);void echo (char *cmdargv[]);void help ();void jobs (char *cmdargv[]);void quit ();intmain (int argc,char *argv[]){ char cmdname[256] = ""; char *cmdargv[256]={""}; char cmdline[256] = ""; printf ("welcome to use lshell.\n"); while (1) { printf ("%s@%s:%s$ ",getlogin(),"lshell",get_current_dir_name()); gets (cmdline); parse (cmdname, cmdargv, cmdline); if (!strcmp (cmdname, "environ")) environ (cmdargv); else if (!strcmp (cmdname, "cd")) chdir(cmdargv[1]); else if (!strcmp (cmdname, "echo")) echo (cmdargv); else if (!strcmp (cmdname, "help")) help (); else if (!strcmp (cmdname, "jobs")) jobs (cmdargv); else if (!strcmp (cmdname, "quit")) quit (); else if (!strcmp (cmdname, "exit")) quit (); else if (!strcmp (cmdname, "bye")) quit (); else execute(cmdname,cmdargv); }}voidcd (char *cmdargv[]){ execute ("cd", cmdargv);}voidenviron (char *cmdargv[]){ execute ("env", cmdargv);}voidecho (char *cmdargv[]){ execute ("echo", cmdargv);}voidhelp (){printf("\n\t\t********** shell帮助手册**********\n"); printf("\n\t\t一、本shell支持以下内部命令:\n"); printf("\t\t(1)cd 目录名,更改当前的工作目录到指定的目录\n"); printf("\t\t(2)environ,列出所有环境变量字符串的设置,也可使用外部命令env\n"); printf("\t\t(3)echo 内容,显示echo后的内容且换行\n"); printf("\t\t(4)help,显示本帮助手册内容\n"); printf("\t\t(5)jobs,输出当前正在运行的进程,相当于外部命令ps\n"); printf("\t\t(6)quit,exit,bye,退出shell\n"); printf("\t\t二、外部命令直接输入即可运行,支持多参数\n"); printf("\n\t\t*********************************************\n\n");}voidjobs (char *cmdargv[]){ execute ("ps",cmdargv);}voidquit (){ printf ("quit lshell.\n"); exit (0);}voidparse (char *cmdname, char *cmdargv[], char *cmdline){ char *d = " "; char *p; int i = 0; cmdargv[0]= strtok (cmdline, d); strcpy (cmdname, cmdargv[0]); while ((p = strtok (NULL, d))) { i++; cmdargv[i]= p; } cmdargv[++i]=NULL;}voidexecute (char *filename, char *argv[]){ pid_t pid; if ((pid = fork ()) < 0) { printf ("fork error\n"); exit (EXIT_FAILURE); } else if (pid == 0) { if (execvp (filename,argv)) printf ("-lshell: %s: command not found\n",filename); exit (EXIT_FAILURE); } waitpid (pid, 0, 0); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -