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

C语言函数大全

  • y 开头的函数
    • 1. yperror
      • 1.1 函数说明
      • 1.2 演示示例
    • 2. yp_match
      • 2.1 函数说明
      • 2.2 演示示例
    • 3. y0【零阶第二类贝塞尔函数】
      • 3.1 函数说明
      • 3.2 演示示例
      • 3.3 运行结果
    • 4. y1【一阶第二类贝塞尔函数】
      • 4.1 函数说明
      • 4.2 演示示例
      • 4.3 运行结果
    • 5. yn【n 阶第二类贝塞尔函数】
      • 5.1 函数说明
      • 5.2 演示示例
      • 5.3 运行结果
    • 6. yield_to
      • 6.1 函数说明
      • 6.2 演示示例
    • 7. yield_to_for
      • 7.1 函数说明
      • 7.2 演示示例
    • 8. yield_to_forced
      • 8.1 函数说明
      • 8.2 演示示例
    • 9. yield_to_if_needed
      • 9.1 函数说明
      • 9.2 演示示例
    • 10. yield_to_when_done
      • 10.1 函数说明
      • 10.2 演示示例
    • 参考

y 开头的函数

1. yperror

1.1 函数说明

函数声明函数功能
void yperror(char *msg);在 UNIX 和 Linux 系统中用于将 NIS(Network Information Service)错误代码转换为相应的错误信息

参数:

  • msg : 指向一个字符数组的指针,表示 附加的消息

yperror() 函数打印出与最后一次调用 NIS 服务相关联的错误消息,以及任何作为 msg 参数传递的附加消息。

1.2 演示示例

#include <stdio.h>
#include <rpcsvc/ypclnt.h>

int main()
{
    char *domain = "example.com";
    char *map = "passwd.byname";
    int result;

    result = yp_match(domain, map, "johndoe", 7, &value, &vallen);

    if (result != 0)
    {
        yperror("Error getting NIS information");
        return 1;
    }

    printf("User data: %s\n", value);

    return 0;
}

2. yp_match

2.1 函数说明

函数声明函数功能
int yp_match(const char *domain, const char *map, const char *key, int keylen, char **val, int *vallen);在网络信息服务中使用的函数,用于查找 NIS 数据库中的条目

参数:

  • domain : 要查询的NIS域名
  • map : 要查询的映射表名称
  • key : 要查找的键的值
  • keylen : 键值的长度
  • val : 指向一个指针,该指针将被设置为匹配键的值。如果该键未找到,则指针将被设置为NULL
  • vallen: 指向一个整数,它在调用时必须初始化为指定缓冲区大小,返回时包含实际读取的字节数

返回值:

  • 0:成功找到匹配项
  • YPERR_KEY:没有找到指定的键
  • YPERR_DOMAIN:指定的NIS域无法解析
  • YPERR_MAP:指定的映射表不存在
  • YPERR_YPBIND:无法联系ypproc_bind进程
  • YPERR_RPC :RPC故障

2.2 演示示例

详见 1.2 中的演示示例

3. y0【零阶第二类贝塞尔函数】

3.1 函数说明

函数声明函数功能
double y0(double x);计算 x 的零阶第二类贝塞尔函数

参数:

  • x : 待计算的值

3.2 演示示例

#include <stdio.h>
#include <math.h>

int main() 
{
    double x = 2.5;
    //  计算 x 的零阶第二类贝塞尔函数
    double result = y0(x); 
    printf("y0(%lf) = %lf\n", x, result);
    return 0;
}

3.3 运行结果

在这里插入图片描述

4. y1【一阶第二类贝塞尔函数】

4.1 函数说明

函数声明函数功能
double y1(double x);计算 x 的一阶第二类贝塞尔函数

参数:

  • x : 待计算的值

4.2 演示示例

#include <stdio.h>
#include <math.h>

int main() 
{
    double x = 2.5;
    //  计算 x 的一阶第二类贝塞尔函数
    double result = y1(x); 
    printf("y1(%lf) = %lf\n", x, result);
    return 0;
}

4.3 运行结果

在这里插入图片描述

