// fifo_client.c - Клиентская программа с использованием именованных каналов (FIFO) #include #include #include #include #include #include #include #include #define FIFO_REQUEST "/tmp/fifo_request" #define FIFO_RESPONSE "/tmp/fifo_response" #define BUFFER_SIZE 4096 void print_usage(const char *progname) { fprintf(stderr, "Usage: %s \n", progname); fprintf(stderr, "Example: %s input.txt output.txt\n", progname); } int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "ERROR: Неверное количество аргументов\n"); print_usage(argv[0]); return 1; } const char *input_file = argv[1]; const char *output_file = argv[2]; printf("=== FIFO Client ===\n"); printf("Client PID: %d\n", getpid()); printf("Входной файл: %s\n", input_file); printf("Выходной файл: %s\n", output_file); // Открываем входной файл int in_fd = open(input_file, O_RDONLY); if (in_fd < 0) { fprintf(stderr, "ERROR: Не удалось открыть входной файл %s: %s\n", input_file, strerror(errno)); return 1; } // Читаем данные из файла char *buffer = malloc(BUFFER_SIZE); if (!buffer) { fprintf(stderr, "ERROR: Не удалось выделить память\n"); close(in_fd); return 1; } ssize_t bytes_read = read(in_fd, buffer, BUFFER_SIZE - 1); close(in_fd); if (bytes_read < 0) { fprintf(stderr, "ERROR: Не удалось прочитать файл: %s\n", strerror(errno)); free(buffer); return 1; } buffer[bytes_read] = '\0'; printf("Прочитано байт из файла: %zd\n", bytes_read); // Открываем FIFO для отправки запроса printf("Отправка запроса серверу...\n"); int fd_req = open(FIFO_REQUEST, O_WRONLY); if (fd_req == -1) { fprintf(stderr, "ERROR: Не удалось открыть FIFO запроса: %s\n", strerror(errno)); fprintf(stderr, "Убедитесь, что сервер запущен!\n"); free(buffer); return 1; } // Отправляем данные серверу ssize_t bytes_written = write(fd_req, buffer, bytes_read); close(fd_req); if (bytes_written != bytes_read) { fprintf(stderr, "ERROR: Ошибка отправки данных\n"); free(buffer); return 1; } printf("Отправлено байт: %zd\n", bytes_written); // Открываем FIFO для получения ответа printf("Ожидание ответа от сервера...\n"); int fd_resp = open(FIFO_RESPONSE, O_RDONLY); if (fd_resp == -1) { fprintf(stderr, "ERROR: Не удалось открыть FIFO ответа: %s\n", strerror(errno)); free(buffer); return 1; } // Читаем обработанные данные ssize_t response_bytes = read(fd_resp, buffer, BUFFER_SIZE - 1); close(fd_resp); if (response_bytes < 0) { fprintf(stderr, "ERROR: Ошибка чтения ответа\n"); free(buffer); return 1; } buffer[response_bytes] = '\0'; printf("Получено байт от сервера: %zd\n", response_bytes); // Ищем информацию о количестве замен char *replacements_info = strstr(buffer, "\nREPLACEMENTS:"); long long replacements = 0; if (replacements_info) { sscanf(replacements_info, "\nREPLACEMENTS:%lld", &replacements); *replacements_info = '\0'; // Обрезаем служебную информацию response_bytes = replacements_info - buffer; } // Открываем выходной файл int out_fd = open(output_file, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (out_fd < 0) { fprintf(stderr, "ERROR: Не удалось открыть выходной файл %s: %s\n", output_file, strerror(errno)); free(buffer); return 1; } // Записываем обработанные данные ssize_t written = write(out_fd, buffer, response_bytes); close(out_fd); if (written != response_bytes) { fprintf(stderr, "ERROR: Ошибка записи в выходной файл\n"); free(buffer); return 1; } printf("Записано байт в выходной файл: %zd\n", written); printf("Количество выполненных замен: %lld\n", replacements); printf("\nОбработка завершена успешно!\n"); free(buffer); return 0; }