Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

200 rader
3.4 KiB

3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
3 år sedan
  1. #include <string.h>
  2. #include<fcntl.h>
  3. //#include "fun.h"
  4. static int num = 0;
  5. static char storage[MAXLINE][MAXLINE];
  6. void history(char *cmdline)
  7. {
  8. strcpy(storage[num], cmdline);
  9. num++;
  10. }
  11. void print_history(char *argv)
  12. {
  13. int i = 0;
  14. if(argv == NULL)
  15. {
  16. for(; i<num; i++)
  17. puts(storage[i]);
  18. return;
  19. }
  20. i = num - atoi(argv);
  21. if(i < 0)
  22. {
  23. i = 0;
  24. }
  25. for(; i<num; i++)
  26. puts(storage[i]);
  27. }
  28. void shell_pip(char **prog1, char **prog2)
  29. {
  30. int des_p[2];
  31. if(pipe(des_p) == -1)
  32. {
  33. perror("Pipe failed");
  34. exit(1);
  35. }
  36. if(fork() == 0)
  37. {
  38. close(1);
  39. dup(des_p[1]);
  40. close(des_p[0]);
  41. close(des_p[1]);
  42. execvp(prog1[0], prog1);
  43. perror("execvp of prog1 failed");
  44. exit(1);
  45. }
  46. if(fork() == 0)
  47. {
  48. close(0);
  49. dup(des_p[0]);
  50. close(des_p[1]);
  51. close(des_p[0]);
  52. execvp(prog2[0], prog2);
  53. perror("execvp of prog2 failed");
  54. exit(1);
  55. }
  56. close(des_p[0]);
  57. close(des_p[1]);
  58. wait(0);
  59. wait(0);
  60. }
  61. int Is_pipe(char **argv)
  62. {
  63. int i = 0;
  64. int Ispipe = 0;
  65. char *cmd_0[MAXLINE];
  66. char *cmd_1[MAXLINE];
  67. while (argv[i]!=NULL)
  68. {
  69. if (argv[i][0] == '|')
  70. {
  71. Ispipe = 1;
  72. }
  73. i++;
  74. }
  75. if(Ispipe == 0)
  76. {
  77. return 0;
  78. }
  79. i = 0;
  80. while (argv[i][0] != '|')
  81. {
  82. cmd_0[i] = argv[i];
  83. i++;
  84. }
  85. cmd_0[i] = NULL;
  86. i++;
  87. int j = 0;
  88. while (argv[i]!=NULL)
  89. {
  90. cmd_1[j] = argv[i];
  91. i++;
  92. j++;
  93. }
  94. cmd_1[j] = NULL;
  95. shell_pip(cmd_0, cmd_1);
  96. return 1;
  97. }
  98. void shell_direct(char **prog1, char **prog2, char Isopen)
  99. {
  100. int fd;
  101. if(Isopen == '>')
  102. {
  103. if(fork() == 0)
  104. {
  105. if( (fd=open(prog2[0],O_RDWR | O_CREAT | O_NOCTTY | O_NDELAY))<0 )
  106. {
  107. perror("open");
  108. exit(0);
  109. }
  110. close(1);
  111. dup(fd);
  112. close(fd);
  113. execvp(prog1[0], prog1);
  114. remove(prog2[0]);
  115. exit(0);
  116. }
  117. wait(0);
  118. if(fork() == 0)
  119. {
  120. if( (fd=open(prog1[0],O_RDWR | O_NOCTTY | O_NDELAY))<0 )
  121. {
  122. exit(0);
  123. }
  124. close(0);
  125. dup(fd);
  126. close(fd);
  127. execvp(prog2[0], prog2);
  128. exit(0);
  129. }
  130. wait(0);
  131. }
  132. if(Isopen == '<')
  133. {
  134. if(fork() == 0)
  135. {
  136. if( (fd=open(prog2[0],O_RDWR | O_NOCTTY | O_NDELAY))<0 )
  137. {
  138. perror("open");
  139. exit(0);
  140. }
  141. close(0);
  142. dup(fd);
  143. close(fd);
  144. execvp(prog1[0], prog1);
  145. exit(0);
  146. }
  147. wait(0);
  148. }
  149. return;
  150. }
  151. int Is_redirect(char **argv)
  152. {
  153. int i = 0;
  154. char Isopen = '0';
  155. char *cmd_0[MAXLINE];
  156. char *cmd_1[MAXLINE];
  157. while (argv[i]!=NULL)
  158. {
  159. if (argv[i][0] == '>')
  160. {
  161. Isopen = '>';
  162. }
  163. if (argv[i][0] == '<')
  164. {
  165. Isopen = '<';
  166. }
  167. i++;
  168. }
  169. if(Isopen == '0')
  170. {
  171. return 0;
  172. }
  173. i = 0;
  174. while (argv[i][0] != '>' && argv[i][0] != '<')
  175. {
  176. cmd_0[i] = argv[i];
  177. i++;
  178. }
  179. cmd_0[i] = NULL;
  180. i++;
  181. int j = 0;
  182. while (argv[i]!=NULL)
  183. {
  184. cmd_1[j] = argv[i];
  185. i++;
  186. j++;
  187. }
  188. cmd_1[j] = NULL;
  189. shell_direct(cmd_0, cmd_1, Isopen);
  190. return 1;
  191. }