/////.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;
}