shell命令解释器Word格式.docx
- 文档编号:16393258
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:16
- 大小:17.50KB
shell命令解释器Word格式.docx
《shell命令解释器Word格式.docx》由会员分享,可在线阅读,更多相关《shell命令解释器Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
help"
exit"
pushd"
popd"
dirs"
export"
echo"
};
int(*builtin_func[])(char**)={
&
lsh_cd,
lsh_help,
lsh_exit,
lsh_pushd,
lsh_popd,
lsh_dirs,
lsh_export,
lsh_echo
intlsh_num_builtins(){
returnsizeof(builtin_str)/sizeof(char*);
}
/*安装在内部的函数实现。
.*/
/**
@briefBultincommand:
changedirectory.
@paramargsListofargs.args[0]is"
.args[1]isthedirectory.
@returnAlwaysreturns1,tocontinueexecuting.
@briefBultin命令:
改变目录。
@paramargs参数列表。
args[0]是“cd”。
args[1]是目录。
@return总是返回1,继续执行。
intlsh_cd(char**args)
{
if(args[1]==NULL){
fprintf(stderr,"
lsh:
expectedargumentto\"
cd\"
\n"
);
}else{
if(chdir(args[1])!
=0){
perror("
lsh"
}
return1;
@brief内置命令:
打印的帮助。
不检查。
intlsh_help(char**args)
inti;
printf("
Typeprogramnamesandarguments,andhitenter.\n"
Thefollowingarebuiltin:
for(i=0;
i<
lsh_num_builtins();
i++){
%s\n"
builtin_str[i]);
Usethemancommandforinformationonotherprograms.\n"
退出。
@return总是返回0,终止执行。
intlsh_exit(char**args)
return0;
//pushd函数:
intlsh_pushd(char**args)
if(chdir(args[1])!
=0)
{
else
{
stack[num++]=get_current_dir_name();
inti=num-1;
while(i>
=0)
%s"
stack[i]);
i--;
//popd函数:
intlsh_popd(char**args)
if(num<
2)
popd:
directorystackempty!
num--;
chdir(stack[num]);
//dirs函数:
intlsh_dirs(char**args)
if(args[1]==0)
charm=stack[i];
stack[i]="
;
=0)
stack[num-1]=i;
if(strcmp(args[1],"
-c"
)==0)
//memset(stack,0,sizeof(stack));
num=1;
if((strcmp(args[1],"
-p"
)==0)&
&
(strcmp(args[2],"
-v"
)==0))
intj=num-1;
while(j>
%d%s\n"
num-1-j,stack[j]);
j--;
intfile1,file2;
//重定向1:
intlsh_redirect1(char**args)
file1=open(args[2],O_CREAT|O_RDWR);
file2=dup
(1);
dup2(file1,1);
close(file1);
lsh_launch(args);
dup2(file2,1);
//close(file2);
//重定向2:
intlsh_redirect2(char**args)
file2=dup
(2);
dup2(file1,2);
dup2(file2,2);
close(file2);
//重定向3:
intlsh_redirect3(char**args)
file1=open(args[2],O_CREAT|O_RDWR|O_APPEND);
//重定向4:
intlsh_redirect4(char**args)
file1=open(args[2],O_RDONLY|O_TRUNC);
file2=dup(0);
dup2(file1,0);
dup2(file2,0);
//export:
intlsh_export(char**args)
inti=0;
intbuf[100];
int*name;
int*value1;
int*value2;
int*value3;
if(args[1]==NULL)
while(environ[i]!
=NULL)
%s\n"
environ[i]);
i++;
}
strcpy(buf,args[1]);
name=strtok(buf,"
="
strtok(NULL,"
:
"
value1=getenv(name);
value2=strtok(NULL,"
value3=strcat(value1,value2);
setenv(name,value3,1);
intlsh_echo(char**args)
%s:
args[1]+1,getenv(args[1]+1));
@brief启动程序,等待它终止。
@paramargs零终止的参数列表(包括程序)。
intlsh_launch(char**args)
pid_tpid;
intstatus;
pid=fork();
if(pid==0){
//Childprocess
if(execvp(args[0],args)==-1){
exit(EXIT_FAILURE);
}elseif(pid<
0){
//Errorforking
//Parentprocess
do{
waitpid(pid,&
status,WUNTRACED);
}while(!
WIFEXITED(status)&
!
WIFSIGNALED(status));
@brief执行shell内置或启动程序。
@paramargs零终止的参数列表。
@return1如果壳牌公司应该继续运行,如果它应该终止
intlsh_execute(char**args)
/*if(args[1]!
=NULL)
if(strcmp(args[2],"
|"
returnpipe(args);
}*/
if(args[0]==NULL){
//Anemptycommandwasentered.
if(strcmp(args[0],builtin_str[i])==0){
return(*builtin_func[i])(args);
if(args[1]!
if(strcmp(args[1],"
>
returnlsh_redirect1(args);
2>
returnlsh_redirect2(args);
returnlsh_redirect3(args);
if(strcmp(args[0],"
cat"
returnlsh_launch(args);
<
returnlsh_redirect4(args);
#defineLSH_RL_BUFSIZE1024
@brief从stdin读取一行输入。
@return从stdin。
char*lsh_read_line(void)
intbufsize=LSH_RL_BUFSIZE;
intposition=0;
char*buffer=malloc(sizeof(char)*bufsize);
intc;
if(!
buffer){
allocationerror\n"
while
(1){
//Readacharacter
c=getchar();
//IfwehitEOF,replaceitwithanullcharacterandreturn.
if(c==EOF||c=='
\n'
){
buffer[position]='
\0'
returnbuffer;
buffer[position]=c;
position++;
//Ifwehaveexceededthebuffer,reallocate.
if(position>
=bufsize){
bufsize+=LSH_RL_BUFSIZE;
buffer=realloc(buffer,bufsize);
#defineLSH_TOK_BUFSIZE64
#defineLSH_TOK_DELIM"
\t\r\n\a"
@briefSplitalineintotokens(verynaively).
@paramlineTheline.
@returnNull-terminatedarrayoftokens.
@brief直线分割成令牌(很天真)。
@param线。
@return以null结尾的标记数组)。
@brief从stdin读取一行输入。
char**lsh_split_line(char*line)
intbufsize=LSH_TOK_BUFSIZE,position=0;
char**tokens=malloc(bufsize*sizeof(char*));
char*token,**tokens_backup;
tokens){
token=strtok(line,LSH_TOK_DELIM);
while(token!
=NULL){
tokens[position]=token;
bufsize+=LSH_TOK_BUFSIZE;
tokens_backup=tokens;
tokens=realloc(tokens,bufsize*sizeof(char*));
free(tokens_backup);
token=strtok(NULL,LSH_TOK_DELIM);
tokens[position]=NULL;
returntokens;
@brief循环输入和执行它。
voidlsh_loop(void)
char*line;
char**args;
charname[100];
charaddr[100];
gethostname(name,sizeof(name));
%s>
@<
$"
getlogin(),name,getcwd(addr,sizeof(addr)));
line=lsh_read_line();
args=lsh_split_line(line);
status=lsh_execute(args);
free(line);
free(args);
}while(status);
*@brief主要入口点。
*@param命令行参数个数参数计数。
*@paramargv参数向量。
*@return地位codeLoad配置文件,如果任何。
intmain(intargc,char**argv)
//加载配置文件,如果有的话。
sigset_tsign;
sigemptyset(&
sign);
sigaddset(&
sign,SIGQUIT);
sigprocmask(SIG_BLOCK,&
sign,NULL);
voidmy_handler(ints)
Caughtsignal%d\n"
s);
structsigactionsi;
si.sa_handler=my_handler;
si.sa_mask);
si.sa_flags=0;
sigaction(SIGINT,&
si,NULL);
//运行命令循环。
lsh_loop();
//执行任何关闭/清理。
sigprocmask(SIG_UNBLOCK,&
returnEXIT_SUCCESS;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- shell 命令 解释