5. yn【n 阶第二类贝塞尔函数】

5.1 函数说明

函数声明函数功能
double yn(int n, double x);计算 xn 阶第二类贝塞尔函数

参数:

  • n : 第二类贝塞尔函数的阶数
  • x : 待计算的值

5.2 演示示例

#include <stdio.h>
#include <math.h>

int main() {
    double x = 1.0;
    int n = 2;
    // 二阶第二类贝塞尔函数
    double value = yn(n, x);
    printf("The value of Y_%d(%.2lf) is: %lf\n", n, x, value);
    return 0;
}

5.3 运行结果

在这里插入图片描述

6. yield_to

6.1 函数说明

函数声明函数功能
void yield_to(struct task_struct *next);它是 Linux 内核中的函数,用于将 CPU 控制权从一个进程转移到另一个进程

参数:

  • next : 要切换到的进程的任务结构体指针

6.2 演示示例

#include <linux/sched.h>

asmlinkage void sys_yield(void)
{
    struct task_struct *next, *prev;

    prev = current; // 保存当前进程
    next = list_entry(prev->tasks.next, struct task_struct, tasks); // 获取下一个进程

    yield_to(next); // 切换到下一个进程
}

上述的这个示例程序是一个系统调用,当用户调用 sys_yield() 时,它将获取下一个进程并将控制权传递给它。

注意,在实际的 Linux 内核代码中,yield_to() 函数有更多的参数和复杂的实现细节,因此这个示例仅仅是为了演示其基本思想。

7. yield_to_for

7.1 函数说明

函数声明函数功能
void yield_to_for(struct task_struct *prev, struct task_struct *next, long timeout);它是 Linux 内核中的一个函数,用于协作式多任务调度

参数:

  • prev : 指向当前正在运行的任务的 task_struct 结构体
  • next : 指向即将要运行的任务的 task_struct 结构体。
  • timeout : 指示当前任务在放弃 CPU 之前应该等待的时间

yield_to_for() 函数的作用是让当前任务主动让出 CPU,让其他任务有机会运行。

  • 如果 timeout 参数大于零,则当前任务会等待指定的时间后再次运行;
  • 如果 timeout 参数为零,则当前任务会立即重新运行;
  • 如果 timeout 参数小于零,则当前任务不会自动重新运行,直到其他事件发生时再次被唤醒。

7.2 演示示例

#include <linux/sched.h>
#include <linux/time.h>
#include <linux/timer.h>

static int my_tasklet_id;
static struct timer_list my_timer;

void my_tasklet(unsigned long data)
{
    printk("my_tasklet called\n");
}

void my_timer_callback(unsigned long data)
{
    struct task_struct *prev = current;
    struct task_struct *next = &init_task;

    printk("my_timer_callback called\n");

    /* 让当前任务主动让出 CPU */
    yield_to_for(prev, next, 0);

    /* 使用 tasklet 调度后续处理 */
    tasklet_schedule(&my_tasklet);
}

int init_module(void)
{
    printk("module loaded\n");

    /* 注册一个定时器,并在 1 秒后触发回调函数 */
    init_timer(&my_timer);
    my_timer.function = my_timer_callback;
    my_timer.data = 0;
    my_timer.expires = jiffies + HZ;
    add_timer(&my_timer);

    /* 注册一个 tasklet */
    my_tasklet_id = __tasklet_hi_schedule(my_tasklet, 0);

    return 0;
}

void cleanup_module(void)
{
    printk("module unloaded\n");

    /* 删除定时器和 tasklet */
    del_timer_sync(&my_timer);
    tasklet_kill(&my_tasklet);
}

在上述的示例代码中,我们定义了一个定时器和一个 tasklet,定时器的回调函数 my_timer_callback() 中调用了 yield_to_for() 函数,让当前任务主动让出 CPU。当定时器到期时,在内核的调度过程中,会先运行其他可运行的任务,然后再次运行当前任务,并执行 tasklet_schedule,以调度后续处理。

8. yield_to_forced

8.1 函数说明

函数声明函数功能
void yield_to_forced(struct task_struct *t);它是 Linux 内核中的一个函数,用于将当前进程放弃 CPU,并强制切换到指定的进程 t 所在的 CPU上执行

参数:

  • t : 待复制的宽字符串

8.2 演示示例

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>

static int __init my_init(void)
{
    struct task_struct *p, *next;

    printk(KERN_INFO "Start of yield_to_forced example.\n");

    // 打印当前进程和它的PID
    printk(KERN_INFO "Current process: %s, PID: %d\n", current->comm, current->pid);

    // 遍历进程列表,寻找一个不是当前进程的进程
    for_each_process(p)
    {
        if (p != current)
        {
            next = p;
            break;
        }
    }

    // 如果找到了,则将当前进程放弃CPU,并强制切换到找到的进程所在的CPU上执行
    if (next)
    {
        yield_to_forced(next);
        printk(KERN_INFO "Switched to process: %s, PID: %d\n", next->comm, next->pid);
    }
    else
    {
        printk(KERN_INFO "No other process found.\n");
    }

    printk(KERN_INFO "End of yield_to_forced example.\n");

    return 0;
}

static void __exit my_exit(void)
{
    printk(KERN_INFO "Module exit.\n");
}

module_init(my_init);
module_exit(my_exit);

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("ChatGPT");
MODULE_DESCRIPTION("An example of using yield_to_forced function.");

上述的示例代码中,首先遍历进程列表,找一个不是当前进程的进程;如果找到了,则使用 yield_to_forced() 函数将当前进程放弃 CPU,并强制切换到找到的进程所在的 CPU 上执行。如果找不到这样的进程,则打印一个提示信息。

注意:yield_to_forced() 函数只有在实时进程中才能使用,否则会导致内核崩溃。因此,在使用该函数时一定要小心。

9. yield_to_if_needed

9.1 函数说明

函数声明函数功能
void yield_to_if_needed(struct task_struct *prev);将 CPU 资源让给其他需要运行的任务

参数:

  • prev : 当前正在运行的任务结构体的指针

该函数会检查任务 prev 是否需要放弃 CPU 并将控制权交给其他需要运行的任务。如果需要,它将调用 schedule() 函数来选择下一个要运行的任务,并将控制权转移给它。在此过程中,该函数还会执行几个与调度相关的操作,例如检查新选定的任务是否具有更高的优先级,以及将当前任务从 CPU 上下文中删除。

9.2 演示示例

#include <linux/kernel.h>
#include <linux/sched.h>

void my_task_function(void)
{
    while (!kthread_should_stop()) {
        // Do some work here...
        yield_to_if_needed(current);
    }
}

struct task_struct *my_task;

int init_module(void)
{
    my_task = kthread_create(my_task_function, NULL, "my_task");
    if (IS_ERR(my_task)) {
        printk(KERN_ERR "Failed to create my_task\n");
        return PTR_ERR(my_task);
    }

    wake_up_process(my_task);
    return 0;
}

void cleanup_module(void)
{
    kthread_stop(my_task);
}

在上述的示例代码中,

  • 首先,我们创建了一个名为 my_task 的内核线程,并将其添加到运行队列中;
  • 然后,在 my_task_function() 中调用 yield_to_if_needed() 函数,以便在必要时放弃 CPU 控制权;
  • 最后,在模块卸载时,我们停止了 my_task 线程。

10. yield_to_when_done

10.1 函数说明

函数声明函数功能
void yield_to_when_done(struct task_struct *prev, long state);它一个 Linux 内核中的函数,它允许当前进程在执行完特定任务时将 CPU 资源让给其他进程,以避免浪费 CPU 时间

参数:

  • prev : 前一个进程的指针
  • state : 进程的状态

10.2 演示示例

#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/module.h>

static int my_module_init(void) 
{
    printk(KERN_INFO "Module initialized.\n");

    struct task_struct *prev = current;
    long state = TASK_INTERRUPTIBLE;

    // 执行某些任务

    yield_to_when_done(prev, state);

    return 0;
}

static void my_module_exit(void) 
{
    printk(KERN_INFO "Module exited.\n");
}

