本地日志库

简单使用几个函数实现本地日志
测试OK
以链的形式装入,合并后输出,防止多进程的杂乱输出!
  1. #include <stdio.h>          /*NULL*/
  2. #include <stdlib.h>         /*malloc memcpy*/
  3. #include <errno.h>          /*EINTR EINVAL...*/
  4. #include <fcntl.h>          /*open...*/
  5. #include <string.h>         /*strlen*/
  6. #include <unistd.h>         /*write...*/
  7. #include <sys/stat.h>       
  8. #include <sys/types.h>
  9. /*open parameters*/
  10. #define FILE_PARMS (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
  11. #define OPEN_FLAGS (O_CREAT | O_WRONLY | O_APPEND)
  12. /*link list*/
  13. typedef struct list{
  14.     char            *data;
  15.     int             len;
  16.     struct list     *next;
  17. }LIST;
  18. static int fd = -1;             /*open's fd*/
  19. static LIST *first = NULL;      /*link head*/
  20. static LIST *last = NULL;       /*link tail*/
  21. static int ___LocalGetLen(){
  22.     int len = 0;
  23.     LIST *current;
  24.     current = first;
  25.     while(current != NULL){
  26.         len += current->len;
  27.         current = current->next;
  28.     }
  29.     return len;
  30. }
  31. static LIST *___LocalInsert(int length){
  32.     LIST *newlist;
  33.     newlist = (LIST *)malloc(sizeof(LIST)+length);
  34.     if(newlist == NULL)
  35.         return NULL;
  36.     newlist->data = (char *)newlist + sizeof(LIST);
  37.     newlist->len = length;
  38.     newlist->next = NULL;
  39.     if(last == NULL)
  40.         first = newlist;
  41.     else
  42.         last->next = newlist;
  43.     last = newlist;
  44.     return newlist;
  45. }
  46. /*
  47.  * Open file
  48.  * if error return -1,or return 0
  49.  */
  50. int LocalOpen(char *file){
  51.     while( (fd = open(file,OPEN_FLAGS,FILE_PARMS)) == -1 && errno == EINTR )
  52.         ;
  53.     if(fd < 0){
  54.         errno = EINVAL;
  55.         return -1;
  56.     }
  57.     return 0;
  58. }
  59. /*
  60.  * Add list to help print
  61.  * if error return -1,or return 0
  62.  */
  63. int LocalAddString(char *data){
  64.     int len;
  65.     LIST *newlist;
  66.     
  67.     if(fd < 0){
  68.         errno = EINVAL;
  69.         return -1;
  70.     }
  71.     len = strlen(data);
  72.     newlist = (LIST *)___LocalInsert(len);
  73.     if(newlist == NULL)
  74.         return -1;
  75.     memcpy(newlist->data,data,len);
  76.     return 0;
  77. }
  78. /*
  79.  * clear all of sources
  80.  * no return
  81.  */
  82. void LocalClear(){
  83.     LIST *current;
  84.     LIST *free_it;
  85.     current = first;
  86.     while(current != NULL){
  87.         free_it = current;
  88.         current = current->next;
  89.         free(free_it);
  90.     }
  91.     first = NULL;
  92.     last = NULL;
  93. }
  94. /*
  95.  * list's data take in buf to write
  96.  * if error return -1,or return 0
  97.  */
  98. int LocalSend(){
  99.     char *buf;
  100.     LIST *current;
  101.     int len;
  102.     ssize_t written;        /*ssize_t is int*/
  103.     if(fd < 0){
  104.         errno = EINVAL;
  105.         return -1;
  106.     }
  107.     len = ___LocalGetLen();
  108.     buf = (char *)malloc(len);
  109.     if(buf == NULL)
  110.         return -1;
  111.     current = first;
  112.     len = 0;
  113.     while(current != NULL){
  114.         memcpy(buf + len,current->data,current->len);
  115.         len += current->len;
  116.         current = current->next;
  117.     }
  118.     while( (written = write(fd,buf,len)) == -1 && errno == EINTR )
  119.         ;
  120.     if(written == -1 || written != len){
  121.         errno = EAGAIN;
  122.         free(buf);
  123.         return -1;
  124.     }
  125.     free(buf);
  126.     LocalClear();
  127.     return 0;
  128. }
  129. /*
  130.  *clear all of sources and close the fd
  131.  *if failure return -1,or return 0
  132.  */
  133. int LocalClose(){
  134.     int retval;
  135.     LocalClear();
  136.     while( (retval = close(fd)) == -1 && errno == EINTR )
  137.         ;
  138.     return retval;
  139. }
  140. /*
  141.  * this is test program
  142.  */
  143. int main(){
  144.     
  145.     if(LocalOpen("test.txt") < 0){
  146.         fprintf(stderr,"LocalOpen is fail!/n");   /*stderr haven't buffer*/
  147.         return -1;
  148.     }
  149.     if(LocalAddString("test1:this is a log/n")){
  150.         fprintf(stderr,"first LocalAddString is fail!");
  151.         return -1;
  152.     }
  153.     if(LocalAddString("test2:this is a log/n")){
  154.         fprintf(stderr,"second LocalAddString is fail!");
  155.         return -1;
  156.     }
  157.     if(LocalSend() < 0){
  158.         fprintf(stderr,"LocalSend is fail/n");
  159.         return -1;
  160.     }
  161.     if(LocalClose() < 0){
  162.         fprintf(stderr,"LocalClose is fail/n");
  163.         return -1;
  164.     }
  165.     return 0;
  166. }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值