123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/wait.h>
- #include <math.h>
- int read_coefficients(double *a, double *b, double *c) {
- FILE *file;
- file = fopen("/home/alex/Рабочий стол/VScode_project/process_kv_yravn/koef.txt", "r");
- if (file == NULL) {
- perror("Ошибка открытия файла koef.txt");
- return 1;
- }
- if (fscanf(file, "%lf %lf %lf", a, b, c) != 3) {
- fprintf(stderr, "Ошибка чтения коэффициентов из файла.\n");
- fclose(file);
- return 1;
- }
- fclose(file);
- return 0;
- }
- int solve_quadratic_equation(double a, double b, double c) {
- double D = (b * b - 4 * a * c);
- double x1, x2;
- FILE *file;
- file = fopen("/home/alex/Рабочий стол/VScode_project/process_kv_yravn/rez.txt", "w");
- if (file == NULL) {
- perror("Ошибка открытия файла rez.txt");
- return -1;
- }
- fprintf(file, "Коэффициенты уравнения: a = %.2lf, b = %.2lf, c = %.2lf\n", a, b, c);
- if (a == 0) {
- if (b == 0) {
- if (c == 0) {
- fprintf(file, "Бесконечно много корней.\n");
- fclose(file);
- return -1;
- } else {
- fprintf(file, "Действительных корней нет.\n");
- fclose(file);
- return 0;
- }
- } else {
- x1 = -c / b;
- fprintf(file, "Один корень: x = %.2lf\n", x1);
- fprintf(file, "Дискриминант: %.2lf\n", D);
- fclose(file);
- return 1;
- }
- } else {
- if (D > 0) {
- x1 = (-b + sqrt(D)) / (2 * a);
- x2 = (-b - sqrt(D)) / (2 * a);
- fprintf(file, "Два корня: x1 = %.2lf, x2 = %.2lf\n", x1, x2);
- fprintf(file, "Дискриминант: %.2lf\n", D);
- fclose(file);
- return 2;
- } else if (D == 0) {
- x1 = -b / (2 * a);
- fprintf(file, "Один корень: x = %.2lf\n", x1);
- fprintf(file, "Дискриминант: %.2lf\n", D);
- fclose(file);
- return 1;
- } else {
- fprintf(file, "Действительных корней нет.\n");
- fclose(file);
- return 0;
- }
- }
- }
- int main() {
- int filedescreptor[2];
- pid_t pid;
- int status;
- double a, b, c;
- if (pipe(filedescreptor) == -1) {
- perror("Ошибка создания канала");
- return 1;
- }
- pid = fork();
- if (pid == 0) {
- close(filedescreptor[1]);
-
- read(filedescreptor[0], &a, sizeof(double));
- read(filedescreptor[0], &b, sizeof(double));
- read(filedescreptor[0], &c, sizeof(double));
- close(filedescreptor[0]);
- exit(solve_quadratic_equation(a, b, c));
- } else if (pid > 0) {
- close(filedescreptor[0]);
- if (read_coefficients(&a, &b, &c)) {
- return 1;
- }
-
- write(filedescreptor[1], &a, sizeof(double));
- write(filedescreptor[1], &b, sizeof(double));
- write(filedescreptor[1], &c, sizeof(double));
- close(filedescreptor[1]);
- wait(&status);
- if (WIFEXITED(status)) {
- int exit_code = WEXITSTATUS(status);
- printf("Дочерний процесс завершился с кодом: %d\n", exit_code);
- if (exit_code == 0) {
- printf("Действительных корней нет.\n");
- } else if (exit_code == 1) {
- printf("Один корень. Результат в файле rez.txt\n");
- } else if (exit_code == 2) {
- printf("Два корня. Результат в файле rez.txt\n");
- } else if (exit_code == -1){
- printf("Бесконечно много корней. Результат в файле rez.txt\n");
- }
- }
- } else {
- perror("Ошибка создания дочернего процесса");
- return 1;
- }
- return 0;
- }
|