【嵌入式Linux应用开发基础】ioctl函数
目录
一、概述
1.1. ioctl 的功能
1.2. 函数原型
1.3. 参数说明
1.4. 返回值
1.5. request 命令的定义
二、典型应用场景
2.1. 串口通信控制
2.2. 网络设备配置与管理
2.3. 字符设备控制
2.4. 块设备管理
2.5. 多媒体设备控制
三、关键注意事项
3.1. request 命令的定义与使用
3.2. 错误处理
3.3. 数据传输安全
3.4. 设备状态与并发访问
3.5. 兼容性与可移植性
3.6. 资源管理
四、常见问题
4.1. 参数错误或未定义命令
4.2. 用户空间指针错误
4.3. 权限问题
4.4. 内核与用户空间数据对齐问题
4.5. 未正确处理阻塞/非阻塞操作
4.6. 命令号冲突
4.7. 内存泄漏或竞态条件
4.8. 调试建议
4.9. 示例:正确构造 ioctl 命令
五、总结
六、参考文献
在嵌入式 Linux 应用开发中,ioctl
(Input/Output Control)函数是一个非常重要的系统调用,它为用户空间程序和内核空间驱动程序之间提供了一种灵活的交互机制,允许用户空间程序向内核空间的设备驱动程序发送各种控制命令,以实现设备的特定操作。
一、概述
1.1. ioctl
的功能
-
设备控制接口:当标准
read
/write
无法满足需求时(如设置串口波特率、调整屏幕分辨率等),ioctl
提供了一种扩展的、设备相关的控制机制。 -
灵活性:允许用户空间与内核驱动之间传递任意类型的数据(结构体、整数、指针等)。
1.2. 函数原型
ioctl
函数的原型如下:
#include <sys/ioctl.h>int ioctl(int fd, unsigned long request, ...);
1.3. 参数说明
fd
:文件描述符,指向要操作的设备文件。通过open
函数打开设备文件后会返回一个文件描述符,将其作为ioctl
的第一个参数,以指定要操作的设备。request
:控制命令,是一个无符号长整型值。不同的设备驱动程序会定义不同的request
命令,用于表示不同的操作,如读取设备状态、设置设备参数等。...
:可选参数,根据request
命令的不同,可能需要传递额外的参数给驱动程序。这个参数可以是一个整数、指针等。
1.4. 返回值
- 成功时,
ioctl
函数返回值取决于具体的request
命令,通常为 0 表示操作成功。 - 失败时,返回 -1,并设置
errno
变量来指示具体的错误类型。
1.5. request
命令的定义
request
命令通常由驱动程序开发者定义,为了避免不同设备驱动之间的命令冲突,request
命令一般由以下几个部分组成:
- 类型(Type):通常是一个 8 位的值,用于标识命令所属的设备类型,如字符设备、块设备等。
- 序号(Number):也是一个 8 位的值,用于区分同一设备类型下的不同命令。
- 方向(Direction):表示数据的传输方向,有以下几种情况:
_IOC_NONE
:无数据传输。_IOC_READ
:从设备读取数据。_IOC_WRITE
:向设备写入数据。_IOC_READ | _IOC_WRITE
:同时进行读写操作。
- 大小(Size):表示传输数据的大小,通常是一个 13 或 14 位的值。
在 Linux 内核中,提供了一些宏来方便定义 request
命令,例如:
#define _IO(type, nr) _IOC(_IOC_NONE, (type), (nr), 0)
#define _IOR(type, nr, size) _IOC(_IOC_READ, (type), (nr), sizeof(size))
#define _IOW(type, nr, size) _IOC(_IOC_WRITE, (type), (nr), sizeof(size))
#define _IOWR(type, nr, size) _IOC(_IOC_READ | _IOC_WRITE, (type), (nr), sizeof(size))
示例:
#define MY_DEVICE_TYPE 'M'
#define MY_DEVICE_CMD_GET_STATUS _IOR(MY_DEVICE_TYPE, 1, int)
#define MY_DEVICE_CMD_SET_PARAM _IOW(MY_DEVICE_TYPE, 2, struct my_device_param)
二、典型应用场景
2.1. 串口通信控制
串口是嵌入式系统中常用的通信接口,ioctl
函数可用于对串口设备进行各种控制和配置,以满足不同的通信需求。
- 设置串口参数:可以使用
ioctl
函数设置串口的波特率、数据位、停止位、校验位等参数。例如,通过特定的request
命令,向串口驱动发送设置信息,从而改变串口的通信速率和数据格式。 - 查询串口状态:查询串口的接收缓冲区是否有数据、发送缓冲区是否为空等状态信息。对于实现高效的串口数据收发非常重要,例如在接收数据时,先查询接收缓冲区状态,有数据时再进行读取操作,避免不必要的等待。
- 控制硬件流控:在一些对数据传输可靠性要求较高的场景中,需要使用硬件流控(如 RTS/CTS)来协调数据的发送和接收。
ioctl
函数可以用来开启或关闭硬件流控功能。
示例代码:
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>#define SERIAL_PORT "/dev/ttyS0"int main() {int fd = open(SERIAL_PORT, O_RDWR);if (fd == -1) {perror("open");return -1;}// 查询串口接收缓冲区中的字节数int bytes_available;if (ioctl(fd, FIONREAD, &bytes_available) == -1) {perror("ioctl");close(fd);return -1;}printf("Bytes available in receive buffer: %d\n", bytes_available);close(fd);return 0;
}
2.2. 网络设备配置与管理
在嵌入式系统中,网络通信是常见的需求,ioctl
函数可用于对网络设备进行配置和管理。
- 获取和设置网络接口参数:如获取网络接口的 MAC 地址、IP 地址、子网掩码等信息,或者设置这些参数。这对于网络设备的初始化和配置非常有用。
- 控制网络接口状态:可以使用
ioctl
函数开启或关闭网络接口,检查网络接口是否处于活动状态等。例如,在系统启动时,使用ioctl
函数激活网络接口,使其能够正常工作。 - 流量控制:对网络设备的流量进行控制,如设置网络带宽限制、开启或关闭流量整形等功能。
示例代码:
#include <stdio.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <string.h>
#include <unistd.h>#define INTERFACE_NAME "eth0"int main() {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd == -1) {perror("socket");return -1;}struct ifreq ifr;strcpy(ifr.ifr_name, INTERFACE_NAME);// 获取网络接口的 MAC 地址if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1) {perror("ioctl");close(sockfd);return -1;}printf("MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",(unsigned char)ifr.ifr_hwaddr.sa_data[0],(unsigned char)ifr.ifr_hwaddr.sa_data[1],(unsigned char)ifr.ifr_hwaddr.sa_data[2],(unsigned char)ifr.ifr_hwaddr.sa_data[3],(unsigned char)ifr.ifr_hwaddr.sa_data[4],(unsigned char)ifr.ifr_hwaddr.sa_data[5]);close(sockfd);return 0;
}
2.3. 字符设备控制
字符设备是嵌入式系统中常见的设备类型,如 LED、按键、传感器等,ioctl
函数可用于对这些设备进行控制和操作。
- LED 控制:通过
ioctl
函数可以控制 LED 的亮灭、闪烁频率等。例如,向 LED 驱动发送特定的request
命令,实现 LED 的不同显示效果。 - 按键检测:查询按键的状态,判断按键是否被按下。在一些嵌入式系统中,按键是用户输入的重要方式,使用
ioctl
函数可以方便地获取按键状态。 - 传感器数据采集控制:对于一些传感器设备,如温度传感器、湿度传感器等,
ioctl
函数可以用于启动或停止数据采集,设置采集频率等。
示例代码:
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>#define LED_DEVICE "/dev/led"
#define LED_ON _IO('L', 1)
#define LED_OFF _IO('L', 2)int main() {int fd = open(LED_DEVICE, O_RDWR);if (fd == -1) {perror("open");return -1;}// 打开 LEDif (ioctl(fd, LED_ON) == -1) {perror("ioctl");close(fd);return -1;}sleep(2);// 关闭 LEDif (ioctl(fd, LED_OFF) == -1) {perror("ioctl");close(fd);return -1;}close(fd);return 0;
}
2.4. 块设备管理
块设备(如硬盘、SD 卡等)在嵌入式系统中用于存储数据,ioctl
函数可用于对块设备进行管理和操作。
- 获取块设备信息:如获取块设备的容量、扇区大小等信息。这些信息对于文件系统的管理和数据存储非常重要。
- 设备分区管理:对块设备进行分区操作,如创建、删除分区等。在一些嵌入式系统中,需要对存储设备进行合理的分区,以满足不同的数据存储需求。
- 设备错误处理:检测块设备是否出现错误,如坏道检测等。当检测到设备错误时,可以采取相应的措施,如标记坏道、备份数据等。
2.5. 多媒体设备控制
在嵌入式多媒体系统中,ioctl
函数可用于对多媒体设备(如摄像头、音频设备等)进行控制和配置。
- 摄像头控制:设置摄像头的分辨率、帧率、曝光时间等参数,实现不同的拍摄效果。还可以控制摄像头的开关、开始或停止视频录制等操作。
- 音频设备控制:调节音频设备的音量、声道平衡等参数,选择音频输入或输出设备。例如,在嵌入式音频播放器中,使用
ioctl
函数实现音量的调节和音频源的切换。
三、关键注意事项
3.1. request
命令的定义与使用
①唯一性:request
命令必须在整个系统范围内保持唯一。不同的设备驱动应该使用不同的 request
命令值,以避免冲突。通常通过定义不同的类型(Type)字段来区分不同设备类型的命令,使用序号(Number)来区分同一设备类型下的不同操作。
例如:
#define MY_DEVICE_TYPE 'M'
#define MY_CMD_1 _IO(MY_DEVICE_TYPE, 1)
#define MY_CMD_2 _IO(MY_DEVICE_TYPE, 2)
②宏的使用:Linux 内核提供了一系列宏(如 _IO
、_IOR
、_IOW
、_IOWR
)来帮助定义 request
命令。这些宏会自动处理命令的方向和大小信息,使用时要确保参数传递正确。
例如:
// 定义一个从设备读取整数的命令
#define MY_READ_CMD _IOR(MY_DEVICE_TYPE, 3, int)
3.2. 错误处理
①返回值检查:调用 ioctl
函数后,一定要检查其返回值。若返回 -1,表示操作失败,此时需要根据 errno
变量的值来确定具体的错误原因。常见的错误包括设备不存在、权限不足、命令不支持等。
示例代码:
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>#define MY_DEVICE "/dev/mydevice"
#define MY_CMD _IO('M', 1)int main() {int fd = open(MY_DEVICE, O_RDWR);if (fd == -1) {perror("open");return -1;}if (ioctl(fd, MY_CMD) == -1) {perror("ioctl");close(fd);return -1;}close(fd);return 0;
}
②错误码处理:不同的错误码对应不同的错误情况,开发者需要根据具体的错误码进行相应的处理。例如,EBADF
表示文件描述符无效,EINVAL
表示参数无效等。
3.3. 数据传输安全
① 用户空间与内核空间数据交互:当 ioctl
函数需要在用户空间和内核空间之间传输数据时,要使用内核提供的安全函数,如 copy_to_user
和 copy_from_user
。直接访问用户空间地址可能会导致内核崩溃,因为用户空间的内存可能会被换出或不可访问。
示例(内核驱动代码):
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>#define MY_DEVICE_TYPE 'M'
#define MY_WRITE_CMD _IOW(MY_DEVICE_TYPE, 1, int)static long my_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {int value;switch (cmd) {case MY_WRITE_CMD:if (copy_from_user(&value, (int *)arg, sizeof(value))) {return -EFAULT;}// 处理接收到的数据break;default:return -ENOTTY;}return 0;
}static struct file_operations my_fops = {.unlocked_ioctl = my_ioctl,
};static int __init my_init(void) {// 注册字符设备等操作return 0;
}static void __exit my_exit(void) {// 注销字符设备等操作
}module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");
②数据大小检查:在进行数据传输时,要确保传输的数据大小与 request
命令中定义的大小一致。如果不一致,可能会导致数据截断或越界访问,从而引发不可预期的错误。
3.4. 设备状态与并发访问
①设备状态检查:在调用 ioctl
函数之前,最好先检查设备的状态,确保设备处于可操作的状态。例如,在对串口设备进行读写操作之前,检查串口是否已经打开且正常工作。
②并发访问控制:如果多个进程或线程可能同时对同一设备调用 ioctl
函数,需要进行并发访问控制。可以使用互斥锁、信号量等机制来确保同一时间只有一个进程或线程可以对设备进行操作,避免数据竞争和不一致的问题。
3.5. 兼容性与可移植性
①内核版本兼容性:不同的内核版本可能对 ioctl
函数和 request
命令的实现有所不同。在开发过程中,要确保代码在目标内核版本上能够正常工作。如果需要支持多个内核版本,可能需要进行版本检查和相应的兼容性处理。
②硬件平台兼容性:不同的硬件平台可能对设备驱动和 ioctl
命令有不同的实现。在进行跨平台开发时,要考虑硬件平台的差异,确保代码在不同平台上都能正常运行。
3.6. 资源管理
①文件描述符管理:在使用 ioctl
函数之前,需要通过 open
函数打开相应的设备文件,获取文件描述符。使用完后,要及时通过 close
函数关闭文件描述符,以释放系统资源。避免文件描述符泄漏,导致系统资源耗尽。
②内存管理:如果在 ioctl
函数调用过程中分配了内存,要确保在不再使用时及时释放内存,避免内存泄漏。例如,在驱动程序中使用 kmalloc
分配内存后,要使用 kfree
释放。
四、常见问题
4.1. 参数错误或未定义命令
-
现象:
ioctl
返回-1
,错误码为ENOTTY
("不合适的IO控制操作")。 -
原因:
-
传递的
cmd
参数未被驱动识别。 -
设备文件未正确绑定到支持该
ioctl
命令的驱动。
-
-
解决方法:
-
检查
cmd
的生成逻辑(是否正确定义了_IO
/_IOR
/_IOW
/_IOWR
宏)。 -
确保设备节点(如
/dev/xxx
)对应的驱动实现了对应的unlocked_ioctl
或compat_ioctl
方法。
-
4.2. 用户空间指针错误
-
现象:
ioctl
返回-1
,错误码为EFAULT
("错误的地址")。 -
原因:
-
用户空间指针未初始化或指向非法内存。
-
内核未正确使用
copy_from_user
/copy_to_user
访问用户空间数据。
-
-
解决方法:
-
检查用户空间指针的有效性(如调用前分配内存)。
-
内核驱动中必须使用安全的内存拷贝函数,避免直接解引用用户指针。
-
4.3. 权限问题
-
现象:
ioctl
返回-1
,错误码为EPERM
("操作不允许")。 -
原因:
-
用户程序未以
root
权限运行。 -
设备文件的权限设置不允许当前用户操作(如未正确设置
chmod
)。
-
-
解决方法:
-
使用
sudo
运行程序,或为设备文件设置合适的权限(如0666
)。 -
检查内核驱动是否在
file_operations
中限制了访问权限。
-
4.4. 内核与用户空间数据对齐问题
-
现象:数据解析错误,尤其在32/64位混合环境中。
-
原因:
-
用户空间和内核空间的结构体对齐方式不一致(如
struct
填充字节不同)。 -
未处理大小端(Endianness)问题。
-
-
解决方法:
-
使用相同字长的编译环境(如避免32位应用访问64位内核驱动)。
-
显式指定结构体对齐(如
__attribute__((packed))
),或通过compat_ioctl
处理兼容性。
-
4.5. 未正确处理阻塞/非阻塞操作
-
现象:
ioctl
调用卡死或无响应。 -
原因:
-
驱动中未正确处理阻塞型操作(如等待队列未唤醒)。
-
用户程序未设置非阻塞标志(
O_NONBLOCK
)。
-
-
解决方法:
-
检查驱动中是否实现阻塞/非阻塞逻辑(如
wait_event_interruptible
)。 -
用户程序打开设备时指定
O_NONBLOCK
标志。
-
4.6. 命令号冲突
-
现象:
ioctl
执行结果不符合预期。 -
原因:
-
自定义的
cmd
命令号与其他驱动冲突。 -
未遵循 Linux 的
ioctl
命令号编码规范。
-
-
解决方法:
-
使用
_IOC(dir, type, nr, size)
宏生成唯一命令号。 -
确保
type
(幻数)唯一,可通过内核文档或Documentation/ioctl/ioctl-number.txt
查询已使用的幻数。
-
4.7. 内存泄漏或竞态条件
-
现象:系统稳定性下降,偶发崩溃。
-
原因:
-
内核驱动中未正确释放临时分配的内存。
-
多线程/进程环境下未加锁保护共享资源。
-
-
解决方法:
-
使用
kmalloc
/kfree
配对管理内存。 -
在内核驱动中使用互斥锁(
mutex
)或信号量(semaphore
)。
-
4.8. 调试建议
-
用户空间调试:
-
使用
strace
跟踪ioctl
调用及错误码。 -
检查
errno
并查阅man 2 ioctl
文档。
-
-
内核空间调试:
-
在内核驱动中添加
printk
打印关键路径。 -
使用
dmesg
查看内核日志。
-
-
静态检查:
-
通过
sparse
工具检查命令号合法性。 -
使用静态分析工具(如 Coccinelle)。
-
4.9. 示例:正确构造 ioctl
命令
// 用户空间定义命令
#define MY_IOCTL_MAGIC 'k'
#define MY_IOCTL_CMD1 _IOR(MY_IOCTL_MAGIC, 1, int)
#define MY_IOCTL_CMD2 _IOW(MY_IOCTL_MAGIC, 2, struct my_data)// 内核驱动实现
long my_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {switch (cmd) {case MY_IOCTL_CMD1:// 从用户空间读取数据copy_from_user(&val, (int __user *)arg, sizeof(int));break;case MY_IOCTL_CMD2:// 向用户空间写入数据copy_to_user((struct my_data __user *)arg, &data, sizeof(data));break;default:return -ENOTTY;}return 0;
}
五、总结
综上所述,在嵌入式 Linux 应用开发中,ioctl
函数是一个非常重要的系统调用,为用户空间程序和内核空间驱动程序之间提供了一种灵活的交互机制,允许用户空间程序向内核空间的设备驱动程序发送各种控制命令,以实现设备的特定操作。
六、参考文献
- 《Linux 设备驱动开发详解:基于最新的 Linux 4.0 内核》
- 作者:宋宝华
- 简介:本书全面深入地讲解了 Linux 设备驱动开发的各个方面,其中包含对
ioctl
函数的详细介绍。书中不仅有理论知识,还配有丰富的实例代码,帮助读者理解如何在实际开发中使用ioctl
函数实现用户空间与内核空间的交互。通过学习书中的内容,可以掌握ioctl
函数在不同类型设备驱动(如字符设备、块设备等)中的应用方法。
- 《Linux 内核设计与实现(第 3 版)》
- 作者:Robert Love
- 简介:这是一本经典的 Linux 内核书籍,对 Linux 内核的各个子系统进行了详细的讲解。其中关于设备驱动和系统调用的章节涉及到
ioctl
函数的底层原理和实现机制。通过阅读本书,可以了解ioctl
函数在 Linux 内核中的工作流程,以及它与其他系统调用和内核组件之间的关系,有助于从更宏观的角度理解ioctl
函数。
- 《深入理解 Linux 内核(第 3 版)》
- 作者:Daniel P. Bovet、Marco Cesati
- 简介:本书深入剖析了 Linux 内核的内部结构和工作原理,对
ioctl
函数的实现细节和相关的数据结构进行了详细的阐述。通过阅读本书,可以深入了解ioctl
函数在 Linux 内核中的具体实现方式,以及它在不同内核版本中的演变,为开发高性能、稳定的嵌入式 Linux 应用提供理论支持。
- Linux 内核官方文档
- 地址:Linux Kernel Documentation
- 简介:Linux 内核官方文档是学习 Linux 内核开发的权威资料。其中包含了关于设备驱动开发、系统调用等方面的详细文档,对
ioctl
函数的使用方法、request
命令的定义规则等都有明确的说明。通过阅读官方文档,读者可以获取最准确、最新的关于ioctl
函数的信息。
- The Linux Documentation Project(TLDP)
- 地址:The Linux Documentation Project
- 简介:TLDP 是一个致力于提供 Linux 文档资源的项目,其中包含了大量关于 Linux 编程和开发的教程和文档。在设备驱动开发相关的文档中,对
ioctl
函数有较为详细的介绍和示例代码。这些文档适合不同水平的开发者阅读,从初学者到有一定经验的开发者都能从中获取有用的信息。
- Linux 内核源代码
- 地址:kernel/git/stable/linux.git - Linux kernel stable tree
- 简介:直接查看 Linux 内核源代码是学习
ioctl
函数的最佳方式之一。在内核源代码中,有大量使用ioctl
函数的示例,涵盖了各种类型的设备驱动。通过阅读这些代码,读者可以了解不同设备驱动中ioctl
函数的具体实现和应用场景,学习到优秀的编程实践和设计模式。
- 一些开源的嵌入式 Linux 项目:如 Buildroot、Yocto Project 等,这些项目中包含了丰富的设备驱动和应用程序代码,其中也会涉及到
ioctl
函数的使用。通过研究这些项目的代码,可以了解ioctl
函数在实际项目中的应用方式和最佳实践。
相关文章:
【嵌入式Linux应用开发基础】ioctl函数
目录 一、概述 1.1. ioctl 的功能 1.2. 函数原型 1.3. 参数说明 1.4. 返回值 1.5. request 命令的定义 二、典型应用场景 2.1. 串口通信控制 2.2. 网络设备配置与管理 2.3. 字符设备控制 2.4. 块设备管理 2.5. 多媒体设备控制 三、关键注意事项 3.1. request 命令…...
开源的轻量级分布式文件系统FastDFS
FastDFS 是一个开源的轻量级分布式文件系统,专为高性能的分布式文件存储设计,主要用于解决海量文件的存储、同步和访问问题。它特别适合以中小文件(如图片、视频等)为载体的在线服务,例如相册网站、视频网站等。 FastD…...
从VGG到Transformer:深度神经网络层级演进对模型性能的深度解析与技术实践指南
一、技术原理(数学公式示意图) 1. 层深与模型容量关系 数学表达:根据Universal Approximation Theorem,深度网络可表达复杂函数: f ( x ) f L ( f L − 1 ( ⋯ f 1 ( x ) ) ) f(x) f_L(f_{L-1}(\cdots f_1(x))) f…...
深入了解 Oracle 正则表达式
目录 深入了解 Oracle 正则表达式一、正则表达式基础概念二、Oracle 正则表达式语法(一)字符类(二)重复限定符(三)边界匹配符(四)分组和捕获 三、Oracle 正则表达式函数(…...
机器学习-监督学习
1. 定义与原理 监督学习依赖于标记数据(即每个输入样本都对应已知的输出标签),模型通过分析这些数据中的规律,建立从输入特征到目标标签的映射函数。例如,在垃圾邮件检测中,输入是邮件内容,输出…...
Leetcode:学习记录
一、滑动窗口 1. 找出数组中元素和大于给定值的子数组的最小长度 右指针从左到右遍历,在每个右指针下,如果去掉左边元素的元素和大于等于给定值则左指针右移一次,直到小于给定值,右指针右移一个。 2.找到乘积小于给定值的子数组…...
探索顶级汽车软件解决方案:驱动行业变革的关键力量
在本文中,将一同探索当今塑造汽车行业的最具影响力的软件解决方案。从设计到制造,软件正彻底改变车辆的制造与维护方式。让我们深入了解这个充满活力领域中的关键技术。 设计软件:创新车型的孕育摇篮 车辆设计软件对于创造创新型汽车模型至…...
AI前端开发:解放创造力,而非取代它
近年来,人工智能技术飞速发展,深刻地改变着各行各业,前端开发领域也不例外。越来越多的AI写代码工具涌现,为开发者带来了前所未有的效率提升。很多人担心AI会取代程序员的创造力,但事实并非如此。本文将探讨AI辅助前端…...
探讨使用ISVA代替“Open Liberty使用指南及微服务开发示例”中日志审计功能
在Open Liberty使用指南及开发示例(四)一文开始日志审计功能占有了一定的开发工作量,那么是否可以使用IBM Security Verify Access(ISVA)代替以节省开发工作?如果可行,那么以后各类应用的日志审…...
log4j2日志配置文件
log4j2配置文件每个项目都会用到,记录一个比较好用的配置文件,方便以后使用时调取,日志输出级别为debug,也可以修改 <?xml version"1.0" encoding"UTF-8"?> <Configuration monitorInterval"180" packages""><prope…...
python专栏导读
由于本人非python工程师,是在自学python,所以本专栏的内容会显得很基础,甚至有些内容在python工程师看来实在太过于简单,在此清楚嘲笑,因为毕竟每个人都是从不懂、从基础开始的。 本篇作为导读和目录形式存在…...
Ollama与Vllm使用对比与优劣
Ollama和vLLM是两个用于优化大型语言模型(LLM)推理的框架,它们在性能、资源利用率、部署复杂性等方面各有优劣。以下是对这两个框架的详细介绍: 1. Ollama Ollama是一个轻量级且易于使用的框架,旨在简化大型语言模型…...
K8s之存储卷
一、容忍、crodon和drain 1.容忍 即使节点上有污点,依然可以部署pod。 字段:tolerations 实例 当node01上有标签test11,污点类型为NoSchedule,而node02没有标签和污点,此时pod可以在node01 node02上都部署,…...
luoguP8764 [蓝桥杯 2021 国 BC] 二进制问题
luogu题目传送门 题目描述 小蓝最近在学习二进制。他想知道 1 到 N 中有多少个数满足其二进制表示中恰好有 K 个 1。你能帮助他吗? 输入格式 输入一行包含两个整数 N 和 K。 输出格式 输出一个整数表示答案。 输入输出样例 输入 #1 7 2 输出 #1 3 说明/提示 对于…...
本地部署DeepSeek后的调用与删除全攻略
在本地成功部署DeepSeek模型后,如何高效调用它发挥其强大功能,以及在不需要时妥善删除,是很多用户关注的重点。我也在后台接到了很多粉丝的留言,询问 DeepSeek 本地部署之后的一些调用和删除的问题,于是我在网上找了现…...
Qt Designer菜鸟使用教程(实现一个本地英文翻译软件)
1 安装Qt Designer 安装这个包的时候会自带安装 Qt Designer, 安装目录为python的安装根目录的 Lib/site-packages/qt5_applications/Qt/bin 目录下。 pip install pyqt5-tools2 新建窗体 2.1 新建主窗体 创建之后如下图: 设置主窗口大小: 设置窗…...
C++ 洗牌函数std::shuffle的用法
目录 1.简介 2.工作原理 3.std::shuffle 与 std::random_shuffle 的区别 4.rand 和 srand 5.std::shuffle 的使用方法 6.随机数生成器和分布器 7.注意事项 1.简介 std::shuffle 是 C 标准库中用于对序列进行随机重排(洗牌)的一种算法。它可以将容…...
MySQL InnoDB引擎 MVCC
MVCC(Multi-Version Concurrency Control)即多版本并发控制,是 MySQL 的 InnoDB 存储引擎实现并发控制的一种重要技术。它在很多情况下避免了加锁操作,从而提高了数据库的并发性能。 一、原理 MVCC 的核心思想是通过保存数据在某…...
【Elasticsearch】simple_query_string
Elasticsearch 的simple_query_string查询是一种灵活且容错性较强的查询方式,它允许用户通过简单的语法构造查询字符串,以实现对文档的搜索。以下是关于simple_query_string查询的详细说明: 1.基本概念 simple_query_string查询是一种基于字…...
数据结构 04
4. 栈 4.2. 链式栈 4.2.1. 特性 逻辑结构:线性结构 存储结构:链式存储结构 操作:创建,入栈,出栈,清空,获取 4.2.2. 代码实现 头文件 LinkStack.h #ifndef __LINKSTACK_H__ #define __LINKST…...
Java并发中的上下文切换、死锁、资源限制
在Java并发编程中,上下文切换、死锁和资源限制是开发者经常需要面对的问题。这些问题不仅会影响程序的性能,还可能导致程序无法正常运行。本文将深入探讨这些问题的原理、影响以及如何在实际开发中避免或解决它们。 目录 1. 上下文切换(Con…...
DeepSeek教unity------MessagePack-01
MessagePack是C# 的极速 MessagePack 序列化器。它比 MsgPack-Cli 快 10 倍,并且性能超过其他 C# 序列化器。MessagePack for C# 还内置支持 LZ4 压缩——一种极其快速的压缩算法。性能在诸如游戏、分布式计算、微服务或数据缓存等应用中尤为重要。 这个库通过 NuGe…...
【大语言模型】最新ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模等科研应用
ChatGPT、DeepSeek等大语言模型助力科研应用 随着人工智能技术的快速发展,大语言模型如ChatGPT和DeepSeek在科研领域的应用正在为科研人员提供强大的支持。这些模型通过深度学习和大规模语料库训练,能够帮助科研人员高效地筛选文献、生成论文内容、进行数…...
泰勒公式推导以及常用展开式与近似计算
泰勒公式的基本思想是通过函数在某点的导数来逐渐构建一个多项式,该多项式能够近似函数在该点附近的值。我们通过一次次引入导数来改进近似,从而得到一个无限级数的展开。 准备工作:函数的定义和导数 假设我们有一个函数 f ( x ) f(x) f(x)…...
深入解析A2DP v1.4协议:蓝牙高质量音频传输的技术与实现
1. A2DP概述 A2DP(Advanced Audio Distribution Profile)是一种高质量音频流媒体协议,旨在实现高质量音频内容的分发,通常用于通过蓝牙设备传输音频数据,例如将音乐从便携式播放器传输到耳机或扬声器。与传统的蓝牙语…...
STM32引脚VBAT和RTC的关系
一、RTC简介 1、RTC (Real Time Clock):实时时钟。RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。RTC还包含用于管理低功耗模式的自动唤醒单…...
untiy 3d 混合动画
1.创建动画控制器 挂在到人物模型上 效果 20250213_170924...
django配置跨域
1、第一种 from django.views.decorators.csrf import csrf_exemptcsrf_exempt第二种 安装 pip install django-cors-headers在配置文件settings.py进入 INSTALLED_APPS [..."corsheaders", # 添加 ]MIDDLEWARE [corsheaders.middleware.CorsMiddleware, # 添加…...
【设计模式】【行为型模式】迭代器模式(Iterator)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
前端面试题目---页面抖动的原因、如何避免、如何解决
前端页面抖动是一个常见且影响用户体验的问题,下面将从抖动发生的场景、解决办法以及预防措施三个方面进行详细阐述。 页面抖动发生的场景 1. 元素尺寸动态变化 图片加载:当页面中图片的宽高没有预先设定,在图片加载完成后,其实…...
DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?
随着人工智能技术的飞速发展,大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世,为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲!!! 目录 一、…...
将Sqlite3数据库挂在内存上处理
创作灵感:最近把小学生的口算题从2位数改到3位数,100以内四则运算练习(千纬数学)再次更新,选取难题-CSDN博客要不断刷题目,以前100以内的加减乘除也是这样刷出来的,代码如下: impor…...
#用于跟踪和反映数据源对象的变化--useMagical
import { cloneDeep } from lodash-es import { reactive, ref, watchEffect } from vue /*** 神奇函数* param source 数据源,* param initKey 固定需要返回的属性* description 收集数据源中修改的属性,并返回* version 1.0 仅支持对象* author sufei* return { source, resu…...
基于微信小程序的场地预约设计与实现
第3章 系统设计 3.1系统设计目标 本系统的实现可以帮助体育馆场地信息的管理。帮助管理员对注册用户管理以及用户预约管理。同时可以帮助用户进行场地预约。本系统可以实现用户足不出户预约到需要的场地,为用户提供场地信息了解的平台。 3.2系统功能结构图 本系统的…...
1446. 连续字符 简单
1446. 连续字符https://leetcode.cn/problems/consecutive-characters/ 给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。 请你返回字符串 s 的 能量。 示例 1: 输入:s "leetcode"…...
多张图片合成PDF
昨天接了一个家教,在网上搜集了一些图片格式的素材,但想要发给学生家长打印,都是图片格式可能不太方便,就想着合成pdf文件之后再发给家长。 试用了“samll*”一次,就需要充值vip了,所以就用python自己写了…...
【办公】钉钉修改默认存储位置,释放C盘空间
Step1: 右击钉钉图标选择设置 Step2: 通用里面找到文件保存位置,修改文件目录: 最新版本钉钉界面: 设置完成后按提示重启即可!...
VLLM历次会议(2024.7)
支持LLama3.1: 量化: vllm git下的子项目:llm-compressor CPU offloading 允许跑更大的模型;会变慢些;在CPU-GPU之间有NVLink的机器上,变慢的幅度小。 新增对Medusa(用1个Head并行推出好几个…...
进程等待与进程替换
目录 一、进程等待 1.1 为什么要等待子进程? 1.2 等待的两种方式 1.2.1 wait函数 1.2.2 waitpid函数 1.3 获取子进程的退出状态 1.4 示例代码 阻塞式等待(同步) 非阻塞等待(异步) 二、进程替换 2.1 什么是进…...
C# CultureInfo 地区影响字符串
问题 线上遇到有玩家资源加载异常,发现资源路径出现异常字符: 发现是土耳其语下字符串转小写不符合预期: "I".ToLower() -> ı 解决方案 String.ToLower 改成 String.ToLowerInvariant 全局修改禁用文化差异:ht…...
走进 Tcl 语言:历史、特性与应用
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...
CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测,光伏功率预测
代码地址:CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测,光伏功率预测 CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测,光伏功率预测 一、引言 1、研究背景和意义 光伏发电作为可再生能源的重要组成部分,近…...
使用MaxKB及deepseek搭建本地AI知识库
序 本文主要研究一下如何MaxKB及deepseek搭建本地AI知识库 步骤 拉取MaxKB镜像 docker pull cr2.fit2cloud.com/1panel/maxkb如果拉取不下来就用docker.1ms.run/1panel/maxkb 启动MaxKB docker run -d --namemaxkb --restartalways -p 8080:8080 \ -v ~/.maxkb:/var/lib/p…...
一文通俗理解为什么需要泛型以及泛型的使用
为什么需要泛型? public static void main(String[] args) {ArrayList list new ArrayList();// 由于集合没有做任何限定,任何类型都可以给其中存放list.add("abc");list.add("def");list.add(5);Iterator it list.iterator();wh…...
凸包算法—— cad c#二次开发
效果如下: 代码如下: using IfoxDemo; //[assembly: CommandClass(typeof(IFoxDemo.凸包class))]//只允许此类快捷键命令 namespace IFoxDemo {public class 凸包class{public static class 凸包助手{/// <summary>/// 计算点集的凸包并返回多段线…...
Eclipse JSP/Servlet 深入解析
Eclipse JSP/Servlet 深入解析 引言 随着互联网的快速发展,Java Web开发技术逐渐成为企业级应用开发的主流。在Java Web开发中,JSP(JavaServer Pages)和Servlet是两个核心组件,它们共同构成了Java Web应用程序的基础。本文将深入解析Eclipse平台下的JSP/Servlet技术,帮…...
grep如何排除多个目录?
在使用 grep 进行文本搜索时,有时候需要排除多个目录,避免在这些目录下进行搜索。下面介绍几种不同的实现方式。 目录 1.使用 -r 和 --exclude-dir 选项(GNU grep) 2.使用扩展正则表达式和 -P 选项(GNU grep&#x…...
linux ollama deepseek等大语言模型的model文件的存储目录
linux ollama deepseek等大语言模型的model文件的存储目录 一、用ollama serve启动的,模型数据存放在: /usr/share/ollama/.ollama/models二、如果在自启动文件中指定了工作目录,则在工作目录下的.ollama/models 1.自启动服务 /etc/system…...
React进阶之React核心源码解析(二)
React核心源码解析 diff单一节点比较diff多节点比较diff两轮遍历比较第一轮比较第二轮比较 Update 状态更新Concurrent Mode diff 一共两个阶段 render:内存中的更新,主要是通过递归的过程,来将react变化的部分,在内存中找到哪些…...
八、OSG学习笔记-
前一章节: 七、OSG学习笔记-碰撞检测-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145558132?spm1001.2014.3001.5501 一、了解OSG图元加载显示流程 本章节代码: OsgStudy/wids CuiQingCheng/OsgStudy - 码云 - 开源中国https:…...