Files
CS-LABS/vlad/rgz/client.c
2025-12-12 14:50:23 +07:00

134 lines
4.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// fifo_client.c
// Клиент: читает входной файл, отправляет содержимое в FIFO_REQUEST,
// читает ответ из FIFO_RESPONSE, отделяет "\nREPLACEMENTS:<n>\n",
// пишет обработанный текст в выходной файл и печатает количество замен.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // read, write, close, getpid
#include <fcntl.h> // open
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#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 <input_file> <output_file>\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);
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);
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: Ошибка чтения ответа: %s\n", strerror(errno));
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;
}