|
@@ -0,0 +1,211 @@
|
|
|
+#define _CRT_SECURE_NO_WARNINGS
|
|
|
+#include <stdio.h>
|
|
|
+#include <math.h>
|
|
|
+#include <malloc.h>
|
|
|
+#include <string.h>
|
|
|
+#include <stdlib.h>
|
|
|
+#include <fcntl.h> //работа с файлами
|
|
|
+#include <unistd.h> // закрытие файла
|
|
|
+#include <sys/stat.h> //S_IRWXU
|
|
|
+#include <sys/wait.h> //wait
|
|
|
+
|
|
|
+double *getCoeff(int start, int end, char *arr)
|
|
|
+{
|
|
|
+ double *coeff = malloc(sizeof(double));
|
|
|
+ *coeff = 0;
|
|
|
+ int znak = 1, drob = 0, step = 0;
|
|
|
+ if (arr[start] == '-')
|
|
|
+ {
|
|
|
+ znak = -1;
|
|
|
+ start++;
|
|
|
+ }
|
|
|
+ for (int k = start; k < end; k++)
|
|
|
+ {
|
|
|
+ if ((arr[k] >= '0' && arr[k] <= '9') || arr[k] == '.')
|
|
|
+ {
|
|
|
+ if (drob == 0 && arr[k] == '.')
|
|
|
+ drob = 1;
|
|
|
+ else if (arr[k] >= '0' && arr[k] <= '9')
|
|
|
+ {
|
|
|
+ if (drob == 0)
|
|
|
+ {
|
|
|
+ *coeff = (*coeff * pow(10, step)) + (arr[k] - '0');
|
|
|
+ step++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ *coeff += (arr[k] - '0') / pow(10, drob);
|
|
|
+ drob++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ *coeff = *coeff * znak;
|
|
|
+ return coeff;
|
|
|
+}
|
|
|
+
|
|
|
+double *readFile(char *name)
|
|
|
+{
|
|
|
+ int file = open(name, O_RDONLY); // Открытие файла только для чтения NULL
|
|
|
+ if (file == -1)
|
|
|
+ {
|
|
|
+ printf("Ошибка чтения файла");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ struct stat buf; //структура из файла stat.h
|
|
|
+ fstat(file, &buf);
|
|
|
+ int size = buf.st_size;
|
|
|
+ char *arr = malloc(size * sizeof(char));
|
|
|
+ read(file, arr, size);
|
|
|
+ close(file);
|
|
|
+ double *coeff = malloc(3 * sizeof(double));
|
|
|
+ int countSpace = 0;
|
|
|
+ int *index = malloc(size * sizeof(int));
|
|
|
+ for (int i = 0; i < size; i++)
|
|
|
+ {
|
|
|
+ if (arr[i] == ' ')
|
|
|
+ {
|
|
|
+ countSpace++;
|
|
|
+ index = realloc(index, countSpace * sizeof(int));
|
|
|
+ index[countSpace - 1] = i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (countSpace > 2)
|
|
|
+ return NULL;
|
|
|
+ int startIndex = 0; // начинается с 0, далее - все ячейки после пробела
|
|
|
+ double *pointer;
|
|
|
+ for (int i = 0; i < countSpace; i++)
|
|
|
+ {
|
|
|
+ pointer = getCoeff(startIndex, index[i], arr);
|
|
|
+ startIndex = index[i] + 1;
|
|
|
+ if (pointer)
|
|
|
+ coeff[i] = *pointer;
|
|
|
+ else
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ pointer = getCoeff(startIndex, size, arr);
|
|
|
+ if (pointer)
|
|
|
+ coeff[countSpace] = *pointer;
|
|
|
+ else
|
|
|
+ return NULL;
|
|
|
+ return coeff;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int error(char *name)
|
|
|
+{
|
|
|
+ int file = open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU); // Создать файл на чтение и запись и стереть данные если существует
|
|
|
+ char *message = "Файл содержит символы или другие некорректные данные";
|
|
|
+ write(file, message, strlen(message));
|
|
|
+ close(file);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int writeRootsToFile(char *name, double a, double b, double c)
|
|
|
+{
|
|
|
+ int file = open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU);
|
|
|
+ char* message = malloc(50);
|
|
|
+ int countRoot = 0;
|
|
|
+ if (a == 0) // проверка корректности
|
|
|
+ {
|
|
|
+ if (b == 0)
|
|
|
+ {
|
|
|
+ if (c == 0)
|
|
|
+ message = "Уравнение имеет бесконечно много решений.";
|
|
|
+ else
|
|
|
+ message = "Уравнение не имеет решений.";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ double x = -c / b; // Линейное уравнение
|
|
|
+ sprintf(message, "Уравнение имеет одно решение: x = %.2lf", x);
|
|
|
+ countRoot = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ double D = pow(b, 2) - (double)4 * a * c;
|
|
|
+ if (D >= 0)
|
|
|
+ {
|
|
|
+ if (D == 0)
|
|
|
+ {
|
|
|
+ double x = (-b) / (2 * a);
|
|
|
+ sprintf(message, "Корень один: %0.2lf", x);
|
|
|
+ countRoot = 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ double x1 = (-b + sqrt(D)) / (2 * a);
|
|
|
+ double x2 = (-b - sqrt(D)) / (2 * a);
|
|
|
+ sprintf(message, "Корни уравнения: %0.2lf, %0.2lf", x1, x2);
|
|
|
+ countRoot = 2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else message = "Корней нет";
|
|
|
+ }
|
|
|
+ write(file, message, strlen(message));
|
|
|
+ close(file);
|
|
|
+ switch (countRoot)
|
|
|
+ {
|
|
|
+ case 0: exit(0);
|
|
|
+ case 1: exit(1);
|
|
|
+ case 2: exit(2);
|
|
|
+ default: exit(-1);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+char *readFileResult(char *name)
|
|
|
+{
|
|
|
+ int file = open(name, O_RDONLY);
|
|
|
+ if (file == -1) printf("Ошибка чтения файла результата");
|
|
|
+ else
|
|
|
+ {
|
|
|
+ struct stat buf;
|
|
|
+ fstat(file, &buf);
|
|
|
+ int size = buf.st_size;
|
|
|
+ char *arr = malloc(size * sizeof(char));
|
|
|
+ read(file, arr, size);
|
|
|
+ close(file);
|
|
|
+ return arr;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int main()
|
|
|
+{
|
|
|
+ printf("Родитель %d считывает информацию\n", getpid());
|
|
|
+ char *fileResult = "result.txt";
|
|
|
+ double *arr = readFile("coefficients.txt");
|
|
|
+ int status;
|
|
|
+ char* show;
|
|
|
+ switch (fork())
|
|
|
+ {
|
|
|
+ case -1: exit(-1); break; //ошибка
|
|
|
+ case 0: //выполняется у дочернего процесса
|
|
|
+ printf("Ребенок %d записывает ответ в файл\n", getpid());
|
|
|
+ if (arr)
|
|
|
+ writeRootsToFile(fileResult, arr[0], arr[1], arr[2]);
|
|
|
+ else
|
|
|
+ error(fileResult);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ wait(&status); //Ожидание завершения дочернего процесса
|
|
|
+ switch (status)
|
|
|
+ {
|
|
|
+ case 0: printf("Корней нет\n"); break;
|
|
|
+ case 1:
|
|
|
+ show = readFileResult(fileResult);
|
|
|
+ printf("%s", show);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ show = readFileResult(fileResult);
|
|
|
+ printf("%s", show);
|
|
|
+ break;
|
|
|
+ default: printf("Что-то пошло не так\n"); break;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|