c - C中printk的atomic_long_t的打印格式是什么

标签 c linux linux-kernel operating-system system-calls

我正在尝试打印 atomic_long_t 值,但我无法找到正确的格式来使用它以打印实际信息。我试过了

struct zone *mzone;
atomic_long_t l; 
for_each_zone(mzone);
l=mzone ->vm_stat[NR_ACTIVE_ANON];
printk(KERN EMERG "NR_ACTIVE_ANON: %lu",l); 

printk(KERN EMERG "NR_ACTIVE_ANON: %ld",l); 

但无论如何我得到的都是 0。我也尝试过 atomic_long_read,但它需要一个结构指针 atomic_long_t。

最佳答案

  1. 注意代码中 for_each_zone() 行末尾的 ;。它可能不应该存在。

  2. 你是对的,你应该使用 atomic_long_read()。只要给它一个它想要的指针。没有必要为原子类型使用一些奇特的 printk() 格式(现在也没有)。这是一个例子:

    #include <asm/atomic.h>
    
    ...
    
    atomic_long_t v = ATOMIC_LONG_INIT(0);
    
    atomic_long_set(&v, 123);
    pr_info("%ld\n", atomic_long_read(&v));
    

    此代码打印 123

    此外,请务必将原子 API 用于其他操作。因为基本上 atomic_long_t 类型是一个结构,定义如下:

    typedef atomic_t atomic_long_t;
    
    typedef struct {
        long counter;
    } atomic64_t;
    

    而且我很确定这样做正是出于这个原因:防止用户对该类型使用常规操作,或将其转换为某种常规类型。

    你可以找到很多关于原子 API 的文档:

关于c - C中printk的atomic_long_t的打印格式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49930181/

相关文章:

c - 在 CUDA 中主机和设备之间传递变量

c - 具有从 Web 获取代码的编程编辑器

c++ - 如何返回复杂的返回值?

linux - 使用默认安装程序选项安装 .bin 文件的最佳方法是什么?

c - 填充 skb 中的 header 字段

计算文件中注释文本的百分比

linux - 如何在匹配模式后立即将字符串路径插入文件行的中间?

linux - 向所有使用 Wall 的人广播用户消息

linux - 内置内核驱动还需要设备树吗?

c - 工作队列启动、中断和从未完成导致 CPU 停顿