c/c++语言开发共享如何在C中创建一个虚拟shell?

我有一个带有参数的虚拟shell程序。 但是,我希望它不带参数,而是提示让用户输入可执行程序和参数的名称。

例如:

$dummyshell >(executable program and parameters go here) 

这是我到目前为止的代码:

 #include  #include  #include  #include  #include  #include  #define BUFFER_SIZE 1<<16 #define ARRAY_SIZE 1<= &bufCmdArgs[cmdArgsSize])) break; } for (p=n=0; bufCmdArgs[n]!=NULL; n++){ if(strlen(bufCmdArgs[n])>0) cmdArgs[p++]=bufCmdArgs[n]; } *nargs=p; cmdArgs[p]=NULL; } int main(int argc, char *argv[], char *envp[]){ char buffer[BUFFER_SIZE]; char *args[ARRAY_SIZE]; char hflag = 'N'; int *retStatus; size_t nargs; pid_t pid; while(1){ printf("$dummyshell "); fgets(buffer, BUFFER_SIZE, stdin); parseCmdArgs(buffer, args, ARRAY_SIZE, &nargs); if (nargs==0) continue; if (!strcmp(args[0], "help")) { printf("cat cd (absolute path references onlyn"); printf("exitn"); printf("help historyn"); printf("jobs killn"); printf("ls moren"); printf("ps pwdn"); continue; } if (!strcmp(args[0], "exit" )) exit(0); pid = fork(); if (pid){ pid = wait(retStatus); } else { if( execvp(args[0], args)) { puts(strerror(errno)); exit(127); } } } return 0; } 

    你觉得这条线怎么样?

     cmdArgs[0], buf, bufCmdArgs[0] = buffer; 

    它实际上评估了未初始化的cmdArgs[0]并将其丢弃; 然后它评估未初始化的buf并抛出它,最后分配给bufCmdArgs[0] 。 如果要分配所有三个变量,请使用赋值运算符代替逗号运算符:

     cmdArgs[0] = buf = bufCmdArgs[0] = buffer; 

    既不使用hflag也不使用main()的参数; 摆脱它们( int main(void) )。 你应该#include ; 你应该将retStatus更改为一个简单的int ,然后将&retStatus传递给wait() 。 如果失败了,你需要初始化retStatus ,使它指向一个可以分配给的int

    通过这些更改,代码运行正常 – 有点。 它正确执行了ls -l 。 然而, 控制-D (EOF)退出失败可怕(在我能够打断它之前,我已经看到了我的目录的普通ls列表。

    另外,你最终也会意识到命令cd和exit(也可能是历史)需要特别注意; 它们是shell内置的有充分理由。 然而,这是后来的。

    你知道一种修改我的程序的方法吗?如果用户在程序的末尾键入一个’&’符号及其参数,那么虚拟shell将在后台而不是前台运行程序?

    是的,我知道如何做到这一点。 基本上,你没有执行wait() (当你执行wait() ,你会检查你收集信息的死进程是否是你期望的进程,或者它是否是你的shell的后台进程之一。


    半工作代码

     #include  #include  #include  #include  #include  #include  #define BUFFER_SIZE 1<<16 #define ARRAY_SIZE 1<<16 static void parseCmdArgs(char *buffer, char** cmdArgs, size_t cmdArgsSize, size_t *nargs) { char *bufCmdArgs[cmdArgsSize]; char **temp; char *buf; size_t n, p; cmdArgs[0] = buf = bufCmdArgs[0] = buffer; for(temp=bufCmdArgs; (*temp=strsep(&buf, " nt")) != NULL ;){ if ((*temp != '') && (++temp >= &bufCmdArgs[cmdArgsSize])) break; } for (p=n=0; bufCmdArgs[n]!=NULL; n++){ if(strlen(bufCmdArgs[n])>0) cmdArgs[p++]=bufCmdArgs[n]; } *nargs=p; cmdArgs[p]=NULL; } //int main(int argc, char *argv[], char *envp[]){ int main(void) { char buffer[BUFFER_SIZE]; char *args[ARRAY_SIZE]; int retStatus; size_t nargs; pid_t pid; while(1){ printf("$dummyshell "); fgets(buffer, BUFFER_SIZE, stdin); parseCmdArgs(buffer, args, ARRAY_SIZE, &nargs); if (nargs==0) continue; if (!strcmp(args[0], "help")) { printf("cat cd (absolute path references onlyn"); printf("exitn"); printf("help historyn"); printf("jobs killn"); printf("ls moren"); printf("ps pwdn"); continue; } if (!strcmp(args[0], "exit" )) exit(0); pid = fork(); if (pid){ pid = wait(&retStatus); } else { if( execvp(args[0], args)) { puts(strerror(errno)); exit(127); } } } return 0; } 

    您可能会注意到错误消息应该在标准错误上报告,而不是标准输出(因此puts(strerror(errno))应该是fprintf(stderr, "%sn", strerror(errno));因为fputs()不会添加换行符但puts()确实如此。

      以上就是c/c++开发分享如何在C中创建一个虚拟shell?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/519119.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