main.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <sys/wait.h>
  7. #include <math.h>
  8. int read_coefficients(double *a, double *b, double *c) {
  9. FILE *file;
  10. file = fopen("/home/alex/Рабочий стол/VScode_project/process_kv_yravn/koef.txt", "r");
  11. if (file == NULL) {
  12. perror("Ошибка открытия файла koef.txt");
  13. return 1;
  14. }
  15. if (fscanf(file, "%lf %lf %lf", a, b, c) != 3) {
  16. fprintf(stderr, "Ошибка чтения коэффициентов из файла.\n");
  17. fclose(file);
  18. return 1;
  19. }
  20. fclose(file);
  21. return 0;
  22. }
  23. int solve_quadratic_equation(double a, double b, double c) {
  24. double D = (b * b - 4 * a * c);
  25. double x1, x2;
  26. FILE *file;
  27. file = fopen("/home/alex/Рабочий стол/VScode_project/process_kv_yravn/rez.txt", "w");
  28. if (file == NULL) {
  29. perror("Ошибка открытия файла rez.txt");
  30. return -1;
  31. }
  32. fprintf(file, "Коэффициенты уравнения: a = %.2lf, b = %.2lf, c = %.2lf\n", a, b, c);
  33. if (a == 0) {
  34. if (b == 0) {
  35. if (c == 0) {
  36. fprintf(file, "Бесконечно много корней.\n");
  37. fclose(file);
  38. return -1;
  39. } else {
  40. fprintf(file, "Действительных корней нет.\n");
  41. fclose(file);
  42. return 0;
  43. }
  44. } else {
  45. x1 = -c / b;
  46. fprintf(file, "Один корень: x = %.2lf\n", x1);
  47. fprintf(file, "Дискриминант: %.2lf\n", D);
  48. fclose(file);
  49. return 1;
  50. }
  51. } else {
  52. if (D > 0) {
  53. x1 = (-b + sqrt(D)) / (2 * a);
  54. x2 = (-b - sqrt(D)) / (2 * a);
  55. fprintf(file, "Два корня: x1 = %.2lf, x2 = %.2lf\n", x1, x2);
  56. fprintf(file, "Дискриминант: %.2lf\n", D);
  57. fclose(file);
  58. return 2;
  59. } else if (D == 0) {
  60. x1 = -b / (2 * a);
  61. fprintf(file, "Один корень: x = %.2lf\n", x1);
  62. fprintf(file, "Дискриминант: %.2lf\n", D);
  63. fclose(file);
  64. return 1;
  65. } else {
  66. fprintf(file, "Действительных корней нет.\n");
  67. fclose(file);
  68. return 0;
  69. }
  70. }
  71. }
  72. int main() {
  73. int filedescreptor[2];
  74. pid_t pid;
  75. int status;
  76. double a, b, c;
  77. if (pipe(filedescreptor) == -1) {
  78. perror("Ошибка создания канала");
  79. return 1;
  80. }
  81. pid = fork();
  82. if (pid == 0) {
  83. close(filedescreptor[1]);
  84. read(filedescreptor[0], &a, sizeof(double));
  85. read(filedescreptor[0], &b, sizeof(double));
  86. read(filedescreptor[0], &c, sizeof(double));
  87. close(filedescreptor[0]);
  88. exit(solve_quadratic_equation(a, b, c));
  89. } else if (pid > 0) {
  90. close(filedescreptor[0]);
  91. if (read_coefficients(&a, &b, &c)) {
  92. return 1;
  93. }
  94. write(filedescreptor[1], &a, sizeof(double));
  95. write(filedescreptor[1], &b, sizeof(double));
  96. write(filedescreptor[1], &c, sizeof(double));
  97. close(filedescreptor[1]);
  98. wait(&status);
  99. if (WIFEXITED(status)) {
  100. int exit_code = WEXITSTATUS(status);
  101. printf("Дочерний процесс завершился с кодом: %d\n", exit_code);
  102. if (exit_code == 0) {
  103. printf("Действительных корней нет.\n");
  104. } else if (exit_code == 1) {
  105. printf("Один корень. Результат в файле rez.txt\n");
  106. } else if (exit_code == 2) {
  107. printf("Два корня. Результат в файле rez.txt\n");
  108. } else if (exit_code == -1){
  109. printf("Бесконечно много корней. Результат в файле rez.txt\n");
  110. }
  111. }
  112. } else {
  113. perror("Ошибка создания дочернего процесса");
  114. return 1;
  115. }
  116. return 0;
  117. }