作业 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;
}
以上均属于个人思路,仅供参考,如有不足,欢迎指正,如果喜欢或对你有帮助,麻烦帮忙点个赞、加收藏,感谢阅读!!!