linux下c语言简单实现写日志函数(多线程安全)(代码片段)

Hero_HL Hero_HL     2022-12-25     295

关键词:

调用时包含log.h文件后使用LOG函数进行写入日志操作

// eg:
LOG("[%s][%d] a:%d b:%s", __FILE__, __LINE, a, b);

log.h

// log.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once

#include <stdio.h>
#include <sys/types.h> 
#include <unistd.h> 
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdarg.h>
#include <time.h>
#include <pthread.h>
#include <sys/syscall.h>//Linux system call for thread id

int safe_asprintf(char** strp, const char* fmt, ...);
int safe_vasprintf(char** strp, const char* fmt, va_list ap);
void LOG(const char* format, ...);

static pthread_mutex_t fileMutex = PTHREAD_MUTEX_INITIALIZER;

log.c

// log.cpp: 定义应用程序的入口点。
//

#include "log.h"

int safe_asprintf(char** strp, const char* fmt, ...)

    va_list ap;
    int retval;

    va_start(ap, fmt);
    retval = safe_vasprintf(strp, fmt, ap);
    va_end(ap);

    return retval;


/*
 * safe_vasprintf();
 */
int safe_vasprintf(char** strp, const char* fmt, va_list ap)

    int retval;

    retval = vasprintf(strp, fmt, ap);
    if (retval == -1)
    
        printf("Failed to vasprintf: %s. Bailing out\\n", strerror(errno));
        return 1;
    
    return retval;


/*
 * plog();
 */
void LOG(const char* format, ...)

    pthread_mutex_lock(&fileMutex);

    FILE* fp = NULL;
    va_list vlist;
    char* fmt = NULL;

    // Open debug info output file.
    if (!(fp = fopen("log.txt", "a+")))
    
        pthread_mutex_unlock(&fileMutex);
        return;
    

    va_start(vlist, format);
    safe_vasprintf(&fmt, format, vlist);
    va_end(vlist);
    if (!fmt)
    
        pthread_mutex_unlock(&fileMutex);
        return;
    

    time_t timep;
    struct tm* ptm = NULL;
    time(&timep);
    ptm = localtime(&timep);
    fprintf(fp, "[%04d-%02d-%02d-%02d:%02d:%02d][pid:%d]%s\\n",
        ptm->tm_year + 1900,
        ptm->tm_mon + 1,
        ptm->tm_mday,
        ptm->tm_hour,
        ptm->tm_min,
        ptm->tm_sec,
        syscall(SYS_gettid),
        fmt);

    free(fmt);
    fsync(fileno(fp));
    fclose(fp);

    pthread_mutex_unlock(&fileMutex);


linux----多线程(下)(代码片段)

...08;下)2)线程控制①...②线程池Routine的static属性实现一个线程池,多线程处理任务(接收两数和一个操作符打印结果)③单例模式(线程安全)更改上面实现的线程池为懒汉模式④STL智能指针与线程... 查看详情

linux下c语言实现多线程文件复制(代码片段)

转自:https://www.cnblogs.com/zxl0715/articles/5365989.html1、具体思路把一个文件分成N份,分别用N个线程copy,每个线程只读取指定长度字节大小的内容最后一个线程的源文件所指定的结束位置是文件的实际大小每个线程读取指定源文件部... 查看详情

c语言怎么写线程代码

我写了个爬虫,爬博客的文章链接但是觉得速度不行,想多运行几个线程来爬应该添加什么代码?(线程这方面不行)通常使用CreateThread函数来创建新的线程.(Unix下使用pthread_create函数)首先指出,线程与线程之间,是并列关系,不会存在... 查看详情

c语言中怎么实现双线程或者父子线程啊

...下进程线程(不要用术语用形象点和通俗点的话)然后C语言中怎么实现双线程父子线程啊还有管道怎么实现我是C的菜鸟如果写一个小小的程序更好一定有加分的通常使用CreateThread函数来创建新的线程.(Unix下使用pthread_create函数)... 查看详情

c语言如何实现多线程同时运行

我这里有个两函数inti=0;voidfun()Sleep(1000);printf("%d\n",i);还有一个voidsound()Beep(2000,8000);//响8秒我想要每1秒输出一个数,但是执行到Beep函数就会阻塞8秒求多线程方法解决这个问题1、点击菜单栏的“Project”选项卡,下拉列... 查看详情

