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

📄 ush.c

📁 操作系统实验
💻 C
📖 第 1 页 / 共 2 页
字号:
         }}/***     功能:        根据文件当前模式值增加或减少文件权限**    系统调用:stat(),chmod()**    作者:         卢佳  20040094*/void change_file_mode(){    int k;    struct stat stat_buf;    const int XPERM=0100;    for(k=1;k<token_num;k++){        if(stat(arg_list[k],&stat_buf)==-1){            fprintf(stderr,"cannot change!\n");                      }        stat_buf.st_mode|=XPERM;        if(chmod(arg_list[k],stat_buf.st_mode)==-1){             fprintf(stderr,"cannot change!\n");                     }        exit(0);        }}   /***   功能:简易pwd,显示当前工作目录**  系统调用:getcwd();*/void pwd_op(){    char dirname[200];    if(getcwd(dirname,200)==NULL){           fprintf(stderr,"getcwd error\n");           }    else{           printf("%s \n",dirname);           }}/* ************************************  list()功能模块 作者:  卢佳   *************************************************//***   功能:文件列表命令的低级版本,用于列表文件或目录**   系统调用:stat()*/void ls_op(){    struct stat stat_buf;    char descrip[10];    int  j;    if(stat(arg_list[1],&stat_buf) == -1 ){        fprintf(stderr,"cannot stat!\n");        exit(2);          }    for(j=0;j<9;j++){        if(stat_buf.st_mode & octarray[j]){            descrip[j]=perms[j];                     }        else{            descrip[j]='-';                      }           }    descrip[9]='\0';           printf("\nFile %s:\n",arg_list[1]);     printf("Size %ld bytes \n",stat_buf.st_size);    printf("User-id %d Group-id %d \n \n",stat_buf.st_uid,stat_buf.st_gid);    printf("Permission: %s\n",descrip);  }/***   功能:文件列表命令的高级版本,相当于“ls -l”命令,能以用户可理解的形式显示文件信息**  说明:与“ls -l”的一大不同是显示结果没有排序*/void list(){   int i=0;                                             	if ( token_num == 1 ){		do_ls( "." );        }	else{		while ( --token_num ){			printf("%s:\n", arg_list[++i] );			do_ls( arg_list[i] );		}        }}/***	 功能:列表文件或目录的辅助函数**     系统调用:opendir(),readdir(),closedir() */void do_ls(char dirname[]){	DIR		*dir_ptr;		      /* 目录指针 */	struct dirent	*direntp;		/* entry结构	 */printf("%s\n",dirname);	if ( ( dir_ptr = opendir( dirname ) ) == NULL ){             /* 打开目录,如果为空,显示出错 */    		fprintf(stderr,"ls1: cannot open %s\n", dirname);        }	else{		while ( ( direntp = readdir( dir_ptr ) ) != NULL ){       /* 遍历当前目录, 显示当前目录中每一个文件(包括隐藏文件)的详细信息 */			dostat( direntp->d_name );		}		closedir(dir_ptr);	}}/***   功能: 将文件内容装填至stat结构,并显示文件信息**   系统调用:stat()*/void dostat( char *filename ){	struct stat info;	if ( stat(filename, &info) == -1 ){		/* 将文件信息填入info结构	 */		perror( filename );			         /* 出现错误	 */        }	else{					                     		show_file_info( filename, &info );  /* 显示文件信息	 */        }}/***     功能:显示文件详细信息*/void show_file_info( char *filename, struct stat *info_p ){	char	*uid_to_name(), *ctime(), *gid_to_name(), *filemode();	void	mode_to_letters();   char  modestr[11];	mode_to_letters( info_p->st_mode, modestr );	printf( "%s"    , modestr );	printf( "%4d "  , (int) info_p->st_nlink);		printf( "%-8s " , uid_to_name(info_p->st_uid) );	printf( "%-8s " , gid_to_name(info_p->st_gid) );	printf( "%8ld " , (long)info_p->st_size);	printf( "%.12s ", 4+ctime(&info_p->st_mtime));	printf( "%s\n"  , filename );}/***    功能:将模式码转化为字母*/void mode_to_letters( int mode, char str[] ){    strcpy( str, "----------" );          if ( S_ISDIR(mode) )  str[0] = 'd';    /* 目录              */    if ( S_ISCHR(mode) )  str[0] = 'c';    /* 字符设备     */    if ( S_ISBLK(mode) )  str[0] = 'b';    /* 块设备         */    if ( mode & S_IRUSR ) str[1] = 'r';    /* 用户权限信息 */    if ( mode & S_IWUSR ) str[2] = 'w';    if ( mode & S_IXUSR ) str[3] = 'x';    if ( mode & S_IRGRP ) str[4] = 'r';    /* 小组权限信息 */    if ( mode & S_IWGRP ) str[5] = 'w';    if ( mode & S_IXGRP ) str[6] = 'x';    if ( mode & S_IROTH ) str[7] = 'r';    /* 其它 */    if ( mode & S_IWOTH ) str[8] = 'w';    if ( mode & S_IXOTH ) str[9] = 'x';}/***     功能:将用户id转化为用户名*/char *uid_to_name(uid_t uid){	struct	passwd *getpwuid(), *pw_ptr;	static  char numstr[10];	if ( ( pw_ptr = getpwuid( uid ) ) == NULL ){		sprintf(numstr,"%d", uid);		return numstr;	}	else{		return pw_ptr->pw_name ;         }}/***	功能:将组用户id转化为组名 */char *gid_to_name( gid_t gid ){	struct group *getgrgid(), *grp_ptr;	static  char numstr[10];	if ( ( grp_ptr = getgrgid(gid) ) == NULL ){		sprintf(numstr,"%d", gid);		return numstr;	}	else{		return grp_ptr->gr_name;         }}/**************************************************************************************************************************************************************/void chpath(){    if(chroot(arg_list[1])==-1){          fprintf(stderr,"cannot change path\n");          }}void echo_op(){    int i;    printf("%s\n",buf+5);}/*************************************shell 的主结构*******************************************************************************/int main(){    char * cmd_line;    int i=0;    /*  shell的主体部分*/    while(1){                     /*  获取命令行信息*/        cmd_line=get_cmd(stdin);                    /*  无输入,跳出循环*/        if(cmd_line==NULL){            break;                     }                     /*   解析命令行字符串*/        parse(buf);                if(special_cmd==1){            redirectory(arg_list[0],arg_list[1]);                     }        else if(special_cmd==2){            redirectory(arg_list[1],arg_list[0]);                     }        else if(special_cmd==3){            pipe_op(arg_list[0],arg_list[1]);                     }        else if(strcmp(arg_list[0],"ls")==0){            ls_op();                    }        else if(strcmp(arg_list[0],"list")==0){            list();                    }        else if(strcmp(arg_list[0],"pwd")==0){            pwd_op();                     }        else if(strcmp(arg_list[0],"exit")==0){            break;                     }        else if(strcmp(arg_list[0],"echo")==0){            echo_op();                     }        else if(strcmp(arg_list[0],"cd")==0){            chpath();                     }        else if(strcmp(arg_list[0],"monitor")){            watch_dog();                      }        else if(strcmp(arg_list[0],"chmode")){            change_file_mode();                     }        else {            execute(arg_list);                      }                      /*   释放资源*/        free_buf();         }}

⌨️ 快捷键说明

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