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