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