Я пытаюсь реализовать простое приложение системного журнала.Он должен создать сокет / dev / log, в то же время он будет получать сообщения журнала, предоставленные командой терминала logger
в бесконечном цикле.Текущее состояние моего кода выглядит следующим образом:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#define SOCKET_NAME "/dev/log"
#define BUFFER_SIZE 50
int main()
{
struct sockaddr_un name;
int ret;
int connection_socket;
int data_socket;
char buffer[BUFFER_SIZE];
/*
* In case the program exited inadvertently on the last run,
* remove the socket.
*/
unlink(SOCKET_NAME);
/* Create local socket. */
connection_socket = socket(AF_UNIX, SOCK_DGRAM, 0);
if (connection_socket == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
/*
* For portability clear the whole structure, since some
* implementations have additional (nonstandard) fields in
* the structure.
*/
memset(&name, 0, sizeof(struct sockaddr_un));
/* Bind socket to socket name. */
name.sun_family = AF_UNIX;
strncpy(name.sun_path, SOCKET_NAME, sizeof(name.sun_path));
name.sun_path[sizeof(name.sun_path)-1] = '\0';
ret = bind(connection_socket, (const struct sockaddr *) &name, SUN_LEN(&name));
if (ret == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
/*
* Prepare for accepting connections. The backlog size is set
* to 20. So while one request is being processed other requests
* can be waiting.
*/
ret = listen(connection_socket, 20);
if (ret == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
/* This is the main loop for handling connections. */
for (;;) {
/* Wait for incoming connection. */
data_socket = accept(connection_socket, NULL, NULL);
if (data_socket == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
for (;;) {
/* Wait for next data packet. */
ret = read(data_socket, buffer, BUFFER_SIZE);
if (ret == -1) {
perror("read");
exit(EXIT_FAILURE);
}
/* Ensure buffer is 0-terminated. */
buffer[BUFFER_SIZE - 1] = 0;
/* Printf buffer*/
printf("Log message: \n", buffer);
}
close(data_socket);
}
close(connection_socket);
/* Unlink the socket. */
unlink(SOCKET_NAME);
exit(EXIT_SUCCESS);
}
Сообщение об ошибке выглядит следующим образом: bind: адрес уже используется
Мой вопрос:
- Почему я получаю ошибку, упомянутую выше?
- Есть ли решение для этого?Если да, то как?
Я предположил, что это вызвано наличием исходного системного журнала, поэтому я остановил системный журнал с помощью systemctl stop rsyslog
.Однако это никак не повлияло на результат.
Я также попытался найти предложение в: Ошибка: адрес уже используется при привязке сокета с адресом, но номер порта отображается как `netstat` свободным
Конечная программа должна выглядеть примерно так: Как читать / dev / log?