Печать сообщений журнала, отправленных командой терминала logger - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь реализовать простое приложение системного журнала.Он должен создать сокет / 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...