anonim.c 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Использование анонимного канала для передачи строковых значений между процессами
  2. #include <stdio.h> //для стандартных функций ввода-вывода
  3. #include <unistd.h> //для использования системных функций линукса
  4. #include <string.h> //для работы со строками (strlen)
  5. #include <stdlib.h> //для работы с памятью (free)
  6. #include <malloc.h> //для работы с динамическим выделением памяти (calloc)
  7. #include <sys/wait.h>
  8. #define BUF_SIZE 40 // размер буфера - именно по столько символов разделяться передаваемое сообщение
  9. #define MESSAGE "Йо, меня прочитали" // сообщение
  10. //можно сделать чтобы оно вводилось в ручную
  11. int main()
  12. {
  13. system("chcp 1251 > null");
  14. int pfd[2]; // файловые дескрипторы канала
  15. /*
  16. канал имеет 2 конца:
  17. 0 - конец для чтения
  18. 1 - конец для записи
  19. */
  20. ssize_t numRead;
  21. if (pipe(pfd) == -1) // Создаем канал
  22. _exit(1); // в случае ошибки завершаем работу программы
  23. // работаем с процессами
  24. switch (fork()) // делаем ребенка
  25. {
  26. case -1: // ошибка при создании дочеренго процесса
  27. _exit(1);
  28. case 0: // бебик - потомок только читает данные из канала
  29. {
  30. if (close(pfd[1]) == -1) // если не получилось закрыть конец для записи - выходим принудительно
  31. _exit(1);
  32. do // Считываем данные из канала до тех пор, пока он не опустеет
  33. {
  34. char *buf = calloc(1, BUF_SIZE); // создаем буфер для чтения
  35. numRead = read(pfd[0], buf, BUF_SIZE); // операция блокируется до тех пор, пока в канал не поступят данные
  36. if (numRead == -1)
  37. _exit(1);
  38. printf("Родитель написал: %s\n", buf); // выводим на экран то, что прочитали
  39. free(buf); // очищаем буфер
  40. } while (numRead != 0);
  41. if (close(pfd[0]) == -1) // если не получилось закрыть конец для чтения - выходим принудительно
  42. _exit(1);
  43. _exit(0); // заканчиваем существование дочеренго процесса
  44. }
  45. default: // родитель - только записывает в канал
  46. {
  47. if (close(pfd[0]) == -1) // если не получилось закрыть конец для чтения - выходим принудительно
  48. _exit(1);
  49. /* Пример с со своим вводом
  50. char *str = calloc(100, sizeof(char));
  51. gets(str, 100);
  52. write(pfd[1], str, strlen(str));*/
  53. if (write(pfd[1], MESSAGE, strlen(MESSAGE)) != strlen(MESSAGE))
  54. _exit(1);
  55. if (close(pfd[1]) == -1) // Потомок увидит символ завершения файла
  56. _exit(1);
  57. wait(NULL); // Ждем завершения потомка
  58. _exit(0); // успешно завершаем процесс
  59. }
  60. }
  61. }