works
This commit is contained in:
38
vlad/rgz/bad_service.sh
Normal file
38
vlad/rgz/bad_service.sh
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
target=/etc/systemd/system/fifo.service
|
||||||
|
|
||||||
|
USER="pajjilykk"
|
||||||
|
GROUP="pajjilykk"
|
||||||
|
WORKDIR="/home/pajjilykk/CLionProjects/CS-LABS/vlad/rgz"
|
||||||
|
EXECUTABLE="$WORKDIR/daemon"
|
||||||
|
tmp=$(mktemp)
|
||||||
|
|
||||||
|
trap 'rm -f "$tmp"' EXIT
|
||||||
|
|
||||||
|
cat > "$tmp" <<UNIT
|
||||||
|
[Unit]
|
||||||
|
Description=FIFO text processing daemon (systemd-managed)
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=$EXECUTABLE pepep
|
||||||
|
User=$USER
|
||||||
|
Group=$GROUP
|
||||||
|
WorkingDirectory=$WORKDIR
|
||||||
|
KillSignal=SIGTERM
|
||||||
|
TimeoutStopSec=5s
|
||||||
|
KillMode=control-group
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=1s
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
UNIT
|
||||||
|
|
||||||
|
sudo install -m 0644 "$tmp" "$target"
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
echo "Replaced \`$target\` with the predefined service unit."
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
// fifo_client.c
|
// fifo_client.c
|
||||||
// Клиент: читает входной файл, отправляет содержимое в FIFO_REQUEST,
|
// Клиент: читает входной файл, отправляет содержимое в FIFO_REQUEST,
|
||||||
// читает ответ из FIFO_RESPONSE, отделяет хвост "\nREPLACEMENTS:<n>\n",
|
// читает ответ из FIFO_RESPONSE, отделяет "\nREPLACEMENTS:<n>\n",
|
||||||
// пишет обработанный текст в выходной файл и печатает число замен.
|
// пишет обработанный текст в выходной файл и печатает количество замен.
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|||||||
@@ -1,15 +1,19 @@
|
|||||||
// fifo_server_daemon.c
|
// fifo_server_daemon.c
|
||||||
|
// Демон: читает из FIFO_REQUEST, обрабатывает текст,
|
||||||
|
// для каждой пары одинаковых подряд символов заменяет второй на пробел,
|
||||||
|
// всего не более max_replacements замен, пишет результат в FIFO_RESPONSE
|
||||||
|
// и дописывает "\nREPLACEMENTS:<n>\n". Логирует ошибки в syslog.
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h> // fprintf
|
||||||
#include <stdlib.h>
|
#include <stdlib.h> // malloc, free, exit, strtoll
|
||||||
#include <string.h>
|
#include <string.h> // strlen, strerror
|
||||||
#include <unistd.h>
|
#include <unistd.h> // read, write, close, unlink
|
||||||
#include <fcntl.h>
|
#include <fcntl.h> // open, O_RDONLY, O_WRONLY
|
||||||
#include <sys/types.h>
|
#include <sys/types.h> // типы
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h> // mkfifo
|
||||||
#include <errno.h>
|
#include <errno.h> // errno
|
||||||
#include <signal.h>
|
#include <signal.h> // signal, SIGINT, SIGTERM, SIGPIPE
|
||||||
#include <syslog.h>
|
#include <syslog.h> // syslog, openlog, closelog
|
||||||
|
|
||||||
#define FIFO_REQUEST "/tmp/fifo_request"
|
#define FIFO_REQUEST "/tmp/fifo_request"
|
||||||
#define FIFO_RESPONSE "/tmp/fifo_response"
|
#define FIFO_RESPONSE "/tmp/fifo_response"
|
||||||
@@ -22,13 +26,16 @@ void signal_handler(int sig) {
|
|||||||
running = 0;
|
running = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// разбор неотрицательного long long
|
||||||
static long long parse_ll(const char *s) {
|
static long long parse_ll(const char *s) {
|
||||||
char *end = NULL;
|
char *end = NULL;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
long long v = strtoll(s, &end, 10);
|
long long v = strtoll(s, &end, 10);
|
||||||
|
|
||||||
if (errno != 0 || end == s || *end != '\0' || v < 0) {
|
if (errno != 0 || end == s || *end != '\0' || v < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,7 +183,9 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
char result[64];
|
char result[64];
|
||||||
snprintf(result, sizeof(result), "\nREPLACEMENTS:%lld\n", replacements);
|
snprintf(result, sizeof(result), "\nREPLACEMENTS:%lld\n", replacements);
|
||||||
write(fd_resp, result, strlen(result));
|
if (write(fd_resp, result, strlen(result)) < 0) {
|
||||||
|
syslog(LOG_WARNING, "write replacements trailer failed: %s", strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
close(fd_resp);
|
close(fd_resp);
|
||||||
syslog(LOG_INFO, "Response sent: %zd bytes; replacements=%lld",
|
syslog(LOG_INFO, "Response sent: %zd bytes; replacements=%lld",
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ GROUP="pajjilykk"
|
|||||||
WORKDIR="/home/pajjilykk/CLionProjects/CS-LABS/vlad/rgz"
|
WORKDIR="/home/pajjilykk/CLionProjects/CS-LABS/vlad/rgz"
|
||||||
EXECUTABLE="$WORKDIR/daemon"
|
EXECUTABLE="$WORKDIR/daemon"
|
||||||
tmp=$(mktemp)
|
tmp=$(mktemp)
|
||||||
wo
|
|
||||||
trap 'rm -f "$tmp"' EXIT
|
trap 'rm -f "$tmp"' EXIT
|
||||||
|
|
||||||
cat > "$tmp" <<UNIT
|
cat > "$tmp" <<UNIT
|
||||||
|
|||||||
Reference in New Issue
Block a user