📄 myshell.c
字号:
#include <sys/types.h>
#include <pwd.h>
#include <sys/wait.h>
#include "ourhdr.h"
#define MAXARGV 100
#define INNERNUM 2
char *inner[INNERNUM];
int isinner(char *buf){
int i;
for(i=0;i<INNERNUM;i++)
if(strcmp(buf,inner[i])==0)
return i;
return -1;
}
void execinner(int num,char **argv){
if(num==0){ //cd
char *buf="~";
if((!argv[1]) || (strcmp(buf,argv[1])==0) ) {
struct passwd *pwd = getpwuid(getuid());
if(pwd==NULL) err_sys("getpwuid error");
if(chdir(pwd->pw_dir)<0) err_sys("chdir error");
}//if
else {
if(chdir(argv[1])<0) err_sys("chdir error");
}//else
}//if
else if(num==1){ //pid
pid_t pid=getpid();
printf("%d\n",pid);
}
}
main()
{
inner[0]="cd"; inner[1]="pid";
char *argv[MAXARGV];
char *buf;
char *pathname;
char *path="/home/csd03/cs038039/unixprog/bin/";
char *logout="logout\n";
pid_t pid;
int status;
int i,j,k;
int num;
buf=path_alloc(NULL);
pathname=path_alloc(NULL);
printf("%% "); /*print prompt (printf requires %% to print %)*/
while(fgets(buf,MAXLINE,stdin)!=NULL)
{
if(strcmp(buf,logout)==0) return;
for(i=0;i<MAXARGV;i++) argv[i]=path_alloc(NULL);
i=0;j=0;
while(1)
{
k=0;
while(buf[i]!=' '&&buf[i]!='\t'&&buf[i]!='\n')
{
argv[j][k]=buf[i];
i++;
k++;
}
argv[j][k]=0;
j++;
if(buf[i]=='\n')
break;
else
while(buf[i]==' '||buf[i]=='\t') i++;
}
argv[j]=NULL;
num=isinner(argv[0]); //内部命令
if(num>=0) execinner(num,argv);
else{
if((pid=fork())<0)
err_sys("fork error");
else if(pid==0)
{
for(i=0;i<strlen(path);i++) pathname[i]=path[i];
pathname[i]=0;
for(i=strlen(pathname),j=0;argv[0][j]!=' '&&argv[0][j]!='\t'&&argv[0][j]!='\n';i++,j++)
pathname[i]=argv[0][j];
pathname[i]=0;
execv(pathname,argv);
err_ret("couldn't execute: %s",argv[0]);
exit(127);
}
if((pid=waitpid(pid,&status,0))<0)
err_sys("waitpid error");
}//else
for(i=0;i<MAXARGV;i++) free(argv[i]);
printf("%% ");
}
exit(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -