在C

时间:2018-04-19 21:01:09

标签: 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 个答案:

答案 0 :(得分:0)

  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的文档: