#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include //работа с файлами #include // закрытие файла #include //S_IRWXU #include //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; }