当前位置:  技术问答>linux和unix

完成一个外壳程序myshell.c,多谢多谢!

    来源: 互联网  发布时间:2016-12-03

    本文导语:  #include  #include    #include  #include  main (){         int i; pid_t pid;  /* pid of forked child */         char cmdline[128]; /* store the command */         char *args[6];     /* table of pointers to arguments;     ...

#include 
#include 
 
#include 
#include 

main (){

        int i; pid_t pid;  /* pid of forked child */

        char cmdline[128]; /* store the command */
        char *args[6];     /* table of pointers to arguments;
                              assume at most 4 arguments  */
        while(1){

                fputs("nmy shell> ", stdout);          /* shell prompt */
                fgets(cmdline, 128, stdin);             /* read command line */

                i = 0;
                if ( (args[0] = strtok(cmdline, "n t")) == NULL)
                        continue;

. . .

                pid = fork();

                if (pid (已完成),之后输入命令,要求能识别命令(可以用strtok()),并用fork()系统呼叫产生出新的子进程。
   命令的格式为(中为必选,[]中为可选,中间有空格):   ....  [&]

2. 子进程(运行中的程序)用exec()系统呼叫去运行一个具体的程序(程序名就是命令名),父进程(外壳程序)在子进程运行其间等待直到子进程结束(用wait()系统呼叫实现),除非是后台运行(命令最后加符号&)
   子进程结束后(程序运行结束后)回到显示my shell>

3. 另外需要识别两个内部命令: exit(退出这个外壳程序) 和 cd ...(去别的目录),识别exit用exit()系统呼叫实现,识别cd用chdir()系统呼叫实现。

4. 如果没有输入命令,则退出这个外壳程序。(与输入exit一样)

5. 此外壳程序需要运用的最重要的两个系统呼叫是fork()和execvp(),另外还有一些系统呼叫,如果这些系统呼叫因为无法预料的原因失败,则需要检查其返回状态并报告其错误。

|
#include  
#include  

#include  
#include  

main (){

        int i; pid_t pid;  /* pid of forked child */

        char cmdline[128]; /* store the command */
        char *args[6];     /* table of pointers to arguments;
                              assume at most 4 arguments  */
        while(1){
                fputs("nmy shell> ", stdout);          /* shell prompt */
                fgets(cmdline, 128, stdin);             /* read command line */

                //i = 0;
               // if ( (args[0] = strtok(cmdline, "n t")) == NULL)
                //        continue;
                
                //没有命令直接退出了
                if ( (args[0] = strtok(cmdline, "n t")) == NULL)
                      break;

//解析出其他参数
i = 1;
while ((args[i++] = strtok(NULL, "n t")) != NULL)
;

//exit 命令就直接退出了
if (strcmp(args[0], "exit") == 0) {
exit(0);
}

//cd命令就进入
if (strcmp(args[0], "cd") == 0) {
if (args[1] != NULL) {
chdir(args[1]);
}
else {
printf("command errorn");
continue;
}
}

                pid = fork();

                if (pid  

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在MyEclipse中设开启xml文件自动提示和自动完成功能
  • olap工具软件,主体开发工作已经完成,欠缺web方式交互式的分析数据功能,欲通过java来完成,寻求合作
  • php安装完成后如何添加mysql扩展
  • 未使用链接器输入文件,因为链接尚未完成
  • CentOS下PHP安装完成后继续安装GD扩展库
  • jQuery自动完成插件 jqac
  • 输入框自动完成组件 AutoSuggest
  • 请问如何确认FTP上传完成。谢谢。
  • jQuery输入自动完成 Combogrid
  • jQuery自动完成插件 jQuery.autocomplete
  • 请问BASH如何查询一个程序完成的进度
  • jQuery 自动完成插件 jQuery completer
  • jQuery自动完成插件 Autobox2
  • jQuery自动完成插件 jQuery AutoComplete
  • 在tomcat下,如何记录用户已经关闭浏览器了,并完成处理?
  • 怎样停止一个未完成的I/O操作?
  • 完成一个文件上传需要解决那些问题?
  • 急!急!red hat linux9.0 安装完成不能进入图形界面
  • 求用c语言完成下载文档的cgi
  • fedora9正式版安装完成重启时显示“输入不支援”怎么办?急!
  • 通过rpm完成安装GCC之后 。。。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3