简单使用几个函数实现本地日志
测试OK
以链的形式装入,合并后输出,防止多进程的杂乱输出!
测试OK
以链的形式装入,合并后输出,防止多进程的杂乱输出!
- #include <stdio.h> /*NULL*/
- #include <stdlib.h> /*malloc memcpy*/
- #include <errno.h> /*EINTR EINVAL...*/
- #include <fcntl.h> /*open...*/
- #include <string.h> /*strlen*/
- #include <unistd.h> /*write...*/
- #include <sys/stat.h>
- #include <sys/types.h>
- /*open parameters*/
- #define FILE_PARMS (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
- #define OPEN_FLAGS (O_CREAT | O_WRONLY | O_APPEND)
- /*link list*/
- typedef struct list{
- char *data;
- int len;
- struct list *next;
- }LIST;
- static int fd = -1; /*open's fd*/
- static LIST *first = NULL; /*link head*/
- static LIST *last = NULL; /*link tail*/
- static int ___LocalGetLen(){
- int len = 0;
- LIST *current;
- current = first;
- while(current != NULL){
- len += current->len;
- current = current->next;
- }
- return len;
- }
- static LIST *___LocalInsert(int length){
- LIST *newlist;
- newlist = (LIST *)malloc(sizeof(LIST)+length);
- if(newlist == NULL)
- return NULL;
- newlist->data = (char *)newlist + sizeof(LIST);
- newlist->len = length;
- newlist->next = NULL;
- if(last == NULL)
- first = newlist;
- else
- last->next = newlist;
- last = newlist;
- return newlist;
- }
- /*
- * Open file
- * if error return -1,or return 0
- */
- int LocalOpen(char *file){
- while( (fd = open(file,OPEN_FLAGS,FILE_PARMS)) == -1 && errno == EINTR )
- ;
- if(fd < 0){
- errno = EINVAL;
- return -1;
- }
- return 0;
- }
- /*
- * Add list to help print
- * if error return -1,or return 0
- */
- int LocalAddString(char *data){
- int len;
- LIST *newlist;
- if(fd < 0){
- errno = EINVAL;
- return -1;
- }
- len = strlen(data);
- newlist = (LIST *)___LocalInsert(len);
- if(newlist == NULL)
- return -1;
- memcpy(newlist->data,data,len);
- return 0;
- }
- /*
- * clear all of sources
- * no return
- */
- void LocalClear(){
- LIST *current;
- LIST *free_it;
- current = first;
- while(current != NULL){
- free_it = current;
- current = current->next;
- free(free_it);
- }
- first = NULL;
- last = NULL;
- }
- /*
- * list's data take in buf to write
- * if error return -1,or return 0
- */
- int LocalSend(){
- char *buf;
- LIST *current;
- int len;
- ssize_t written; /*ssize_t is int*/
- if(fd < 0){
- errno = EINVAL;
- return -1;
- }
- len = ___LocalGetLen();
- buf = (char *)malloc(len);
- if(buf == NULL)
- return -1;
- current = first;
- len = 0;
- while(current != NULL){
- memcpy(buf + len,current->data,current->len);
- len += current->len;
- current = current->next;
- }
- while( (written = write(fd,buf,len)) == -1 && errno == EINTR )
- ;
- if(written == -1 || written != len){
- errno = EAGAIN;
- free(buf);
- return -1;
- }
- free(buf);
- LocalClear();
- return 0;
- }
- /*
- *clear all of sources and close the fd
- *if failure return -1,or return 0
- */
- int LocalClose(){
- int retval;
- LocalClear();
- while( (retval = close(fd)) == -1 && errno == EINTR )
- ;
- return retval;
- }
- /*
- * this is test program
- */
- int main(){
- if(LocalOpen("test.txt") < 0){
- fprintf(stderr,"LocalOpen is fail!/n"); /*stderr haven't buffer*/
- return -1;
- }
- if(LocalAddString("test1:this is a log/n")){
- fprintf(stderr,"first LocalAddString is fail!");
- return -1;
- }
- if(LocalAddString("test2:this is a log/n")){
- fprintf(stderr,"second LocalAddString is fail!");
- return -1;
- }
- if(LocalSend() < 0){
- fprintf(stderr,"LocalSend is fail/n");
- return -1;
- }
- if(LocalClose() < 0){
- fprintf(stderr,"LocalClose is fail/n");
- return -1;
- }
- return 0;
- }