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

📄 shell.c

📁 SHELL功能的实现
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/wait.h>#define MAX 4096void Fun( char *, char ** );main(){    int pid;    //进程pid    int status;      char *p=0;   //指针,用来存储获取到的用户名    char buf[MAX];    //存储通过键盘输入的信息    char *args[64];   //指针数组,分析命令行参数    char f[MAX];		//缓冲区,用来存储路径信息    printf("[%s %s]#", p, f);			//输出命令行标识:用户主目录,当前路径,和标识符        while ( fgets( buf, MAX, stdin ) != NULL )			//从键盘获取信息存入buf中    {	/*if ( strcmp( *args, "pwd" ) == 0 )	{	    if ( (p = getenv("USER")) )		printf("%s\n", p);	}*/	if ( buf[strlen(buf) - 1] == '\n' )	{	    buf[strlen(buf) - 1] = '\0';	}	Fun( buf, args );		if ( strcmp( *args, "cd" ) == 0 )			//判断是否为cd	{	    if ( *( args + 1 ) == NULL )		//判断cd后是否有路径	    {		p = getenv("USER");			//获取该用户名称		strcpy(f, p);	    }	    else	    {		*args = *( args + 1 );		//如果cd后有路径信息,则改变到该路径	    	chdir( *args );	    	getcwd( f, sizeof(f) );			//将路径存到缓冲区f中	    }	}		if ( (pid = fork()) < 0 )	{	    printf("fork error!\n");	    exit(0);	}	if ( pid == 0 )				//子进程	{	    if ( ( strcmp( *args, "exit" ) == 0 ) || ( strcmp( *args, "logout" ) == 0 ) )		//判断是否为exit	    {		exit(0);	    }	    if ( strcmp( *args, "pwd" ) == 0 )		 //若输入pwd,则将缓冲区f中的内容输出	    {		printf("%s\n", f);		exit(0);	    }	    	    if ( strcmp( *args, "cd" ) == 0 )			//如果命令为cd,则退出,不执行,exec函数	    {		exit(0);	    }	    else	    {	    	execvp ( *args, args );		//printf("no this comment!\n");	    	exit(0);	    }	}	else	{	    waitpid( pid, &status, 0 );	    if ( ( strcmp( *args, "exit" ) == 0 ) || ( strcmp( *args, "logout" ) == 0 ) )		//若为exit,子进程退出,然后父进程退出	    {		exit(0);	    }	}	printf("[%s %s]#", p, f);    }}void Fun( char *buf, char *args[] ){    while ( *buf != '\0' )			//判断你输入的信息是否为空    {	while ( (*buf == ' ') || (*buf == '\t') || (*buf == '\n') )			//当你输入的信息有空格,制表符,换行符时	{	    *buf++ = '\0';			//则将该字符串的结尾处添为“\0”	}	*args++ = buf;			//将该字符串赋给指针数组,然后指针下移	while ( (*buf != '\0') && (*buf != ' ') && (*buf != '\t') && (*buf != '\n') )	{	    buf++;			//buf就为你输入的字符串的下一个子串	}    }    *args = '\0';}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -