第二次实验 sh1.c

 作业 sh1.c

  在 linux 中,程序 sh 读入用户的命令并执行,实现具备基本 sh 功能的程序 sh1

  该程序读取用户输入的命令,调用 fork/exec 执行,示例如下

  sh1打印提示符>,读取用户输入的命令echo,并执行输出结果

  sh1打印提示符>,读取用户输入的命令cat,并执行输出结果

  实现内置命令cd、pwd、exit

  open("test.txt", O_RDONLY) 打开当前工作目录下的文件 test.txt

  工作目录是进程的属性,fork 时会被子进程继承

  需要参考 API getcwd

  需要参考 API chdir

个人思路:

1.在实现了mysys.c和mycat.c后,echo和cat显示功能很快就可以实现,在之前的基础上,分词函数等均可继续沿用。

2.cd pwd exit中,exit也容易实现,就是检测输入是否是“exit",pwd可以通过getcwd函数实现,我是直接用execvp系统调用实现,cd改变当前工作目录则需要用chdir函数实现。

chdir函数原型如下:

头文件:#include <unistd.h>

定义函数:int chdir(const char * path);

函数说明:chdir()用户将当前的工作目录改变成以参数路径所指的目录。

返回值执行成功则返回0,失败返回-1,errno为错误代码。

源代码如下:

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<stdlib.h>
struct Command{
	int agrc;
	char *agrv[16];
}commands;

void parse_command(char*command)
{
	char *line=(char *)malloc(sizeof*(command));
	strcpy(line,command);

	commands.agrc=0;
	for(int i=0;i<16;i++){
		commands.agrv[i]=NULL;
	}

	char*word;
	word=strtok(line," ");
	while(word!=NULL){
		commands.agrv[commands.agrc++]=word;
		word=strtok(NULL," ");
	}
}

void sh1(char *command){
	pid_t pid;
	parse_command(command);
	if(commands.agrv[0]!=NULL&&strcmp(commands.agrv[0],"exit")==0){
		exit(0);
	}
	else if(commands.agrv[0]!=NULL&&strcmp(commands.agrv[0],"cd")==0){
		if(commands.agrv[1]==NULL){
			exit(-1);
		}else{
			chdir(commands.agrv[1]);
		}	
	}
	else{
	pid=fork();
	if(pid==0)
		execvp(commands.agrv[0],commands.agrv);
	wait(NULL);
	}
}

int main(){
	char str[50];
	while(1){
		printf(">");
		fgets(str,20,stdin);

		int len=strlen(str);	
		str[len-1]=0;	//remove Enter

		sh1(str);
	}
	return 0;
}

以上均属于个人思路,仅供参考,如有不足,欢迎指正,如果喜欢或对你有帮助,麻烦帮忙点个赞、加收藏,感谢阅读!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值