Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言函数大全--j开头的函数

C语言函数大全--j开头的函数

原创
作者头像
huazie
发布于 2025-04-23 10:05:55
发布于 2025-04-23 10:05:55
13100
代码可运行
举报
文章被收录于专栏:开发语言-C/C++开发语言-C/C++
运行总次数:0
代码可运行

总览

函数声明

函数功能

double j0 (double x);

计算 x 的 第一类 0 阶贝塞尔函数(double)

float j0f (float x);

计算 x 的 第一类 0 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】

double j1 (double x);

计算 x 的 第一类 1 阶贝塞尔函数(double)

float j1f (float x);

计算 x 的 第一类 1 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】

double jn (int n, double x);

计算 x第一类 n 阶贝塞尔函数(double)

float jnf (int n, float x);

计算 x第一类 n 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】

double jrand48();

生成伪随机数序列

int join(pthread_t thread, void **retval);

等待线程退出并回收资源

typedef _JBTYPE jmp_buf[_JBLEN];

它是一个数组类型,保存跳转目标地址的缓冲区。通常与 setjmp 和 longjmp 函数一起使用,用于实现非局部跳转

u32 jhash(const void *key, u32 length, u32 initval);

它是 Linux 内核头文件 linux/jhash.h 中的一个函数,用于实现一种高效的哈希算法。

unsigned long volatile jiffies;

它是 Linux 内核中的一个全局变量,表示内核启动后经过的节拍数。其中 volatile 关键字用于告知编译器在访问这个变量时不要使用缓存,以确保能够正确读取最新值。

u64 jiffies_64;

它是 Linux 内核中的一个全局变量,类似于 jiffies,但是支持更大的取值范围。其中 u6464 位无符号整型。

clock_t jiffies_delta_to_clock_t(unsigned long delta);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于计算两个 jiffies 值之间的时间差,并将结果转换为 clock_t 类型的值。

unsigned long jiffies_delta_to_msecs(unsigned long delta);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于计算两个 jiffies 值之间的时间差,并将结果转换为毫秒数

clock_t jiffies_to_clock_t(unsigned long jiffies);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 jiffies 值(内核节拍数)转换为 clock_t 类型的值。

unsigned long jiffies_to_msecs(const unsigned long j);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 jiffies 值(内核节拍数)转换为毫秒数。

clock_t jiffies64_to_clock_t(u64 jiffies);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 64 位 jiffies 值(内核节拍数)转换为 clock_t 类型的值。

u64 jiffies64_to_msecs(const u64 jiffies);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 64 位 jiffies 值(内核节拍数)转换为毫秒数。

void jiffies_update_wallclock(void);

它是 Linux 内核头文件 linux/time.h 中的一个函数,用于更新系统时钟的时间戳。

1. j0,j0f

1.1 第一类 0 阶贝塞尔函数 J_0(x)

1.1.1 定义

满足贝塞尔方程:

x^2 y'' + x y' + (x^2 - 0^2)y = 0

在原点 ( x=0 ) 处有限的解。

1.1.2 级数展开

J_0(x) = \sum_{m=0}^{\infty} \frac{(-1)^m}{(m!)^2} \left( \frac{x}{2} \right)^{2m}

1.1.3 特性

  • 初值行为J_0(0) = 1 ,为最大值。
  • 振荡衰减:随 ( x ) 增大呈现衰减振荡,类似“衰减的正弦波”。
  • 零点位置
    • 第一个零点:x \approx 2.4048
    • 零点间隔逐渐趋近于 π。

1.1.4 应用场景

  • 圆形鼓膜的基模振动。
  • 圆柱形波导中的电磁波传播(如 TE_{00} 模式)。
  • 概率论中的随机行走问题。

1.2 函数说明

函数声明

函数功能

double j0 (double x);

计算 x 的 第一类 0 阶贝塞尔函数(double)

float j0f (float x);

计算 x 的 第一类 0 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】

注意: 如果操作成功,则返回 x第一类 0 阶贝塞尔函数;如果 xNaN 值,则返回 NaN 值;如果 x 太大或发生溢出范围错误,则返回 0 并将 errno 设置为 ERANGE