module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");

在上述的示例代码中,当模块被加载时,my_module_init() 函数会被调用:

  • 首先,在my_module_init() 函数中,我们打印一条日志;
  • 然后,获取当前进程的指针并将其赋值给 prev 变量;同时,我们将进程的状态设置为可中断状态(TASK_INTERRUPTIBLE);
  • 接着,我们执行某些任务;
  • 随后,调用 yield_to_when_done() 函数,将 CPU 资源让出;
  • 最后,my_module_exit() 函数用于在模块被卸载时清理资源。

参考

  1. [Bessel Function of the Second Kind]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/25280.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python IDLE介绍

目录 IDE&#xff08;集成开发环境&#xff09;是什么 Python IDLE使用方法详解 Python IDLE常用快捷键 IDE&#xff08;集成开发环境&#xff09;是什么 IDE 是 Integrated Development Environment 的缩写&#xff0c;中文称为集成开发环境&#xff0c;用来表示辅助程序员…

第五章 图像处理

文章目录 前言一、图像金字塔1.高斯金字塔2.拉普拉斯金字塔 二、图像轮廓1. 轮廓提取2. 轮廓绘制3. 轮廓特征4. 轮廓近似5. 轮廓标记 三、模板匹配四、直方图1. 对比度2. 绘制直方图3. 均衡化3.1 理论3.2 代码 4. CLAHE 五、图像傅里叶变换5.1 正弦平面波5.2 二维傅里叶变换5.3…

VITS语音生成模型详解及中文语音生成训练

1 VITS模型介绍 VITS&#xff08;Variational Inference with adversarial learning for end-to-end Text-to-Speech&#xff09;是一种结合变分推理&#xff08;variational inference&#xff09;、标准化流&#xff08;normalizing flows&#xff09;和对抗训练的高表现力语…

fastjson 1.2.24 反序列化导致任意命令执行漏洞复现

前言 fastjson是阿里巴巴的开源JSON解析库&#xff0c;它可以解析JSON格式的字符串&#xff0c;的作用就是把java对象转换为json形式&#xff0c;也可 以用来将json转换为java对象。 fastjson在解析json的过程中&#xff0c;支持使用autoType来实例化某一个具体的类&#xff…

20230530论文整理·1-课题组1

个人观点&#xff0c;现在的NLP文章&#xff0c;有些是在做积木&#xff0c;微创新&#xff0c;有些文章&#xff0c;是可以的&#xff0c;读起来很美&#xff0c;有些&#xff0c;太过逆了&#xff0c;吃起来没味道&#xff0c;反胃。 文章目录 1.CODEIE: Large Code Generat…

TreeMap(1):TreeMap介绍

1 TreeMap的特点 概念&#xff1a; TreeMap是一个双列集合&#xff0c;是Map的子类。底层由红黑树结构构成。 特点&#xff1a; 元素中键不能重复元素会按照大小顺序排序 2 TreeMap的数据结构 2.1二叉查找树 2.1.1二叉查找树的定义 特点&#xff1a; 若左子树不空&#…

从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法

前面已经对 string 类进行了简单的介绍和应用&#xff0c;大家只要能够正常使用即可。 在面试中&#xff0c;面试官总喜欢让学生自己 来模拟实现string类&#xff0c; 最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。 为了更深入学习STL&#xff0c;下面我…

乐谱文件转换,支持批量mscz、mxl、musicxml转mp3等格式

我是一个喜欢听音乐的人&#xff0c;每天都会在路上听着歌放松自己。但是有时候想要听的歌并没有下载下来&#xff0c;或者格式不兼容。 最近我发现了一个神奇的软件——mscz转mp3&#xff0c;可以把乐谱文件转成mp3格式&#xff01; 软件界面简洁明了&#xff0c;使用也非常…

【JavaSE】Java基础语法(四十四):XML解析

文章目录 1. 概述2.标签的规则3. 语法规则【应用】4. xml解析【应用】 1. 概述 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域…

Hive安装部署

