第一范文网 - 专业文章范例文档资料分享平台

操作系统实验指导书新 - 图文

来源:用户分享 时间:2025/5/23 8:26:18 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

if (input[i] == ' ' || input[i] =='\\t' || input[i] == '\\0'){ if (j == 0) /*这个条件可以略去连在一起的多个空格或者tab*/ continue; else{ buffer[j++] = '\\0'; arg[k] = (char *) malloc(sizeof(char)*j); /*将指令或参数从缓存拷贝到arg中*/ strcpy(arg[k],buffer); j = 0; /*准备取下一个参数*/ k++; } } else{ /*如果字串最后是‘&',则置后台运行标记为1*/ if (input[i] == '&' && input[i+1] == '\\0'){ is_back = 1; continue; } buffer[j++] = input[i]; } } free(input);/*释放空间*/ /*如果输入的指令是leave则退出while,即退出程序*/ if (strcmp(arg[0],\ printf(\ break; } if (is_bj == 0){ /*非管道、重定向指令*/

/*在使用xxec执行命令的时候,最后的参数必须是NULL指针, *所以将最后一个参数置成空值*/ arg[k] = (char *) 0; /*判断指令arg[0]是否存在*/ if (is_fileexist(arg[0]) == -1 ){ printf(\ for(i=0;i

31

/* fork a sub-process to run the execution file */ if ((pid = fork()) ==0) /*子进程*/ execv(buffer,arg); else /*父进程*/ if (is_back == 0) /*并非后台执行指令*/ waitpid(pid,&status,0); /*释放申请的空间*/ for (i=0;i

int is_fileexist(char *comm) {

char *path,*p; int i;

i = 0;

/*使用getenv函数来获取系统环境变量,用参数PATH表示获取路径*/ path = getenv(\ p = path;

while (*p != '\\0'){ /*路径列表使用‘:’来分隔路径*/ if (*p != ':') buffer[i++] = *p; else{

buffer[i++] = '/'; buffer[i] = '\\0';

/*将指令和路径合成,形成pathname,并使用access函数来判断该文件是否存在*/ strcat(buffer,comm);

if (access(buffer,F_OK) == 0) /*文件被找到*/ return 0; else /*继续寻找其它路径*/ i = 0; } p++; }

/*搜索完所有路径,依然没有找到则返回-1*/ return -1;

32

}

int redirect(char *in,int len) {

char *argv[30],*filename[2]; pid_t pid;

int i,j,k,fd_in,fd_out,is_in = -1,is_out = -1,num = 0; int is_back = 0,status=0;

/*这里是重定向的命令解析过程,其中filename用于存放重定向文件, *is_in, is_out分别是输入重定向标记和输出重定向标记*/ for (i = 0,j = 0,k = 0;i <= len;i++){

if (in[i]==' '||in[i]=='\\t'||in[i]=='\\0'||in[i] =='<'||in[i]=='>'){ if (in[i] == '>' || in[i] == '<'){

/*重定向指令最多'<','>'各出现一次,因此num最大为2, *否则认为命令输入错误*/

if (num < 3){ num ++; if (in[i] == '<') is_in = num - 1; else is_out = num - 1; /*处理命令和重定向符号相连的情况,比如ls>a*/ if (j > 0 && num == 1) { buffer[j++] = '\\0'; argv[k] = (char *) malloc(sizeof(char)*j); strcpy(argv[k],buffer); k++; j = 0; } } else{ printf(\ return -1; }

} if (j == 0) continue; else{ buffer[j++] = '\\0'; /*尚未遇到重定向符号,字符串是命令或参数*/

33

if (num == 0){ argv[k] = (char *) malloc(sizeof(char)*j); strcpy(argv[k],buffer); k++; } /*是重定向后符号的字符串,是文件名*/ else{ filename[status] = (char *) malloc(sizeof(char)*j); strcpy(filename[status++],buffer); } j = 0; /*initate*/ } }

else{ if (in[i] == '&' && in[i+1] == '\\0'){ is_back = 1; continue; } buffer[j++] = in[i]; } }

argv[k] = (char *) 0;

if (is_fileexist(argv[0]) == -1 ){

printf(\ for(i=0;i

if ((pid = fork()) ==0){ /*存在输出重定向*/ if (is_out != -1)

if((fd_out=open(filename[is_out],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR))==-1){

printf(\ return -1; } /*存在输入重定向*/ if (is_in != -1)

if((fd_in=open(filename[is_in],O_RDONLY,S_IRUSR|S_IWUSR))==-1){

34

搜索更多关于: 操作系统实验指导书新 - 图文 的文档
操作系统实验指导书新 - 图文.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c1w33r7glez6tzp933x2x_9.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top