linux syslog編程

 

/////.h

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#include <syslog.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
 typedef struct debug_syslog
{
 int type;
 int enable;
 int enable_trace;

 int priority;
 char location[256];
 int fd;
 int seqno;   
 pthread_mutex_t mutex;
}__attribute__ ((packed));

 

////.c

 

#include "send_syslog.h"

 

struct debug_syslog s_debug_syslog[2];

 

int main()
{
  pthread_mutexattr_t ma;  ////定義互斥鎖屬性變量
  pthread_mutexattr_init(&ma); ////
  pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE_NP);/*設置類型互斥鎖的屬性*/
              /*PTHREAD_MUTEX_RECURSIVE_NP:
              遞歸型,如果遇到我們上面所提到的死鎖情況,
              同一線程循環給互斥量上鎖,
              那麼系統將會知道該上鎖行爲來自同一線程,
              那麼就會同意線程給該互斥量上鎖。*/
  pthread_mutex_init(&(s_debug_syslog[0].mutex), &ma);////動態初始化互斥鎖
  pthread_mutex_init(&(s_debug_syslog[1].mutex), &ma);////動態初始化互斥鎖
  pthread_mutexattr_destroy(&ma);
  
  
  pthread_mutex_lock(&(s_debug_syslog[0].mutex));
  s_debug_syslog[0].enable = 1;
  s_debug_syslog[0].enable_trace = 1;
  s_debug_syslog[0].type = 0;
  strncpy(s_debug_syslog[0].location, "/youqicode/mylog.txt", 200);
  pthread_mutex_unlock(&(s_debug_syslog[0].mutex)); 

  pthread_mutex_lock(&(s_debug_syslog[1].mutex));
  s_debug_syslog[1].enable = 1;
  s_debug_syslog[1].enable_trace = 1;
  s_debug_syslog[1].type = 0;
  strncpy(s_debug_syslog[1].location, "192.168.3.79", 200);
  pthread_mutex_unlock(&(s_debug_syslog[1].mutex));
  
  pthread_mutex_lock(&(s_debug_syslog[0].mutex));
  s_debug_syslog[0].fd = open(&(s_debug_syslog[0].location), O_WRONLY|O_APPEND, 0666);
  
  if (s_debug_syslog[0].fd == -1 )
  {
    syslog(LOG_DAEMON | LOG_WARNING, "Can not create file!/n");
    printf("Open file failed !/n");
  }
  else
  {
    printf("Open file successfully !/n");
  }  
  int write_length1 = write(s_debug_syslog[0].fd, "hello syslog !/n", strlen("hello syslog !/n"));  
  printf("write_length1 = %d/n", write_length1);
  close(s_debug_syslog[0].fd);
  pthread_mutex_unlock(&(s_debug_syslog[0].mutex));
  
  pthread_mutex_lock(&(s_debug_syslog[1].mutex));
  struct sockaddr_in addr;
  long s_addr = 0;
  memset (&addr, 0, sizeof(struct sockaddr_in));  
  s_debug_syslog[1].fd = socket(AF_INET,SOCK_DGRAM,0);
  if(s_debug_syslog[1].fd > 0)
  {
    addr.sin_family = AF_INET;
    s_addr = inet_addr(s_debug_syslog[1].location);
    if (s_addr == -1)
    {
      syslog(LOG_DAEMON | LOG_WARNING, "invalid ipaddress %s",s_debug_syslog[1].location);
      printf("invalid ipaddress !/n");
      close(s_debug_syslog[1].fd);
      s_debug_syslog[1].fd = -1;
    }
    else
    {
      addr.sin_addr.s_addr = s_addr;
      addr.sin_port = htons(514);
      if (connect(s_debug_syslog[1].fd,(struct sockaddr *)&addr,sizeof(addr)) < 0)
      {
        syslog(LOG_DAEMON | LOG_WARNING, "Can not connect to %s:%d for logging.",s_debug_syslog[1].location, 514);
        close(s_debug_syslog[1].fd);
        s_debug_syslog[1].fd = -1;
        printf("connect failed !/n");
      }
      else
      {
        printf("connect successfully !/n");
      }
    }
    
    int write_length2 = write(s_debug_syslog[0].fd, "hello syslog !/n", strlen("hello syslog !/n"));
    printf("write_length2 = %d/n", write_length2); 
    sleep(1); 
    
    write_length2 = write(s_debug_syslog[0].fd, "hello syslog !/n", strlen("hello syslog !/n"));
    printf("write_length2 = %d/n", write_length2);
    sleep(1);
    
    write_length2 = write(s_debug_syslog[0].fd, "hello syslog !/n", strlen("hello syslog !/n"));
    printf("write_length2 = %d/n", write_length2);
    sleep(1);
    
    write_length2 = write(s_debug_syslog[0].fd, "hello syslog !/n", strlen("hello syslog !/n"));
    printf("write_length2 = %d/n", write_length2);
    sleep(1);
    
    write_length2 = write(s_debug_syslog[0].fd, "hello syslog !/n", strlen("hello syslog !/n"));
    printf("write_length2 = %d/n", write_length2); 
    sleep(1);  
  }
  else
  {
    printf("socket failed !/n");
   }
  close(s_debug_syslog[1].fd);
  pthread_mutex_unlock(&(s_debug_syslog[1].mutex));
  
  printf("strerror(errno) = %d/n", strerror(errno));
  
  return 0;
}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章