Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

197 рядки
3.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 роки тому
3 роки тому
3 роки тому
3 роки тому
3 роки тому
3 роки тому
3 роки тому
3 роки тому
  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)
  99. {
  100. int fd;
  101. if(fork() == 0)
  102. {
  103. if( (fd=open(prog2[0],O_RDWR | O_CREAT | O_NOCTTY | O_NDELAY))<0 )
  104. {
  105. perror("open");
  106. exit(0);
  107. }
  108. close(1);
  109. dup(fd);
  110. close(fd);
  111. execvp(prog1[0], prog1);
  112. remove(prog2[0]);
  113. exit(0);
  114. }
  115. wait(0);
  116. if(fork() == 0)
  117. {
  118. if( (fd=open(prog1[0],O_RDWR | O_NOCTTY | O_NDELAY))<0 )
  119. {
  120. exit(0);
  121. }
  122. close(0);
  123. dup(fd);
  124. close(fd);
  125. execvp(prog2[0], prog2);
  126. exit(0);
  127. }
  128. wait(0);
  129. }
  130. int Is_redirect(char **argv)
  131. {
  132. int i = 0;
  133. int Isopen = 0;
  134. char *cmd_0[MAXLINE];
  135. char *cmd_1[MAXLINE];
  136. while (argv[i]!=NULL)
  137. {
  138. if (argv[i][0] == '>')
  139. {
  140. Isopen = 1;
  141. }
  142. i++;
  143. }
  144. if(Isopen == 0)
  145. {
  146. return 0;
  147. }
  148. i = 0;
  149. while (argv[i][0] != '>')
  150. {
  151. cmd_0[i] = argv[i];
  152. i++;
  153. }
  154. cmd_0[i] = NULL;
  155. i++;
  156. int j = 0;
  157. while (argv[i]!=NULL)
  158. {
  159. cmd_1[j] = argv[i];
  160. i++;
  161. j++;
  162. }
  163. cmd_1[j] = NULL;
  164. shell_direct(cmd_0, cmd_1);
  165. return 1;
  166. }
  167. /*
  168. void mytop()
  169. {
  170. FILE *fp;
  171. unsigned int pagesize;
  172. unsigned long total, free, largest, cached;
  173. if ((fp = fopen("/proc/meminfo", "r")) == NULL)
  174. return 0;
  175. if (fscanf(fp, "%u %lu %lu %lu %lu", &pagesize, &total, &free, &largest, &cached) != 5)
  176. {
  177. fclose(fp);
  178. return 0;
  179. }
  180. fclose(fp);
  181. printf("main memory: %ldK total, %ldK free, %ldK contig free, %ldK cached\n",
  182. (pagesize * total)/1024, (pagesize * free)/1024,
  183. (pagesize * largest)/1024, (pagesize * cached)/1024);
  184. return 1;
  185. }
  186. */