1、Hive安装地址 ①Hive官网地址 Apache Hive ②文档查看地址 GettingStarted - Apache Hive - Apache Software Foundation ③下载地址 Index of /dist/hive ④github地址 GitHub - apache/hive: Apache Hive 2、 安装Hive 1&#xff09;把apache-hive-3.1.3-bin.ta…

数据结构-顺序表

数据结构-顺序表 线性表顺序表的概念和结构静态顺序表和动态顺序表 接口的实现顺序表的初始化顺序表的打印顺序表的销毁顺序表的增容顺序表的尾插顺序表的尾删顺序表的头插顺序表的头删顺序表的任意位置插入顺序表的任意位置删除顺序表中元素的查找 完整代码 线性表 线性表是n…

MyBatis 环境搭建+基本使用

目录 MyBatis创建MyBatis环境搭建MyBatis模式开发MyBatis 获取动态参数&#xff08;查询操作&#xff09;${} 直接替换#{} 占位符模式替换like查询&#xff08;模糊查询&#xff09;多表查询一对一的表映射一对多的表映射 增、删、改操作改操作删除操作增加操作添加用户添加用户…

JVM学习(十三):面试中绕不开的String

目录 一、String 的基本特性 1.1 String类的声明 1.2 String的存储方式在jdk9中的变更 1.3 Stirng 的不可变性 二、String的内存分配 2.1 字符串常量池是什么 2.2 底层原理与默认值 2.3 字符串常量池所在位置 三、字符串的拼接操作 3.1 拼接操作结果存放位置 …

es elasticsearch 九 索引index 定制分词器 type结构后期弃用原因 定制动态映射 动态映射模板 零停机重建索引

目录 索引index 定制分词器 Type底层结构及弃用原因 定制 dynamic mapping 定制dynamic mapping template 动态映射模板 零停机重建索引 生产环境应该度别名数据 索引index Put /index Stings 分片 Mapping 映射 Aliases 别名 增加 Put my_index2 { "se…

软考A计划-试题模拟含答案解析-卷七

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

从C语言到C++_12(string相关OJ题)(leetcode力扣)

上一篇已经讲了string类的接口函数&#xff0c;然后根据查文档刷了牛客和力扣58最后一个单词的长度&#xff0c; 还有力扣415字符串相加&#xff0c;这篇继续跟着查文档来刷力扣题&#xff0c;体会C刷题的方便。 目录 917. 仅仅反转字母 - 力扣&#xff08;LeetCode&#xf…

Linux 实操篇-组管理和权限管理

Linux 实操篇-组管理和权限管理 Linux 组基本介绍 在linux 中的每个用户必须属于一个组&#xff0c;不能独立于组外。在linux 中每个文件有所有者、所在组、其它组的概念。 所有者所在组其它组改变用户所在的组 文件/目录所有者 一般为文件的创建者,谁创建了该文件&#x…

计算机视觉:卷积核的运行过程

本文重点 我们前面从直观角度理解了卷积神经网络的卷积在特征提取的作用,本节课程我们从数学角度来看一下,卷积是如何计算的? 计算步骤 1. 将卷积核与输入图像的某一部分进行逐元素相乘。 2. 将相乘后的结果求和,得到卷积核在该部分的输出值。 3. 重复以上步骤,将卷积核…

【shiro】shiro整合JWT——3.执行流程

前言 shiro整合JWT系列&#xff0c;主要记录核心思路–如何在shiroredis整合JWTToken。 上一篇中&#xff0c;主要讲如何在shiro框架中配置Jwt&#xff0c;以及token执行的流程。 该篇主要梳理整个代码的执行流程。 ps&#xff1a;本文主要以记录核心思路为主&#xff0c;以下…

uCOSii消息邮箱管理

uCOSii消息邮箱管理 (MESSAGE MAILBOX MANAGEMENT) 消息邮箱主要用于中断和任务之间进行邮件传递&#xff0c;或者是在任务与任务之间进行邮件交换。 我个人觉得&#xff0c;了解uCOSii消息邮箱的几个重要函数&#xff0c;还是有必要的。不是所有人都给我们测试案例。 1、重…
最新文章