1.3 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <math.h>
int main()
{
    double x = 10.0, result;
    result = j0(x);

    printf("%lf 的 第一类 0 阶贝塞尔函数 : %lf", x, result);

    return 0;
} 

1.4 运行结果

2. j1,j1f

2.1 第一类 1 阶贝塞尔函数 J_1(x)

2.1.1 定义

满足贝塞尔方程:

x^2 y'' + x y' + (x^2 - 1^2)y = 0

2.1.2 级数展开

J_1(x) = \sum_{m=0}^{\infty} \frac{(-1)^m}{m! \, (m+1)!} \left( \frac{x}{2} \right)^{2m+1}

2.1.3 特性

  • 初值行为J_1(0) = 0 ,初始近似线性增长 J_1(x) \approx \frac{x}{2}
  • 振荡衰减:幅度随 x 增大衰减。
  • 零点位置
    • 第一个零点:x \approx 3.8317

2.1.4 应用场景

  • 圆形膜振动的第一高阶模式。
  • 光纤中的光场分布。
  • 环形电流产生的磁场计算。

2.2 函数说明

函数声明

函数功能

double j1 (double x);

计算 x 的 第一类 1 阶贝塞尔函数(double)

float j1f (float x);

计算 x 的 第一类 1 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】

注意: 如果操作成功,则返回 x第一类 1 阶贝塞尔函数;如果 xNaN 值,则返回 NaN 值;如果 x 太大或发生溢出范围错误,则返回 0 并将 errno 设置为 ERANGE

2.3 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <math.h>
int main()
{
    double x = 10.0, result;
    result = j1(x);

    printf("%lf 的 第一类 1 阶贝塞尔函数 : %lf", x, result);

    return 0;
} 

2.4 运行结果

3. jn,jnf

3.1 第一类 n 阶贝塞尔函数 J_n(x) (n 为整数)

3.1.1 定义

满足贝塞尔方程:

x^2 y'' + x y' + (x^2 - n^2)y = 0

3.1.2 级数展开

J_n(x) = \sum_{m=0}^{\infty} \frac{(-1)^m}{m! \, \Gamma(n+m+1)} \left( \frac{x}{2} \right)^{2m+n}

其中 \Gamma 为伽马函数,整数阶时 \Gamma(n+m+1) = (n+m)!

3.1.3 特性

  • 初值行为:当 n \geq 1 时,J_n(0) = 0 ,且 J_n(x) \propto x^n 趋近于零。
  • 零点偏移:阶数 n 增大时,第一个零点位置右移,振荡频率降低。

3.1.4 应用场景

  • 柱对称系统的多阶振动模式(如声学、结构力学)。
  • 电磁学中的高阶波导模式(如 TE_{mn} 模式)。
  • 图像处理中的环形滤波器设计。

3.2 函数说明

函数声明

函数功能

double jn (int n, double x);

计算 x第一类 n 阶贝塞尔函数(double)

float jnf (int n, float x);

计算 x第一类 n 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】

注意: 如果操作成功,则返回 x第一类 n 阶贝塞尔函数;如果 xNaN 值,则返回 NaN 值;如果 x 太大或发生溢出范围错误,则返回 0 并将 errno 设置为 ERANGE

3.3 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <math.h>

void jnPrint(int n, double x);

int main()
{
    double x = 10.0;
    jnPrint(2, x);
    jnPrint(3, x);
    jnPrint(4, x);
    return 0;
} 

void jnPrint(int n, double x)
{
    double result = jn(n, x);
    printf("%lf 的 第一类 %d 阶贝塞尔函数 : %lf\n", x, n, result);
}

3.4 运行结果

4. jrand48

4.1 函数说明

函数声明

函数功能

double jrand48();

生成伪随机数序列

jrand48 函数是一个生成伪随机数序列的函数,并且它是可重入的,即可以在多个线程中同时调用而不会出现冲突。

4.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main() {
    // 初始化种子
    srand48(time(NULL));
    
    // 生成10个随机数
    for (int i = 0; i < 5; ++i) {
        double r = jrand48();
        printf("%f\n", r);
    }
    
    return 0;
}

上述程序首先通过 srand48 函数初始化随机数生成器的种子,这里使用了当前系统时间作为种子。然后循环调用 jrand48 函数 5 次,每次输出一个伪随机数。注意,由于 jrand48 函数返回的是一个双精度浮点数(范围在 [0, 1) 内),因此输出时需要使用 %f 格式化符号。

5. join

5.1 函数说明

函数声明

函数功能

int join(pthread_t thread, void **retval);

等待线程退出并回收资源

C 语言中,join 函数不是标准库函数,也不是 POSIX 标准的函数。然而,一些操作系统(如 UNIX/Linux)提供了 join 函数用于等待线程退出并回收资源。在 POSIX 线程中,相应的函数是 pthread_join

5.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *thread_func(void *arg) {
    printf("Thread is running...\n");
    pthread_exit(NULL);
}

int main() {
    pthread_t thread;
    if (pthread_create(&thread, NULL, thread_func, NULL)) {
        perror("pthread_create");
        exit(EXIT_FAILURE);
    }
    printf("Main thread is waiting for the child thread to exit...\n");
    join(thread, NULL);
    printf("Child thread has exited.\n");
    return EXIT_SUCCESS;
}

上述程序创建了一个新线程,并且主线程等待新线程退出后才继续执行。在新线程中,打印一条消息并调用 pthread_exit 函数退出线程。在主线程中,调用 join 函数等待新线程退出,并通过 NULL 参数指示不需要返回值。最终输出一条消息表示新线程已经退出。

6. jmp_buf

6.1 类型说明

类型定义

描述

typedef _JBTYPE jmp_buf[_JBLEN];

它是一个数组类型,保存跳转目标地址的缓冲区。通常与 setjmp 和 longjmp 函数一起使用,用于实现非局部跳转

6.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

jmp_buf env;

void func() {
    printf("Entering func...\n");
    longjmp(env, 1);
    printf("This line will not be executed.\n");
}

int main() {
    int ret = setjmp(env);
    if (ret == 0) {
        printf("Jumping to func...\n");
        func();
    } else {
        printf("Returning from longjmp with value %d\n", ret);
    }
    return EXIT_SUCCESS;
}

上述程序定义了一个名为 envjmp_buf 类型变量,用于保存当前执行状态。在主函数中,通过调用 setjmp 函数将当前状态保存到

env 中,并返回 0。然后调用 func 函数,该函数打印一条消息并调用 longjmp 函数恢复之前保存的状态,这里传入参数值为 1。由于 longjmp 函数会导致程序跳转到 setjmp 函数继续执行,因此后面的 printf 语句会输出 "Returning from longjmp with value 1"

需要注意的是,在使用 jmp_bufsetjmplongjmp 函数时需要遵循特定的使用规范,否则可能会导致未定义行为或错误。

6.3 运行结果

7. jhash

7.1 函数说明

函数声明

函数功能

u32 jhash(const void *key, u32 length, u32 initval);

它是 Linux 内核头文件 linux/jhash.h 中的一个函数,用于实现一种高效的哈希算法。

参数:key : 要进行哈希的数据 length : 数据的长度(以字节为单位) initval : 哈希值的初始值。

7.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/jhash.h>

int my_init(void)
{
    char data[] = "Hello, world!";
    u32 hash;

    printk(KERN_INFO "Initializing module...\n");

    /* calculate hash value */
    hash = jhash(data, strlen(data), 0);
    printk(KERN_INFO "Hash value: %u\n", hash);

    return 0;
}

void my_exit(void)
{
    printk(KERN_INFO "Exiting module...\n");
}

MODULE_LICENSE("GPL");
module_init(my_init);
module_exit(my_exit);

上述示例程序中,在 my_init() 函数中定义了一个字符串 data,并使用 jhash() 函数计算出其哈希值,并打印出来。

注意: 虽然 jhash() 函数可以用于快速查找和管理数据结构等,但在使用时必须充分理解其作用原理和使用方法,避免因为错误使用导致哈希冲突或其他问题。同时,应当根据具体情况选择合适的哈希算法,并考虑其效率和安全性等方面的因素。

8. jiffies,jiffies_64

8.1 变量说明

变量声明

变量描述

unsigned long volatile jiffies;

