如何实现带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
相关产品推荐
相关产品推荐

