⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myshell.c

📁 实现Shell
💻 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 + -