它是 Linux 内核中的一个全局变量,表示内核启动后经过的节拍数。其中 volatile 关键字用于告知编译器在访问这个变量时不要使用缓存,以确保能够正确读取最新值。

u64 jiffies_64;

它是 Linux 内核中的一个全局变量,类似于 jiffies,但是支持更大的取值范围。其中 u6464 位无符号整型。

8.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/jiffies.h>

int my_init(void)
{
    u64 start = jiffies_64;
    u64 end;

    printk(KERN_INFO "Initializing module...\n");

    /* do some work */
    mdelay(1000);

    /* calculate elapsed time in jiffies_64 */
    end = jiffies_64 - start;
    printk(KERN_INFO "Elapsed time: %llu jiffies_64\n", end);

    return 0;
}

void my_exit(void)
{
    printk(KERN_INFO "Exiting module...\n");
}

MODULE_LICENSE("GPL");
module_init(my_init);
module_exit(my_exit);

上述示例程序中,在 my_init() 函数中获取了当前的 jiffies_64 值,并使用 mdelay() 函数让程序阻塞一段时间。在之后,通过计算当前的 jiffies_64 值与之前的 jiffies_64 值之差,计算出经过的时间并打印出来。

注意: jiffiesjiffies_64 值每隔一段时间就会发生一次溢出,在处理 jiffiesjiffies_64 值时必须注意这个问题,避免计算结果错误。另外,jiffiesjiffies_64 变量只能在内核空间中使用,不能在用户空间中使用。

9. jiffies_delta_to_clock_t

9.1 函数说明

函数声明

函数功能

clock_t jiffies_delta_to_clock_t(unsigned long delta);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于计算两个 jiffies 值之间的时间差,并将结果转换为 clock_t 类型的值。

参数:delta : 要计算的 jiffies 时间差值。

9.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/jiffies.h>

int my_init(void)
{
    unsigned long start = jiffies;
    unsigned long end;
    clock_t ticks;

    printk(KERN_INFO "Initializing module...\n");

    /* do some work */
    mdelay(1000);

    /* calculate elapsed time in jiffies and convert to ticks */
    end = jiffies;
    ticks = jiffies_delta_to_clock_t(end - start);
    printk(KERN_INFO "Elapsed time: %ld ticks\n", (long)ticks);

    return 0;
}

void my_exit(void)
{
    printk(KERN_INFO "Exiting module...\n");
}

MODULE_LICENSE("GPL");
module_init(my_init);
module_exit(my_exit);

上述示例程序中,在 my_init() 函数中获取了当前的 jiffies 值,并使用 mdelay() 函数让程序阻塞一段时间。在之后,通过计算当前的 jiffies 值与之前的 jiffies 值之差,并调用 jiffies_delta_to_clock_t() 函数,计算出经过的时间并打印出来。

注意: 在使用 jiffies_delta_to_clock_t() 函数时,返回值类型是 clock_t,不同于 jiffies_delta_to_msecs() 函数的返回值类型是 unsigned long。另外,clock_t 的定义可能因系统而异,应当根据具体情况进行处理。

10. jiffies_delta_to_msecs

10.1 函数说明

函数声明

函数功能

unsigned long jiffies_delta_to_msecs(unsigned long delta);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于计算两个 jiffies 值之间的时间差,并将结果转换为毫秒数

参数:delta : 要计算的 jiffies 时间差值。

10.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/jiffies.h>

int my_init(void)
{
    unsigned long start = jiffies;
    unsigned long end;
    unsigned long msecs;

    printk(KERN_INFO "Initializing module...\n");

    /* do some work */
    mdelay(1000);

    /* calculate elapsed time in jiffies and convert to milliseconds */
    end = jiffies;
    msecs = jiffies_delta_to_msecs(end - start);
    printk(KERN_INFO "Elapsed time: %lu ms\n", msecs);

    return 0;
}

void my_exit(void)
{
    printk(KERN_INFO "Exiting module...\n");
}

MODULE_LICENSE("GPL");
module_init(my_init);
module_exit(my_exit);

