Linux内核中的printf实现

main.c中的printf开始读这个函数。

首先看printf函数的定义:

  
  

static int printf(const char *fmt, ...)

{

    va_list args;

    int i;


    va_start(args, fmt);

    write(1,printbuf,i=vsprintf(printbuf, fmt, args));

    va_end(args);

    return i;

10 

}

 
参数中明显采用了可变参数的定义,而在main.c函数的后面直接调用了printf函数,我们可以看下printf函数的参数是如何使用的。

  
  

printf("%d buffers = %d bytes buffer space/n/r",NR_BUFFERS,

        NR_BUFFERS*BLOCK_SIZE);

printf("Free mem: %d bytes/n/r",memory_end-main_memory_start);

 
先来分析第一个printf调用:
printf("%d buffers = %d bytes buffer space/n/r",NR_BUFFERS, NR_BUFFERS*BLOCK_SIZE);
可以看到*fmt等于"%d buffers = %d bytes buffer space/n/r,是一个char
类型的指针,指向字符串的启始位置。而可变的参数在这里是NR_BUFFERSNR_BUFFERS*BLOCK_SIZE
其中NR_BUFFERSbuffer.c中定义为缓冲区的页面大小,类型为intBLOCK_SIZEfs.h中的定义为
#define
BLOCK_SIZE 1024
因此两个可变参数NR_BUFFERSNR_BUFFERS*BLOCK_SIZE都为int类型;
以前已经分析过可变参数的一系列实现函数va函数。
va_list
arg_ptr

 

void
va_start( va_list arg_ptr, prev_param ); 

type va_arg(
va_list arg_ptr, type ); 

void va_end( va_list arg_ptr );

 

 

 

首先在函数里定义一个va_list<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值