You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现带pid和tid参数的自定义printf函数?

自定义带PID和TID的printf风格打印函数实现

需求是实现一个和printf调用方式完全一致的自定义打印函数,自动在输出内容前附加当前进程的PID和线程TID。以下是基于现有代码的正确实现方案:

完整实现代码

#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>
#include <sys/syscall.h>

int gettid() {
    return syscall(__NR_gettid);
}

// 自定义print函数,用法与printf一致,自动附加PID和TID
int print(const char *fmt, ...) {
    va_list vlist;
    va_start(vlist, fmt);
    
    // 先输出PID和TID,格式可按需调整
    int print_count = printf("[%d][%d] ", getpid(), gettid());
    // 使用vprintf处理可变参数的格式化输出
    print_count += vprintf(fmt, vlist);
    
    va_end(vlist);
    // 返回总打印字符数,与printf行为保持一致
    return print_count;
}

int main() { 
    printf("%d %d hello\n", getpid(), gettid());
    // 测试自定义print函数,调用方式和printf完全相同
    print("hello\n");
    print("Number: %d, String: %s\n", 123, "test");
    return 0; 
}

关键实现说明

  • 利用vprintf处理可变参数:因为我们已经通过va_start初始化了可变参数列表va_list,vprintf是标准库中专门用于接收va_list来完成格式化输出的函数,这是实现自定义printf风格函数的核心。
  • 保持返回值一致性:将print函数的返回值改为int,返回总共打印的字符数,和printf的行为对齐,方便调用者判断输出是否正常。
  • PID和TID的输出格式:示例中用[%d][%d] 的格式包裹PID和TID,你可以根据实际需求调整格式(比如去掉括号、添加分隔符等)。

内容的提问来源于stack exchange,提问作者lucky1928

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 01:07:22