上述示例程序中,在 my_init() 函数中获取了当前的 jiffies 值,并使用 mdelay() 函数让程序阻塞一段时间。在之后,通过计算当前的 jiffies 值与之前的 jiffies 值之差,并调用 jiffies_delta_to_msecs() 函数,计算出经过的时间并打印出来。

注意: 在使用 jiffies_delta_to_msecs() 函数时,返回值类型是 unsigned long,不同于 jiffies_delta_to_clock_t() 函数的返回值类型是 clock_t。另外,由于 jiffies 的精度限制,计算结果可能存在一定的误差。

11. jiffies_to_clock_t

11.1 函数说明

函数声明

函数功能

clock_t jiffies_to_clock_t(unsigned long jiffies);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 jiffies 值(内核节拍数)转换为 clock_t 类型的值。

参数:jiffies: 要转换的 jiffies 值,它是 Linux 内核中的一个全局变量,表示内核启动后经过的节拍数。

11.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/jiffies.h>

int my_init(void)
{
    unsigned long j = jiffies;
    clock_t ticks;

    printk(KERN_INFO "Initializing module...\n");

    /* do some work */
    mdelay(1000);

    /* calculate elapsed time in ticks */
    ticks = jiffies_to_clock_t(jiffies - j);
    printk(KERN_INFO "Elapsed time: %ld ticks\n", (long)ticks);

    return 0;
}

void my_exit(void)
{
    printk(KERN_INFO "Exiting module...\n");
}

MODULE_LICENSE("GPL");
module_init(my_init);
module_exit(my_exit);

上述示例程序中,在 my_init() 函数中获取了当前的 jiffies 值,并使用 mdelay() 函数让程序阻塞一段时间。在之后,通过计算当前的 jiffies 值与之前的 jiffies 值之差并调用 jiffies_to_clock_t() 函数,计算出经过的时间,并打印出来。

注意: 在使用 jiffies_to_clock_t() 函数时,返回值类型是 clock_t,不同于 jiffies_to_msecs() 函数的返回值类型是 unsigned long。另外,clock_t 的定义可能因系统而异,应当根据具体情况进行处理。

12. jiffies_to_msecs

12.1 函数说明

函数声明

函数功能

unsigned long jiffies_to_msecs(const unsigned long j);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 jiffies 值(内核节拍数)转换为毫秒数。

参数:j: 要转换的 jiffies 值,它是 Linux 内核中的一个全局变量,表示内核启动后经过的节拍数。

12.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/jiffies.h>

int my_init(void)
{
    unsigned long j = jiffies;
    unsigned long ms;

    printk(KERN_INFO "Initializing module...\n");

    /* do some work */
    mdelay(1000);

    /* calculate elapsed time in milliseconds */
    ms = jiffies_to_msecs(jiffies - j);
    printk(KERN_INFO "Elapsed time: %lu ms\n", ms);

    return 0;
}

void my_exit(void)
{
    printk(KERN_INFO "Exiting module...\n");
}

MODULE_LICENSE("GPL");
module_init(my_init);
module_exit(my_exit);

上述示例程序中,在 my_init() 函数中获取了当前的 jiffies 值,并使用 mdelay() 函数让程序阻塞一段时间。在之后,通过计算当前的 jiffies 值与之前的 jiffies 值之差并调用 jiffies_to_msecs() 函数,计算出经过的时间,并打印出来。

注意: 在使用 jiffies_to_msecs() 函数时,必须十分小心地处理 jiffies 值的溢出等问题,以免计算结果错误。另外,jiffies_to_msecs() 函数只能用于内核空间中,不能在用户空间中使用。

13. jiffies64_to_clock_t

13.1 函数说明

函数声明

函数功能

clock_t jiffies64_to_clock_t(u64 jiffies);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 64 位 jiffies 值(内核节拍数)转换为 clock_t 类型的值。

参数:jiffies : 要转换的 64jiffies 值。

13.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/jiffies.h>

int my_init(void)
{
    u64 start = jiffies_64;
    u64 end;
    clock_t ticks;

    printk(KERN_INFO "Initializing module...\n");

    /* do some work */
    mdelay(1000);

    /* calculate elapsed time in jiffies_64 and convert to ticks */
    end = jiffies_64;
    ticks = jiffies64_to_clock_t(end - start);
    printk(KERN_INFO "Elapsed time: %ld ticks\n", (long)ticks);

    return 0;
}

