fork download
  1. #include <sys/wait.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6.  
  7. int lsh_launch(char **args)
  8. {
  9. pid_t pid, wpid;
  10. int status;
  11. pid = fork();
  12. if (pid == 0)
  13. {
  14. //принимаем имя и массив аргументов
  15. if (execvp(args[0], args) == -1)
  16. { //первое слово массива определяем как команду, остальные аргументы
  17. perror("lsh"); //abcd-команда. fddeh,egf-аргументы
  18. }
  19. exit(EXIT_FAILURE);
  20. } else if (pid < 0)
  21. {
  22. // ошибка в создании
  23. perror("lsh");
  24. } else
  25. {
  26. do
  27. { //ну а если все хорошо, то ждем ее завершения
  28. wpid = waitpid(pid, &status, WUNTRACED);
  29. }
  30. while (!WIFEXITED(status) && !WIFSIGNALED(status));
  31. }
  32. return 1;
  33. }
  34.  
  35. int lsh_execute(char **args)
  36. {
  37. return lsh_launch(args);
  38. }
  39.  
  40. #define LSH_RL_BUFSIZE 1024
  41. char *lsh_read_line()
  42. {
  43. int bufsize = LSH_RL_BUFSIZE;
  44. int position = 0;
  45. char *buffer = malloc(sizeof(char) * bufsize);
  46. char c;
  47. if (!buffer)
  48. {
  49. fprintf(stderr, "lsh: Ошибка памяти\n");
  50. exit(EXIT_FAILURE);
  51. }
  52. while (((c=getchar())!=EOF)||(c!='\n'))
  53. {
  54. //при EOF или \n обнуляем буффер и возвращаем его значение
  55. buffer[position] = c;
  56. position++; //должны ввести с ввода и заполнить массив
  57. printf("%s",buffer); //то есть получаем строку abcd fddeh egf
  58. if (position >= bufsize)
  59. {
  60. bufsize += LSH_RL_BUFSIZE;
  61. buffer = realloc(buffer, bufsize); //расширяем если не хватило
  62. if (!buffer)
  63. {
  64. fprintf(stderr, "lsh: Ошибка памяти\n");
  65. exit(EXIT_FAILURE);
  66. }
  67. }
  68. }
  69. buffer[position] = '\0';
  70. printf("%s",buffer);
  71. return buffer;
  72. }
  73.  
  74. #define LSH_TOK_BUFSIZE 100
  75. char **lsh_split_line(char *line)
  76. {
  77. printf("%d",1);
  78. int bufsize0 = LSH_TOK_BUFSIZE;
  79. int bufsize = LSH_TOK_BUFSIZE, position = 0;
  80. char **tokens = malloc(bufsize * sizeof(char*));
  81. int flag = 0;//определение кавычек
  82. int pos = 0;
  83. char ch = 0;
  84. printf("А тут line%s",line);
  85. while ((ch!=EOF)||(ch!='\n')) //приравнием ch строку посимвольно
  86. {
  87. ch = line[pos];
  88. printf("%c",ch);
  89. if ((ch=='\"')&&(flag==1)) flag = 0; //дожен выйти массив tokens[0]=abcd; tokens[1]=fddeh; tokens[2]=egf
  90. if ((ch=='\"')&&(flag==0)) flag = 1;
  91. if ((ch!=' ')||((ch==' ')&&(flag = 1)))
  92. {
  93. tokens[position][pos] = ch;
  94. pos++;
  95. }
  96. else
  97. {
  98. printf("\n");
  99. printf("%s",tokens[position]);
  100. position++;
  101. }
  102. if (position >= bufsize) { //расширяем если не хватило строк или пасяти для строк то выделяем
  103. bufsize += LSH_TOK_BUFSIZE;
  104. tokens = realloc(tokens, bufsize * sizeof(char*));
  105. if (!tokens) {
  106. fprintf(stderr, "lsh: Ошибка памяти\n");
  107. exit(EXIT_FAILURE);
  108. }
  109. }
  110. if (pos >= bufsize0)
  111. {
  112. bufsize0 += LSH_TOK_BUFSIZE;
  113. tokens[position] = realloc(tokens[position], bufsize0 * sizeof(char*));
  114. if (!tokens)
  115. {
  116. fprintf(stderr, "lsh: Ошибка памяти\n");
  117. exit(EXIT_FAILURE);
  118. }
  119. }
  120. }
  121. tokens[position] = NULL;
  122. return tokens;
  123. }
  124.  
  125.  
  126. void lsh_loop(void)
  127. {
  128. char *line;
  129. char **args;
  130. int status;
  131.  
  132. do
  133. {
  134. printf("> "); //приглашаем
  135. line = lsh_read_line(); //функция чтения входной строки
  136. args = lsh_split_line(line); //разбиение
  137. status = lsh_execute(args); //выполнение
  138.  
  139. free(line); //очистка
  140. free(args);
  141. } while (status);
  142. }
  143.  
  144. int main(int argc, char **argv)
  145. {
  146. //загрузка файлов если они есть и запуск команд
  147. lsh_loop();
  148. return EXIT_SUCCESS;
  149. }
  150.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.c: In function ‘lsh_launch’:
prog.c:9:3: error: unknown type name ‘pid_t’
   pid_t pid, wpid;
   ^~~~~
prog.c:9:14: warning: variable ‘wpid’ set but not used [-Wunused-but-set-variable]
   pid_t pid, wpid;
              ^~~~
stdout
Standard output is empty