1.4 to prod
This commit is contained in:
ada-dmitry
2023-12-08 12:59:45 +03:00
parent fd68d8046e
commit 4e08a3ad71
19 changed files with 636 additions and 11 deletions
+92
View File
@@ -0,0 +1,92 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
int linesWritten = 0;
void signalHandler(int signal)
{
printf("Number of lines written: %d\n", linesWritten);
}
void writeFile(const char *fileName, int numLines, const char *placeholder)
{
int fd = open(fileName, O_CREAT | O_WRONLY | O_TRUNC, 0666);
if (fd == -1)
{
printf("Failed to open the file\n");
exit(EXIT_FAILURE);
}
if (flock(fd, LOCK_EX) == -1)
{
printf("Failed to lock file for exclusive use\n");
exit(EXIT_FAILURE);
}
signal(SIGINT, signalHandler);
// lseek(fd, 0, SEEK_END);
for (int i = 0; i < numLines; i++)
{
dprintf(fd, "%s\n", placeholder);
linesWritten++;
usleep(100000);
}
if (flock(fd, LOCK_UN) == -1)
{
printf("Failed to unlock file\n");
exit(EXIT_FAILURE);
}
close(fd);
}
int main(int argc, char *argv[])
{
if (argc != 4)
{
printf("Usage: %s <filename> <number of lines> <placeholder>\n", argv[0]);
exit(EXIT_FAILURE);
}
const char *fileName = argv[1];
if (strstr(fileName, ".txt") == NULL)
{
printf("The provided file must be ended with .txt\n");
exit(EXIT_FAILURE);
}
int numLines = atoi(argv[2]);
if (numLines <= 0)
{
printf("The number of lines must be a positive integer\n");
exit(EXIT_FAILURE);
}
char *placeholder = argv[3];
while (*placeholder)
{
if (!isalnum(*placeholder) && !isspace(*placeholder))
{
printf("The placeholder must consist of letters and numbers\n");
exit(EXIT_FAILURE);
}
placeholder++;
}
writeFile(fileName, numLines, argv[3]);
return 0;
}
BIN
View File
Binary file not shown.
+34
View File
@@ -0,0 +1,34 @@
Руководство для пользователя:
1. Что делают функции:
Функция writeFile отвечает за запись определяемого пользователем количества строк в указанный файл, используя указанную строку в качестве заполнителя.
Обратите внимание: при записи в файл одним процессом другие процессы не будут иметь к нему (к файлу) доступа - они начнут заполнять его только лишь после окончания работы первого.
Файл не перезаписывается новым процессом, а продолжает пополняться новыми строками со следующей после
последней строки.
Функция signalHandler используется для обработки прерывания программы через сигнал, который подаётся при помощи комбинации клавиш Ctrl+C.
2. Как компилировать программу:
Для компиляции программы необходимо использовать компилятор языка C, например gcc.
Пример команды для компиляции программы: открываем терминал, в строке пишем
gcc program.c -o program.
Здесь "program" - название скомпилированного файла, а "program.c" - название файла с исходным кодом программы.
4. Как выводить промежуточный результат программы:
Промежуточный результат программы будет выводиться автоматически при нажатии клавиш Ctrl+C.
5. Пример использования программы:
Программа принимает три аргумента командной строки: название файла, количество строк для записи и строку-заполнитель.
Например, для записи 10 строк в файл "test.txt" с использованием строки "Hello", необходимо выполнить следующую команду:
./program test.txt 10 Hello.
При этом, промежуточный результат будет выводиться при нажатии клавиш Ctrl+C.
6. Предостережения или что НЕ нужно делать, чтобы программа работала корректно:
- использовать для заполнения файлы только с расширением .txt;
- использовать в строке-заполнителе цифры и буквы латинского алфавита, для использования специальных символов (это - &, ', \, |)
именно как элементов строки-заполнителя необходимо для правильной работы программы экранировать их, т.е. использовать \ перед ними;
- использование данной программы предполагается на машинах с предустановленной ОС Debian (12-й версии);
+36
View File
@@ -0,0 +1,36 @@
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia
mia