void my_exit(void)
{
    printk(KERN_INFO "Exiting module...\n");
}

MODULE_LICENSE("GPL");
module_init(my_init);
module_exit(my_exit);

上述示例程序中,在 my_init() 函数中获取了当前的 64jiffies_64 值,并使用 mdelay() 函数让程序阻塞一段时间。在之后,通过计算当前的 64jiffies_64 值与之前的 jiffies_64 值之差,并调用 jiffies64_to_clock_t() 函数,计算出经过的时间并打印出来。

14. jiffies64_to_msecs

14.1 函数说明

函数声明

函数功能

u64 jiffies64_to_msecs(const u64 jiffies);

它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 64 位 jiffies 值(内核节拍数)转换为毫秒数。

参数:jiffies : 要转换的 64jiffies 值。

14.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/jiffies.h>

int my_init(void)
{
    u64 start = jiffies_64;
    u64 end;
    u64 msecs;

    printk(KERN_INFO "Initializing module...\n");

    /* do some work */
    mdelay(1000);

    /* calculate elapsed time in jiffies_64 and convert to milliseconds */
    end = jiffies_64;
    msecs = jiffies64_to_msecs(end - start);
    printk(KERN_INFO "Elapsed time: %llu ms\n", msecs);

    return 0;
}

void my_exit(void)
{
    printk(KERN_INFO "Exiting module...\n");
}

MODULE_LICENSE("GPL");
module_init(my_init);
module_exit(my_exit);

上述示例程序中,在 my_init() 函数中获取了当前的 64jiffies_64 值,并使用 mdelay() 函数让程序阻塞一段时间。在之后,通过计算当前的 64jiffies_64 值与之前的 jiffies_64 值之差,并调用 jiffies64_to_msecs() 函数,计算出经过的时间并打印出来。

15. jiffies_update_wallclock

15.1 函数说明

函数声明

函数功能

void jiffies_update_wallclock(void);

它是 Linux 内核头文件 linux/time.h 中的一个函数,用于更新系统时钟的时间戳。

15.2 演示示例

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/jiffies.h>

int my_init(void)
{
    printk(KERN_INFO "Initializing module...\n");

    /* do some work */
    mdelay(1000);

    /* update wall clock */
    jiffies_update_wallclock();

    return 0;
}

void my_exit(void)
{
    printk(KERN_INFO "Exiting module...\n");
}

MODULE_LICENSE("GPL");
module_init(my_init);
module_exit(my_exit);

上述示例程序中,在 my_init() 函数中使用 mdelay() 函数让程序阻塞一段时间,在之后调用 jiffies_update_wallclock() 函数更新系统时钟的时间戳。

注意: jiffies_update_wallclock() 函数只能在内核空间中使用,不能在用户空间中使用。另外,如果系统使用了 NTP 等网络时间同步服务,可能无法通过 jiffies_update_wallclock() 函数来准确更新系统时钟。

参考

  1. [MATH-标准C库]
  2. 《Linux内核API完全参考手册》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