用c语言开多线程,想让多个相同的子线程同时运行,怎么实现

看了用HANDLE线程名;线程名=CreateThread(NULL,0,程序名,NULL,0,NULL);的方式开,但是我想让这一个程序作为多个线程一起开的话怎么办呢,总不能开200个,就写200次吧。用循环的话线程名又不一样,而且这个线程名也不是数字,... 查看详情

vb怎么实现多线程

很简单,调用API函数CreateThread但是用vb做多线程的关键不在于创建,而是在于线程的不稳定,其不稳定是由于vb6自身的控件(如按钮、文本框等)不是线程安全的,怎么用你程序就可能怎么挂,所以这些个玩样儿在多线程中统统... 查看详情

在单进程单线程或单进程多线程下实现log4cplus写日志并按大小切割

基于脚本配置来过滤log信息除了通过程序实现对log环境的配置之外。log4cplus通过PropertyConfigurator类实现了基于脚本配置的功能。通过脚本能够完毕对logger、appender和layout的配置。因此能够解决如何输出,输出到哪里的问题。我将... 查看详情

5招教你实现多线程场景下的线程安全!(代码片段)

...运行有重要的意义。下面将结合示例,谈谈如何在Java语言中,实现线程安全的程序。本文分享自华为云社区《Java如何实现多线程场景下的线程安全》,作者ÿ 查看详情

万字详解linux系列多线程(下)(代码片段)

文章目录前言一、线程同步1.概念2.条件变量3.代码实现(1)相关函数(2)代码使用(3)关于pthread_cond_wait二、生产者消费者模型1.什么是生产者消费者模型2.相关概念(1)一个交易场所(2)... 查看详情

c语言fft库函数是线程安全吗

...A是的。多线程程序中,线程安全是必须要考虑的因素。C语言中大部分函库函数都是线程安全的,但是也有几个常用函数是线程不安全的,也叫不可重入函数。之所线程不安全,是因为这些系统函数使用了某些全局或者静态变量... 查看详情

windows环境下c语言支持ftp和http多线程下载的客户端

主要是编写程序的思路和原理,同事支持ftp和http,是分别编好两个程序,再选择吗?如果采用curl应该会方便很多,请问有关于利用libcurl库的支持ftp和http下载多文件的简单实例吗???最好有简单的图形界面。(Windows下的,网上... 查看详情

linux系统下,c语言pthread多线程编程传参问题

写一个多线程计算矩阵的小程序,主要思路如下:构造一个Info的结构体,通过结构体指针将参数传给线程函数,通过显式传线程的ID来控制参数。具体程序如下#include<stdio.h>#include<stdlib.h>#include<pthread.h>intmtc[3]=0;//resu... 查看详情

c#log4net多线程问题

...线程下动态生成输出路径生成各自的文件,但是写出来的日志有点混乱,这个线程下的写到另一个线程的输出文件里,请问有人知道怎么解决吗,在线等......你好,根据你的描述我建议你将用一个单独的线程处理写日志功能,然后... 查看详情

用c语言如何实现多线程同时运行的情况下,各个线程输出不同的随机数?

我用系统时间作为种子,发现因为各个线程之间运行的时间差太小,所以产生的随机数还是相同的。网上有种方法可以用微秒级的时间作种子,但我没看懂,不知道谁能帮忙解释下不?或者有其他方法也欢迎提出。不过在srand前... 查看详情

java集合--arraylist的实现原理

...的,是一个动态数组,其容量能自动增长,类似于​​C语言​​中的动态申请内存,动态增长内存。   ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(Listl)函数返回一... 查看详情

linux多线程——基础知识+实现(代码片段)

在Linux中利用C语言实现多线程。利用函数pthread_create()、pthread_exit()、pthread_join()。一、pthread_create()#include<pthread.h>intpthread_create(pthread_t*restricttidp,//新创建的线程指向的内存单元。constpthread_attr_t*restrictatt 查看详情

linux下c语言简单实现获取配置文件中的配置项(代码片段)

使用好处:有些参数不用写死,也不用在编译时添加。免得每次修改参数修改代码或重新编译,直接使用配置文件即可。类比windows下GetPrivateProfileString、GetPrivateProfileInt获取配置的API1.使用vs2019创建linux项目1.1测试的配... 查看详情