设为首页 收藏本站
查看: 869|回复: 0

LINUX shell和进程创建

[复制链接]

尚未签到

发表于 2015-10-26 10:02:20 | 显示全部楼层 |阅读模式
一、在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(&quot;Arg[%d]? &quot;, numargs);
if ( fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n' )
arglist[numargs&#43;&#43;] = 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(&quot;fork failed&quot;);
exit(1);
case 0:
execvp(arglist[0], arglist); //如果PID是0,说明是子进程,运行新的命令(新的shell有了新的思想)。
perror(&quot;execvp failed&quot;);
exit(1);
default:
while( wait(&exitstatus) != pid )//父进程shell等待子进程结束,并获取信息。
;
printf(&quot;child exited with status %d,%d\n&quot;,
exitstatus>>8, exitstatus&0377);
}
}
char *makestring( char *buf )
{
char *cp, *malloc();

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

四、小结
      刚学习fork时候,一直把父子进程看作一个程序,只是在理论上知道fork是复制了一个自己,通过上面的程序终于对fork有了一个较为清晰的认识。就好比一个懒人自己总不想做事,想要学会分身术,让分身去做事。在linux中这个懒人就是init进程,他复制了很多自己来为他做事,这些孩子们遗传了他的个性,也喜欢复制自己去做事,这就是linux系统中的一个个进程。         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-130853-1-1.html 上篇帖子: Linux/Unix shell 监控Oracle监听器(monitor listener) 下篇帖子: Bash (Bourne Again Shell)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表