C语言函数大全--k开头的函数
上述示例程序中,在 my_init() 函数中使用 kcalloc() 函数分配了一个大小为 40 字节的整型数组,并将其初始化为 1 到 10 的连续整数。在之后,打印了数组内容并释放了内存。
huazie
2025/04/27
1300
C语言函数大全--k开头的函数
Linux驱动开发-内核定时器
内核定时器是内核用来控制在未来某个时间点(基于jiffies(节拍总数))调度执行某个函数的一种机制,相关函数位于 <linux/timer.h> 和 kernel/timer.c 文件中。
DS小龙哥
2022/04/08
3.1K0
10_linux内核定时器实验
​ 硬件定时器产生的周期性中断,中断频率就是系统频率(拍率)。系统拍率可以设置,单位是HZ,可在编译内核时通过图形化界面设置,设置路径如下:Kernel Features -> Timer frequency([=y])
全栈程序员站长
2022/09/13
2.2K0
Linux内存管理之MMU的过程
之前写过一篇《CPU是如何访问内存的?》的文章,简单介绍了cpu访问内存的过程。有了之前的感性认识,这篇站在arm的角度再深度讲解一下,看完你会发现不理解arm原理就直接撸内核代码简直是耍流氓。
刘盼
2020/06/22
2.4K0
开源项目的测试和质量保证
本文深入研究了开源项目中测试和质量保证的重要性,以及如何实施有效的测试策略来确保开源软件的质量。通过案例研究和最佳实践,我们将了解测试在开源项目中的角色,以及如何确保开源软件满足用户的期望。
猫头虎
2024/04/09
2030
开源项目的测试和质量保证
Linux驱动开发13个实用案例
以下为你提供20个Linux驱动开发的实用案例,涵盖字符设备驱动、块设备驱动、网络设备驱动等不同类型,包含应用场景、技巧、代码示例和操作步骤。先赞再看后评论,腰缠万贯财进门。
威哥爱编程
2025/02/21
1820
[linux][kprobe]谁动了我的文件---使用kprobe找到目标进程
问题场景: 云计算IaaS平台上,经常使用libvirt+qemu-kvm做基础平台。libvirt会在/etc/libvirt/qemu/目录下,保存很多份qemu的配置文件,如ubuntu.xml。 作者发现其中的配置文件会在特定的场景下被修改,却不知道哪个进程是凶手。为了找到凶手,作者写下了这个debug工具。 代码分析: 代码路径:https://github.com/pacepi/whotouchmyfile #include <linux/kernel.h> #include <linux/mo
皮振伟
2018/04/09
2.4K0
通过netfilter使用get/setsockopt实现用户态与内核模块之间的通信
本文讲述通过netfilter和get/setsockopt实现用户态与内核态之间的通信。首先介绍相关背景,然后给出代码示例。重点在于介绍通过netfilter的钩子机制实现用户态设置和获取socket选项,从而完成用户态与内核态之间的通信。
雷大亨
2018/01/01
2.9K0
Linux内核定时器timer_list
本文介绍了如何通过Linux内核定时器实现LED灯的闪烁,从硬件的配置、驱动程序以及示例代码方面进行了详细的阐述。通过申请GPIO、配置GPIO、编写驱动程序以及添加设备到内核和加载设备,最终实现了LED灯的闪烁。
Jack_Cui
2017/12/28
3.4K0
嵌入式Linux系列第20篇:驱动编写入门
很早之前就有网友建议写一篇关于Linux驱动的文章。之所以拖到现在才写,原因之一是我之前没有在工作中遇到需要自己手动去写驱动的需求,主要是现在Linux内核驱动的支持已经比较完善了,另外一个原因是自己水平实在有限,不敢写驱动这个话题,Linux驱动里涉及到的东西太多了,很多年前专门买过驱动相关的书籍,厚厚的,看的云里雾里。借此机会,在这里给大家做个非常非常入门级的介绍,希望对大家有所帮助。
用户2366192
2021/05/31
2.6K0
Linux笔记(13)| 字符设备驱动基础入门
距离上一次更新有一段时间了,主要是最近更忙一些,一般来说,有时间我会尽量更新,如果比较忙的话就更新慢一些。
飞哥
2020/08/28
2.2K0
Linux笔记(13)| 字符设备驱动基础入门
Linux内核模块详解
内核模块是Linux操作系统中一个比较独特的机制。通过这一章学习,希望能够理解Linux提出内核模块这个机制的意义;理解并掌握Linux实现内核模块机制的基本技术路线;运用Linux提供的工具和命令,掌握操作内核模块的方法。
全栈程序员站长
2022/09/15
8.5K0
深入浅出:Linux设备驱动之中断与定时器
“我叮咛你的 你说 不会遗忘 你告诉我的 我也全部珍藏 对于我们来说 记忆是飘不落的日子 永远不会发黄 相聚的时候 总是很短 期待的时候 总是很长 岁月的溪水边 捡拾起多少闪亮的诗行 如果你要想念我 就望一望天上那 闪烁的繁星 有我寻觅你的 目光” 谢谢你,曾经来过~ 中断与定时器是我们再熟悉不过的问题了,我们在进行裸机开发学习的 时候,这几乎就是重难点,也是每个程序必要的模块信息,那么在Linux中,我们又怎么实现延时、计数,和中断呢? 一、中断 1.概述 所谓中断是指cpu在执行程序的过程中,出现了某些
小小科
2018/05/03
3.2K0
深入浅出:Linux设备驱动之中断与定时器
OpenCAS 内核模块加载
OpenCAS 内核模块加载 内核模块基本研发步骤介绍 模块加载函数,当通过insmod或者modprobe命令加载内核模块,模块加载函数会自动在内核中执行模块初始化函数 模块卸载函数,当rmmod命令卸载内核模块时候,会在内核执行模块的销毁函数 模块许可申明,许可证是用来描述内核模块的许可权限 模块的参数,模块参数是模块被加载时候可以传递参数,它对应的模块的全局变量 模块到处符号,内核模块可以导出的符号(symbol,对应的变量或者函数),导出后其他的内核模块可以使用本模块的函数或者变量 模块作者申请 内
用户4700054
2022/08/17
1.6K0
linux内核定时器实验
定时器是我们最常用到的功能,一般用来完成定时功能,本章我们就来学习一下 Linux 内核提供的定时器 API 函数,通过这些定时器 API 函数我们可以完成很多要求定时的应用。Linux内核也提供了短延时函数,比如 微秒、纳秒、毫秒延时函数,本章我们就来学习一下这些和时间有关的功能。
全栈程序员站长
2022/09/17
3.9K0
linux内核定时器实验
字符设备驱动程序接口
__init__宏:被修饰的函数会被链接器链接放入.init.text段中(本来默认情况下函数是被放入.text段中)。对内核而言是一种暗示,表示该函数仅在初始化期间使用,内核启动时统一会加载.init.text段中的这些模块安装函数,加载完后就会把这个段给释放掉以节省内存。 __exit__宏:被修饰的函数仅用于模块卸载,链接器会将其放入特殊的ELF段。如果模块被直接内嵌到内核中,或内核的配置不允许卸载模块,则被修饰的函数将被简单的丢弃。 prink函数:模块在被加载到内核后,它能调用的函数仅仅是由内核导出的那些函数。KERN_INFO是printk的打印级别,其实只是一个字符串(如<1>)。操作系统的命令行中也会有一个打印级别的设置(值为0-7),当前操作系统中执行printk的时候会去对比printk中的打印级别和操作系统命令行中设置的打印级别,小于命令行设置级别的信息会被打印出来,大于的会被拦截。 module_init宏:该宏声明的函数会在模块被装载到内核中调用。 module_exit宏:该宏声明的函数会在模块被卸载时调用。 MODULE_LICENSE宏:指定该代码所使用的许可证协议。 MODULE_AUTHOR:描述模块作者。
菜菜cc
2022/11/15
1.6K0
字符设备驱动程序接口
platform架构驱动简单示例+dts-compatible打印输出
arm64上driver+dts机制启动,C代码,drivers/usb/dwc3/core.c
tankaro
2025/01/20
1040
find_sys_call_table和kallsysms_lookup_name的区别
find_sys_call_table 和 kallsyms_lookup_name 都可以用于查找内核符号,但它们的具体作用和使用场景有所不同。以下是两者的详细对比:
233333
2024/05/30
3560
Linux驱动开发-内核共享工作队列
工作队列常见的使用形式是配合中断使用,在中断的服务函数里无法调用会导致休眠的相关函数代码,有了工作队列机制以后,可以将需要执行的逻辑代码放在工作队列里执行,只需要在中断服务函数里触发即可,工作队列是允许被重新调度、睡眠。
DS小龙哥
2022/04/08
2.2K0
如何编写一个简单地内核模块
Linux给应用程序提供了丰富的api,但是有时候我们需要跟硬件交互,访问一些特权级信息,所以可以使用编写内核模块这种方式。 另外Linux是宏内核结构,效率非常高,没有微内核那样各个模块之间的通讯损耗,但是又不能方便的对内核进行改动,可扩展性和可维护性比较差,内核模块提供了一种动态加载代码的方式,弥补了宏内核的不足。
yifei_
2022/11/14
1.4K0
相关推荐
C语言函数大全--k开头的函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验