0


Linux编写简易shell

思路:​


所以要写一个shell,需要循环以下过程:​

  1. 获取命令行
  2. 解析命令行
  3. 建立一个子进程(fork)
  4. 替换子进程(execvp)
  5. 父进程等待子进程退出(wait)

实现代码:​

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <fcntl.h>
  6. #define MAX_CMD 1024
  7. char command[MAX_CMD];
  8. int do_face()
  9. {
  10. memset(command, 0x00, MAX_CMD);
  11. printf("minishell$ ");
  12. fflush(stdout);
  13. if (scanf("%[^\n]%*c", command) == 0) {
  14. getchar();
  15. return -1;
  16. }
  17. return 0;
  18. }
  19. char **do_parse(char *buff)
  20. {
  21. int argc = 0;
  22. static char *argv[32];
  23. char *ptr = buff;
  24. while(*ptr != '\0') {
  25. if (!isspace(*ptr)) {
  26. argv[argc++] = ptr;
  27. while((!isspace(*ptr)) && (*ptr) != '\0') {
  28. ptr++;
  29. }
  30. }else {
  31. while(isspace(*ptr)) {
  32. *ptr = '\0';
  33. ptr++;
  34. }
  35. }
  36. }
  37. argv[argc] = NULL;
  38. return argv;
  39. }
  40. int do_exec(char *buff)
  41. {
  42. char **argv = {NULL};
  43. int pid = fork();
  44. if (pid == 0) {
  45. argv = do_parse(buff);
  46. if (argv[0] == NULL) {
  47. exit(-1);
  48. }
  49. execvp(argv[0], argv);
  50. }else {
  51. waitpid(pid, NULL, 0);
  52. }
  53. return 0;
  54. }
  55. int main(int argc, char *argv[])
  56. {
  57. while(1) {
  58. if (do_face() < 0)
  59. continue;
  60. do_exec(command);
  61. }
  62. return 0;
  63. }
  1. 以上就是本文的全部内容,如果对你有帮助,欢迎点赞收藏转发评论!
标签: linux 算法 运维

本文转载自: https://blog.csdn.net/Hamdh/article/details/135707429
版权归原作者 游是水里的游 所有, 如有侵权,请联系我们删除。

“Linux编写简易shell”的评论:

还没有评论