You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
2.4 KiB

пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <signal.h>
  5. #include<fcntl.h>
  6. #include "mytop.c"
  7. //#include "fun.h"
  8. void eval(char *cmdline)
  9. {
  10. char *argv[MAXLINE];
  11. char buf[MAXLINE];
  12. int isBg;
  13. int pid;
  14. strcpy(buf,cmdline);
  15. isBg = parseline(cmdline,argv);
  16. if(argv[0] == NULL)
  17. {
  18. return;
  19. }
  20. if(!builtin_cmd(argv))
  21. {
  22. if((pid=fork())==0)
  23. {
  24. if(isBg)
  25. {
  26. int fd = open( "/dev/null", O_RDWR );
  27. dup2( fd, 0 );
  28. dup2( fd, 1 );
  29. signal(SIGCHLD, SIG_IGN);
  30. }
  31. if(execvp(argv[0],argv)<0)
  32. {
  33. printf("%s:Command not found.\n",argv[0]);
  34. exit(0);
  35. }
  36. }
  37. if(!isBg)
  38. {
  39. wait(0);
  40. return;
  41. }
  42. else
  43. {
  44. signal(SIGCHLD, SIG_IGN);
  45. return;
  46. }
  47. }
  48. }
  49. int parseline(const char *cmdline, char **argv)
  50. {
  51. static char array[MAXLINE];
  52. char *buf = array;
  53. char *delim;
  54. int argc;
  55. int bg;
  56. strcpy(buf, cmdline);
  57. buf[strlen(buf)-1] = ' ';
  58. while (*buf && (*buf == ' '))
  59. buf++;
  60. argc = 0;
  61. if (*buf == '\'')
  62. {
  63. buf++;
  64. delim = strchr(buf, '\'');
  65. }
  66. else
  67. {
  68. delim = strchr(buf, ' ');
  69. }
  70. while (delim)
  71. {
  72. argv[argc++] = buf;
  73. *delim = '\0';
  74. buf = delim + 1;
  75. while (*buf && (*buf == ' '))
  76. {
  77. buf++;
  78. }
  79. if (*buf == '\'')
  80. {
  81. buf++;
  82. delim = strchr(buf, '\'');
  83. }
  84. else
  85. {
  86. delim = strchr(buf, ' ');
  87. }
  88. }
  89. argv[argc] = NULL;
  90. if (argc == 0)
  91. return 1;
  92. if ((bg = (*argv[argc-1] == '&')) != 0)
  93. {
  94. argv[--argc] = NULL;
  95. }
  96. return bg;
  97. }
  98. int builtin_cmd(char **argv)
  99. {
  100. if(Is_pipe(argv)==1)
  101. {
  102. return 1;
  103. }
  104. if(Is_redirect(argv)==1)
  105. {
  106. return 1;
  107. }
  108. if(!strcmp(argv[0],"quit")||!strcmp(argv[0],"exit"))
  109. {
  110. exit(0);
  111. }
  112. if(!strcmp(argv[0],"history"))
  113. {
  114. print_history(argv[1]);
  115. return 1;
  116. }
  117. if(!strcmp(argv[0],"cd"))
  118. {
  119. if (argv[1] == NULL)
  120. {
  121. return 1;
  122. }
  123. else
  124. {
  125. if (chdir(argv[1]) != 0)
  126. {
  127. perror("Error: ");
  128. }
  129. return 1;
  130. }
  131. }
  132. if(!strcmp(argv[0],"mytop"))
  133. {
  134. mytop();
  135. return 1;
  136. }
  137. return 0;
  138. }