LINUX shell和进程创建

一、在LINUX系统中需要用到shell来运行命令。那么shell到底是什么?

       维基百科:Unix shell也叫做命令行界面,它是Unix操作系统下传统的用户和计算机的交互界面。用户直接输入命令来执行各种各样的任务。

       通过联机帮助
        man bash
        Bash  is  an  sh-compatible(兼容的)  command language interpreter that executes commands read from the standard input or from a file.  Bash also incorporates(合并) useful features from the Korn and C shells (ksh and csh).

       当然现在的shell不止这些功能,不同版本的shell在实现功能上也会有所差别,因为与本文无关,这里不再一一赘述。


二、shell如何运行命令
      在我看来shell是一个进程,shell每次运行命令的时候会以自己为模板,创建一个新的进程,这个新建的进程对命令进行处理,处理完之后结束自己的生命,等待shell进程进行回收。这个过程和《LINUX操作系统原理与应用》中讲的进程的一生完全吻合,可以很好的帮助我们理解LINUX内核创建进程的一系列操作。
1、shell调用fork()系统调用创建了一个子进程。
2、父进程就是shell自己,父进程调用wait()系统调用一直等待子进程结束。
3、子进程调用exec()系统调用执行命令,执行完成后,调用exit()系统调用结束生命。

4、父进程的wait()回收信息,释放子进程PCB,彻底销毁子进程。


三、shell如何实现
    下面是《Unix/Linux编程实践教程》中的代码。
#define MAXARGS 20 
#define ARGLEN 100 

main()
{
char *arglist[MAXARGS+1];
int numargs; 
char argbuf[ARGLEN]; 
char *makestring();

numargs = 0;
while ( numargs < MAXARGS )

printf("Arg[%d]? ", numargs);
if ( fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n' )
arglist[numargs++] = makestring(argbuf);
else
{
if ( numargs > 0 ){ 
arglist[numargs]=NULL; 
execute( arglist ); 
numargs = 0; 
}
}
}
return 0;
}

execute( char *arglist[] )
{
int pid,exitstatus;

pid = fork(); / /在这里,shell就有了自己的分身,也就是子进程(这里可以看作 存中运行了2个相同的进程 )。
switch( pid ){
case -1: 
perror("fork failed");
exit(1);
case 0:
execvp(arglist[0], arglist);  //如果PID是0,说明是子进程,运行新的命令(新的shell有了新的思想)。
perror("execvp failed");
exit(1);
default:
while( wait(&exitstatus) != pid )//父进程shell等待子进程结束,并获取信息。
;
printf("child exited with status %d,%d\n",
exitstatus>>8, exitstatus&0377);
}
}
char *makestring( char *buf )
{
char *cp, *malloc();

buf[strlen(buf)-1] = '\0';
cp = malloc( strlen(buf)+1 ); 
if ( cp == NULL ){ 
fprintf(stderr,"no memory\n");
exit(1);
}
strcpy(cp, buf); 
return cp; 

}


四、小结
      刚学习fork时候,一直把父子进程看作一个程序,只是在理论上知道fork是复制了一个自己,通过上面的程序终于对fork有了一个较为清晰的认识。就好比一个懒人自己总不想做事,想要学会分身术,让分身去做事。在linux中这个懒人就是init进程,他复制了很多自己来为他做事,这些孩子们遗传了他的个性,也喜欢复制自己去做事,这就是linux系统中的一个个进程。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值