C语言错误处理之<errno.h>与<error.h>

news2024/11/27 18:30:01

目录

前言 

错误号处理方式

errno.h头文件

常见的宏

error.h头文件

参数解释:

关于的”__attribute__“解释:

关于“属性”的解释:

实例一:

实例二:

error.h与errno.h的区别

补充内容:


前言 

在开始学习之前,先向各位推荐c和c++指令手册的官方网站:C语言|C++中文网 (c-cpp.com)

        其次关于C语言的错误处理一共分为三个部分:错误号处理方式、断言处理方式、边界检查方式,我们将这三部分分为三篇文章来写......

错误号处理方式

errno.h头文件

文件说明:是一个标准C库头文件

内容:声明了一个用于存储错误码(1、2、3等数字)的整型全局变量errno ,并定义了一组与错误码相关的宏(EACCESEINVALENOMEM 等)

功能:通过检查errno的值,可以确定先前执行的函数或调用操作是否成功,若值为0则成功,若不为0则失败

基本使用步骤:

  1. 包含头文件:首先,在程序中包含 <errno.h> 头文件以访问相关内容

  2. 调用可能出错的函数:调用可能会产生错误并设置 errno 值的系统调用或库函数。例如,打开文件失败时会设置相应的错误码到 errno

  3. 检查和处理错误:在函数调用之后,我们可以通过检查 `errno' 的值来判断是否发生了特定类型或代码所代表的出错情况。如果发现有误,则根据需要采取适当措施进行异常处理、报告或修复

下面两个示例演示了如何使用errno反应函数操作是否成功的情况:

函数操作失败:打印errno的值为2,利用sterror函数接收errno的值并打印出具体的问题

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main() {
    FILE* file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        printf("Error opening file. Errno: %d\n", errno);
        // 或者使用 strerror 函数打印对应的错误描述信息
        printf("Error message: %s\n", strerror(errno));
    }

    return 0;
}

函数操作成功:打印errno的值为0,利用sterror函数接收errno的值并打印出不存在问题

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main() {
    FILE* file = fopen("nonexistent.txt", "r");
    if (file != NULL) {
        printf("Error opening file. Errno: %d\n", errno);
        // 或者使用 strerror 函数打印对应的错误描述信息
        printf("Error message: %s\n", strerror(errno));
    }

    return 0;
}

常见的宏

每个定义于 <errno.h> 的宏都可以展开成 int 类型的整数常量表达式,并且拥有独立的正整数值。下列常量得到定义(实际可以定义更多,只要以 'E' 开始,后随数字或大写字母):

定义于头文件 <errno.h>中的常见宏

EDOM

函数参数超出范围,例如:sqrt(-1)

EILSEQ

(C95)

不合法的字符顺序,例如:wcstombs(str, L"\xffff", 2)

ERANGE

函数结果超出范围,例如:strtol("0xfffffffff",NULL,0)

error.h头文件

一般情况下,在VS中使用该头文件需要下载GUN C库

文件说明:是一个 GNU C 库(glibc)中的头文件

内容:该头文件声明了扩展错误处理函数和相关宏,其中最常见且重要的是eror和error_at_line函数,这些函数允许以类似于格式化字符串输出 (printf) 的方式生成自定义格式或包含更多详细信息(如源代码位置等)的出错消息

功能:生成自定义格式或包含更多详细信息的出错消息

error.h头文件中包含了两个函数:

​
//error()函数
extern void error (int __status, int __errnum, const char *__format, ...)
        __attribute__ ((__format__ (__printf__, 3, 4)));

//error_at_line()函数
extern void error_at_line (int __status, int __errnum, const char *__fname, unsigned int __lineno, const char *__format, ...)
        __attribute__ ((__format__ (__printf__, 5, 6)));

​

参数解释:

  • _status:状态码,代表整体程序/调用者关心是否成功执行,零表示成功,非零表示不成功,

状态码可以自定义,也可以是约定好的标准状态码,一些常见的标准错误码包括:

!不推荐自定义!

  • 1:一般性未知错误
  • 2:误用 shell 命令时引起不支持选项等
  • 126:命令不可执行(例如权限问题)
  • 127:没有找到命令
  • 128 + N(N为信号编号):由于收到信号而导致进程终止
  • _errnum:错误码,代表具体某次操作所产生/涉及到/引发了什么样类型和内容方面问题(一般都用errno的值表示)
  • _format:格式化字符串和可变数量的参数,用于打印出错消息
  • _fname:包含出错位置信息(如源代码文件名)作为字符串常量(系统自动添加)
  • _lineno:包含出错位置信息(如源代码行号)作为无符号整数值(系统自动添加)

关于的”__attribute__“解释:

内容说明:是一种 GNU C 扩展属性

作用:告诉编译器函数的参数列表和格式字符串之间的关系,以便进行编译时的格式检查

参数解释:__format__ 是一个特殊属性名称,后面跟着两个整数值:第一个整数表示从第几个参数开始是格式字符串(通常是形如 printf() 或 scanf() 的函数中的第一个可变参数),第二个整数表示从该位置开始应用类型检查:

void my_printf(const char *fmt, ...) __attribute__((__format__(__printf__, 1, 2)));

        上述代码定义了一个名为my_printf的函数,并使用了该属性。其中 "fmt" 参数是作为格式字符串使用(即模拟类似于标准库函数 printf() 的行为)。数字 "1" 表示 "fmt" 参数在参数列表中位于索引位置1 (从0开始计算),而数字 "2" 表示类型检查应该从索引位置2 开始应用。即打印时先打印fmt后面的内容再打印fmt的内容

        通过将此属性添加到函数声明或定义上,编译器可以对调用该函数时传递给它们的实际参数与预期的格式进行比较,并发出警告或错误消息以帮助捕获潜在的格式错误。

关于“属性”的解释:

        在 C 语言中,属性是用于向编译器提供额外信息或指示的机制。它们以特殊的语法形式出现,并通过将属性应用于声明或定义来修改其行为或注释代码。

实例一:

//使用<error.h>头文件中的error函数
#define _GNU_SOURCE  // 需要包含此宏定义以启用 glibc 扩展功能
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

void process_data(int value) 
{
    if (value < 0) 
    {
        error(EXIT_FAILURE, errno, "Invalid value: %d", value);
    } //error(-1,建议使用errno,“如何显示提示信息可以自定义比如:File error:”,%d对应的值)
    
    // 处理数据...
}

int main() {
    int data = -1;
    
    process_data(data);
    
    return 0;
}
//输出结果
Invalid value: %d: Invalid argument

其实如果想要将输出结果格式化的话可以这样描述:

<自定义错误消息>: <变量值>: <与错误码相关的具体描述信息>

至于状态码的值,一般来说都会取非零值

实例二:

//使用<error.h>头文件中的error_at_line函数
//使用error_at_line()实现在即显示错误原因的同时又显示行号
#define _GNU_SOURCE  // 需要包含此宏定义以启用 glibc 扩展功能
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <error.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        error_at_line(errno, errno, __FILE__, __LINE__, "Failed to open file");
    }

    // 其他操作...

    fclose(file);
    
    return 0;
}
//输出结果
./example: Failed to open file: No such file or directory (Error 2) at example.c:11

其实如果想要将输出结果格式化的话可以这样描述:

<当前程序的名称> :<自定义错误信息> : <错误码对应信息> (错误码) at <当前程序名> : 问题行号

error.h与errno.h的区别

  • <errno.h> 提供了全局变量和宏来处理基本级别(底层)上发生的各种系统和库函数调用产生额外信息
  • <error.h> 则提供了更高级别、灵活性更强的错误处理函数和宏,用于生成自定义格式或包含更多详细信息的出错消息。需要注意的是,<error.h> 是 GNU C 特定库(glibc)提供的功能,在其他平台或编译器环境中可能不存在或有不同实现。因此,在使用时应谨慎考虑可移植性和目标平台兼容性
  • <error.h> 头文件提供了一些高级别且更灵活的错误处理函数,如 error 和 error_at_line这些函数可以用于生成自定义格式或包含更多详细信息的出错消息。然而,在实际开发中,通常会使用 <errno.h> 头文件中定义的 errno 全局变量和相关宏来报告和处理错误。这是因为标准库函数在执行失败时会将适当的错误码设置到 errno 变量,并且许多库函数都依赖于该机制使用 errno 的好处是它提供了一种统一、标准化的方式来表示和传递错误信息。通过查阅 <errno.h> 中定义的宏,可以获得与特定错误代码对应的文本描述,并根据需要进行相应处理。虽然自定义状态码或其他高级别方法可能具有更大灵活性和扩展性,直接使用errno是最常见、最简单并与现有代码兼容度较高的方式

补充内容:

1~34号错误码在Linux中的/usr/include/asm-generic/errno-base.h目录下,使用cat指令查看:

#define EPERM 1 /*不允许操作*/
#define EPERM 1 /* Operation not permitted */

#define ENOENT 2 /*没有这样的文件或目录*/
#define ENOENT 2 /* No such file or directory */

#define ESRCH 3 /* 没有这样的进程 */
#define ESRCH 3 /* No such process */

#define EINTR 4 /*中断的系统调用*/
#define EINTR 4 /* Interrupted system call */

#define EIO 5 /* I/O错误*/
#define EIO 5 /* I/O error */

#define ENXIO 6 /*没有这样的设备或地址*/
#define ENXIO 6 /* No such device or address */

#define E2BIG 7 /* Arg list太长*/
#define E2BIG 7 /* Arg list too long */

#define ENOEXEC 8 /*执行格式错误*/
#define ENOEXEC 8 /* Exec format error */

#define EBADF 9 /*错误的文件号*/
#define EBADF 9 /* Bad file number */

#define ECHILD 10 /*没有子进程*/
#define ECHILD 10 /* No child processes */

#define EAGAIN 11 /*重试*/
#define EAGAIN 11 /* Try again */

#define ENOMEM 12 /*内存不足*/
#define ENOMEM 12 /* Out of memory */

#define EACCES 13 /*权限被拒绝*/
#define EACCES 13 /* Permission denied */

#define EFAULT 14 /*错误地址*/
#define EFAULT 14 /* Bad address */

#define ENOTBLK 15 /*需要的块设备*/
#define ENOTBLK 15 /* Block device required */

#define EBUSY 16 /*设备或资源忙*/
#define EBUSY 16 /* Device or resource busy */

#define EEXIST 17 /*文件存在*/
#define EEXIST 17 /* File exists */

#define EXDEV 18 /*跨设备链接*/
#define EXDEV 18 /* Cross-device link */

#define ENODEV 19 /*没有这样的设备*/
#define ENODEV 19 /* No such device */

#define ENOTDIR 20 /*不是一个目录*/
#define ENOTDIR 20 /* Not a directory */

#define EISDIR 21 /*是一个目录*/
#define EISDIR 21 /* Is a directory */

#define EINVAL 22 /*无效参数*/
#define EINVAL 22 /* Invalid argument */

#define ENFILE 23 /*文件表溢出*/
#define ENFILE 23 /* File table overflow */

#define EMFILE 24 /*打开的文件太多*/
#define EMFILE 24 /* Too many open files */

#define ENOTTY 25 /*不是打字机*/
#define ENOTTY 25 /* Not a typewriter */

#define ETXTBSY 26 /*文本文件繁忙*/
#define ETXTBSY 26 /* Text file busy */

#define EFBIG 27 /*文件太大*/
#define EFBIG 27 /* File too large */

#define ENOSPC 28 /*设备上没有空格*/
#define ENOSPC 28 /* No space left on device */

#define ESPIPE 29 /*非法查找*/
#define ESPIPE 29 /* Illegal seek */

#define EROFS 30 /*只读文件系统*/
#define EROFS 30 /* Read-only file system */

#define EMLINK 31 /*链接太多*/
#define EMLINK 31 /* Too many links */

#define EPIPE 32 /*破裂的管道*/
#define EPIPE 32 /* Broken pipe */

#define EDOM 33 /*数学参数的域的func */
#define EDOM 33 /* Math argument out of domain of func */

#define ERANGE 34 /*数学结果不可表示*/
#define ERANGE 34 /* Math result not representable */

35~134号错误码在Linxu中的/usr/include/asm-generic/errno.h目录下,使用cat指令查看: 

#define EDEADLK 35 /*将发生资源死锁*/
#define EDEADLK 35 /* Resource deadlock would occur */

#define ENAMETOOLONG 36 /*文件名太长*/
#define ENAMETOOLONG 36 /* File name too long */

#define ENOLCK 37 /*没有可用的记录锁*/
#define ENOLCK 37 /* No record locks available */

#define ENOSYS 38 /*函数未实现*/
#define ENOSYS 38 /* Function not implemented */

#define ENOTEMPTY 39 /*目录不为空*/
#define ENOTEMPTY 39 /* Directory not empty */

#define ELOOP 40 /*遇到太多符号链接*/
#define ELOOP 40 /* Too many symbolic links encountered */

#define EWOULDBLOCK EAGAIN /*操作将阻塞*/
#define EWOULDBLOCK EAGAIN /* Operation would block */

#define ENOMSG 42 /*没有指定类型的消息*/
#define ENOMSG 42 /* No message of desired type */

#define EIDRM 43 /*标识符删除*/
#define EIDRM 43 /* Identifier removed */

#define ECHRNG 44 /*通道号超出范围*/
#define ECHRNG 44 /* Channel number out of range */

#define EL2NSYNC 45 /* 2级未同步 */
#define EL2NSYNC 45 /* Level 2 not synchronized */

#define EL3HLT 46 /* 3级停止 */
#define EL3HLT 46 /* Level 3 halted */

#define EL3RST 47 /* 3级复位*/
#define EL3RST 47 /* Level 3 reset */

#define ELNRNG 48 /*链路数超出范围*/
#define ELNRNG 48 /* Link number out of range */

#define EUNATCH 49 /*协议驱动程序未连接*/
#define EUNATCH 49 /* Protocol driver not attached */

#define ENOCSI 50 /*没有CSI结构可用*/
#define ENOCSI 50 /* No CSI structure available */

#define EL2HLT 51 /*二级暂停*/
#define EL2HLT 51 /* Level 2 halted */

#define EBADE 52 /*无效的交换*/
#define EBADE 52 /* Invalid exchange */

#define EBADR 53 /*无效请求描述符*/
#define EBADR 53 /* Invalid request descriptor */

#define EXFULL 54 /* 完整交换 */
#define EXFULL 54 /* Exchange full */

#define ENOANO 55 /*无阳极*/
#define ENOANO 55 /* No anode */

#define EBADRQC 56 /*无效请求码*/
#define EBADRQC 56 /* Invalid request code */

#define EBADSLT 57 /*无效槽位*/
#define EBADSLT 57 /* Invalid slot */

#define EDEADLK
#define EDEADLOCK EDEADLK

#define EBFONT 59 /*错误的字体文件格式*/
#define EBFONT 59 /* Bad font file format */

#define ENOSTR 60 /*设备不是流*/
#define ENOSTR 60 /* Device not a stream */

#define ENODATA 61 /*没有可用的数据*/
#define ENODATA 61 /* No data available */

#define ETIME 62 /* 计时器过期 */
#define ETIME 62 /* Timer expired */

#defien ENOSR 63 /*流出流资源*/
#define ENOSR 63 /* Out of streams resources */

#define ENONET 64 /*机器不在网络上*/
#define ENONET 64 /* Machine is not on the network */

#define ENOPKG 65 /*未安装的包*/
#define ENOPKG 65 /* Package not installed */

#define EREMOTE 66 /*对象是远程*/
#define EREMOTE 66 /* Object is remote */

#define ENOLINK 67 /*链接已被切断*/
#define ENOLINK 67 /* Link has been severed */

#define EADV 68 /*发布错误*/
#define EADV 68 /* Advertise error */

#define ESRMNT 69 /* Srmount错误*/
#define ESRMNT 69 /* Srmount error */

#define ECOMM 70 /*发送通信错误*/
#define ECOMM 70 /* Communication error on send */

#define EPROTO 71 /*协议错误*/
#define EPROTO 71 /* Protocol error */

#define EMULTIHOP 72 /*尝试多跳*/
#define EMULTIHOP 72 /* Multihop attempted */

#define EDOTDOT 73 /* RFS特定错误*/
#define EDOTDOT 73 /* RFS specific error */

#define EBADMSG 74 /*不是数据消息*/
#define EBADMSG 74 /* Not a data message */

#define EOVERFLOW 75 /*对于定义的数据类型,值太大*/
#define EOVERFLOW 75 /* Value too large for defined data type */

#define ENOTUNIQ 76 /*名称在网络上不是唯一的*/
#define ENOTUNIQ 76 /* Name not unique on network */

#define EBADFD 77 /*坏状态的文件描述符*/
#define EBADFD 77 /* File descriptor in bad state */

#define EREMCHG 78 /*远程地址更改*/
#define EREMCHG 78 /* Remote address changed */

#define ELIBACC 79 /*不能访问所需的共享库*/
#define ELIBACC 79 /* Can not access a needed shared library */

#define ELIBBAD 80 /*访问一个损坏的共享库*/
#define ELIBBAD 80 /* Accessing a corrupted shared library */

#define ELIBSCN 81 /* .lib section in a.out已损坏*/
#define ELIBSCN 81 /* .lib section in a.out corrupted */

#define ELIBMAX 82 /*试图链接过多的共享库*/
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */

#define ELIBEXEC 83 /* 不能直接执行共享库*/
#define ELIBEXEC 83 /* Cannot exec a shared library directly */

#define EILSEQ 84 /*非法字节序列*/
#define EILSEQ 84 /* Illegal byte sequence */

#define ERESTART 85 /*中断的系统调用应该重启*/
#define ERESTART 85 /* Interrupted system call should be restarted */

#define ESTRPIPE 86 /*流管道错误*/
#define ESTRPIPE 86 /* Streams pipe error */

#define EUSERS 87 /*用户过多*/
#define EUSERS 87 /* Too many users */

#define ENOTSOCK 88 /*非套接字的套接字操作*/
#define ENOTSOCK 88 /* Socket operation on non-socket */

#define EDESTADDRREQ 89 /*需要的目的地址*/
#define EDESTADDRREQ 89 /* Destination address required */

#define EMSGSIZE 90 /*消息太长*/
#define EMSGSIZE 90 /* Message too long */

#define EPROTOTYPE 91 /*协议类型错误的套接字*/
#define EPROTOTYPE 91 /* Protocol wrong type for socket */

#define ENOPROTOOPT 92 /*协议不可用*/
#define ENOPROTOOPT 92 /* Protocol not available */

#define EPROTONOSUPPORT 93 /*不支持协议*/
#define EPROTONOSUPPORT 93 /* Protocol not supported */

#define ESOCKTNOSUPPORT 94 /* Socket类型不支持*/
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */

#define EOPNOTSUPP 95 /*不支持传输端点上的操作*/
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */

#define EPFNOSUPPORT 96 /*不支持协议族*/
#define EPFNOSUPPORT 96 /* Protocol family not supported */

#define EAFNOSUPPORT 97 /*协议不支持的地址族
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */

#define EADDRINUSE 98 /*地址已被使用*/
#define EADDRINUSE 98 /* Address already in use */

#define EADDRNOTAVAIL 99 /*无法分配请求的地址*/
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */

#define ENETDOWN 100 /*网络关闭*/
#define ENETDOWN 100 /* Network is down */

#define ENETUNREACH 101 /*网络不可达*/
#define ENETUNREACH 101 /* Network is unreachable */

#define ENETRESET 102 /*由于复位导致网络连接断开*/
#define ENETRESET 102 /* Network dropped connection because of reset */

#define ECONNABORTED 103 /*软件导致的连接中止*/
#define ECONNABORTED 103 /* Software caused connection abort */

#define ECONNRESET 104 /*连接复位*/
#define ECONNRESET 104 /* Connection reset by peer */

#define ENOBUFS 105 /*没有可用的缓冲区空间*/
#define ENOBUFS 105 /* No buffer space available */

#define EISCONN 106 /*传输端点已经连接*/
#define EISCONN 106 /* Transport endpoint is already connected */

#define ENOTCONN 107 /*传输端点未连接*/
#define ENOTCONN 107 /* Transport endpoint is not connected */

#define eshudown108 /*在传输端点关闭后不能发送*/
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */

#define ETOOMANYREFS 109 /*引用太多:无法拼接*/
#define ETOOMANYREFS 109 /* Too many references: cannot splice */

#define ETIMEDOUT 110 /*连接超时*/
#define ETIMEDOUT 110 /* Connection timed out */

#define ECONNREFUSED 111 /*拒绝连接*/
#define ECONNREFUSED 111 /* Connection refused */

#define EHOSTDOWN 112 /*主机已关闭*/
#define EHOSTDOWN 112 /* Host is down */

#define EHOSTUNREACH 113 /*没有到主机的路由*/
#define EHOSTUNREACH 113 /* No route to host */

#define EALREADY 114 /*操作已经在进行中*/
#define EALREADY 114 /* Operation already in progress */

#define EINPROGRESS 115 /*操作正在进行中*/
#define EINPROGRESS 115 /* Operation now in progress */

#define ESTALE 116 /*过期的NFS文件句柄*/
#define ESTALE 116 /* Stale NFS file handle */

#define EUCLEAN 117 /*结构需要清洗*/
#define EUCLEAN 117 /* Structure needs cleaning */

#define ENOTNAM 118 /*不是XENIX命名类型文件*/
#define ENOTNAM 118 /* Not a XENIX named type file */

#define ENAVAIL 119 /*没有XENIX信号量可用*/
#define ENAVAIL 119 /* No XENIX semaphores available */

#define EISNAM 120 /*是一个命名类型文件*/
#define EISNAM 120 /* Is a named type file */

#define EREMOTEIO 121 /*远程I/O错误*/
#define EREMOTEIO 121 /* Remote I/O error */

#define EDQUOT / /*配额已超过*/
#define EDQUOT 122 /* Quota exceeded */

#define ENOMEDIUM 123 /*没有找到介质*/
#define ENOMEDIUM 123 /* No medium found */

#define EMEDIUMTYPE 124 /*错误的介质类型*/
#define EMEDIUMTYPE 124 /* Wrong medium type */


#define ECANCELED   125 /* 操作取消 */
#define ECANCELED   125 /* Operation Canceled */

#define ENOKEY      126 /* 所需密钥不可用 */
#define ENOKEY      126 /* Required key not available */

#define EKEYEXPIRED 127 /* 密钥已过期 */
#define EKEYEXPIRED 127 /* Key has expired */

#define EKEYREVOKED 128 /* 密钥已被撤销 */
#define EKEYREVOKED 128 /* Key has been revoked */

#define EKEYREJECTED    129 /* 服务拒绝了密钥 */
#define EKEYREJECTED    129 /* Key was rejected by service */

/* 对于健壮的互斥锁 */
/* for robust mutexes */

#define EOWNERDEAD  130 /* 主人死后 */
#define EOWNERDEAD  130 /* Owner died */

#define ENOTRECOVERABLE 131 /* 不可恢复状态 */
#define ENOTRECOVERABLE 131 /* State not recoverable */

#define ERFKILL     132 /* 由于射频杀伤,无法操作 */
#define ERFKILL     132 /* Operation not possible due to RF-kill */

#define EHWPOISON   133 /* 内存页有硬件错误 */
#define EHWPOISON   133 /* Memory page has hardware error */

~over~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TUP通信——与多个客户端同时通信

一&#xff0c;概括&#xff1a;可以通过多线程思想每加一个客户端由线程池中的主线程交给一个子线程管理 二&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;线程池 &#xff08;2&#xff09;&#xff0c;服务端 &#xff08;3&#xff09;&#xff0c;客户端

RPG项目01_UI登录

首先创建一个项目 将资源包导进Resources文件夹 创建一个Scripts脚本文件夹 然后再对Scripts脚本文件夹分门别类 导入UI资源包 创建一个Image 按住Alt 选择右下角 image就会覆盖整个面板 修改image名字为BG 将image图片放置背景栏 再创建一个image 改名为MainMenu 修改MainMenu…

FLV 文件格式分析

前言 flv 是 flash video 的缩写&#xff0c;是 Adobe Flash payler 支持的一种流媒体播放格式。flv 是一种层级格式&#xff0c;除了一个 flv header 外&#xff0c;剩下全是由 一个个 tag 组成。tag 是由 tag 头和 tag 数据组成。tag 类型分为音频、视频、脚本&#xff0c;一…

centos7 keepalived 探测当前节点

前提 nginx 默认页面内容中需要加上各节点的ip nginx web页面修改 nginx配置文件路径&#xff1a;/etc/nginx/nginx.conf&#xff0c;该配置文件引用了/etc/nginx/conf.d/default.conf 打开/etc/nginx/conf.d/default.conf配置文件可以看到html页面的路径 /usr/share/nginx…

分享从零开始学习网络设备配置--任务4.3 使用动态路由RIPng实现网络连通

任务描述 某公司使用IPv6技术搭建企业网络&#xff0c;由于静态路由需要管理员手工配置&#xff0c;在网络拓扑发生变化时&#xff0c;也不会自动生成新的路由&#xff0c;因此采用IPv6动态路由协议RIPng实现网络连通&#xff0c;实现任意两个节点之间的通信&#xff0c;并降低…

【UE】切割程序化网格体

效果 步骤 1. 新建一个Actor蓝图&#xff0c;这里命名为“BP_程序化网格体” 打开“BP_程序化网格体”&#xff0c;添加一个静态网格体组件&#xff0c;再添加一个程序化网格体组件 选中程序化网格体组件&#xff0c;取消勾选“将复杂性用作简单碰撞”选项 选中静态网格体组件…

详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制&#xff08;擦除机制&#xff09; 六.泛型的上界 一.什么是泛型 泛型&#xff08;Generics&#xff09;是Java SE 5中引入的一个新特性&#xff0c;可以使Java中的类和方…

这些steam游戏搬砖知识,你不会还不知道吧?

CSGO搬砖日常出货更新 大家好&#xff0c;我是阿阳&#xff0c;一个只讲项目实操干货的创业博主。今天的内容主要是针对准备踏入游戏行业的新人来讲的&#xff1a; 1、首先大家一定要弄清游戏搬砖到底是哪一个游戏搬砖&#xff0c;因为市面上有个叫游戏打金的很多人也习惯把他…

Liunx系统使用超详细(二)

本篇内容是总结罗列Liunx系统日常使用的基础操作&#xff01;&#xff01;&#xff01; 目录 一、查看IP地址 1.1使用 ip 命令 1.2使用 ifconfig 命令 1.3使用hostname命令&#xff08;仅显示主机名&#xff09; 1.4使用curl命令获取公共IP地址 二、重启网卡(网络接口) …

实在智能荣获36氪消费新势力榜单“优选品牌服务商”

近日&#xff0c;36氪未来消费正式公布「FUTURE 2023」消费新势力名单&#xff0c;实在智能凭借专业的数字化产品力、卓越的服务力和深远的行业影响力&#xff0c;成功入选榜单并获评“优选品牌服务商”。 据悉&#xff0c;此次名单是由36氪未来消费特邀消费领域的行业专家、投…

开源运维监控系统-Nightingale(-夜莺)应用实践(未完)

一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…

【微服务】java 规则引擎使用详解

目录 一、什么是规则引擎 1.1 规则引擎概述 1.2 规则引擎执行过程 二、为什么要使用规则引擎 2.1 使用规则引擎的好处 2.1.1 易于维护和更新 2.1.2 增强应用程序的准确性和效率 2.1.3 加快应用程序的开发和部署 2.1.4 支持可视化和可管理性 2.2 规则引擎使用场景 三、…

Python实现FA萤火虫优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

CNN对 MNIST 数据库中的图像进行分类

加载 MNIST 数据库 MNIST 是机器学习领域最著名的数据集之一。 它有 70,000 张手写数字图像 - 下载非常简单 - 图像尺寸为 28x28 - 灰度图 from keras.datasets import mnist# 使用 Keras 导入MNIST 数据库 (X_train, y_train), (X_test, y_test) mnist.load_data()print(&…

防火墙简介

防火墙概念 是指一种将内部网和公众访问网&#xff08;如Internet&#xff09;分开的方法&#xff0c;它实际上是一种建立在现代通信网络技术和信息安全技术基础上的应用性安全技术&#xff0c;隔离技术。 将需要保护的网络和不可信网络进行隔离&#xff0c;隐藏信息并…

【华为OD】统一考试B\C卷真题 100%通过:开源项目热榜 C/C++实现

目录 题目描述&#xff1a; 示例1 示例2 题目描述&#xff1a; 某个开源社区希望将最近热度比较高的开源项目出一个榜单&#xff0c;推荐给社区里面的开发者。对于每个开源项目&#xff0c;开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数…

振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(2)

注解目录 1、znFAT 的起源 1.1 源于论坛 &#xff08;那是一个论坛文化兴盛的年代。网友 DIY SDMP3 播放器激起了我的兴趣。&#xff09; 1.2 硬盘 MP3 推了我一把 &#xff08;“坤哥”的硬盘 MP3 播放器&#xff0c;让我深陷 FAT 文件系统不能自拔。&#xff09; 1.3 我…

spring Cloud在代码中如何应用,erueka 客户端配置 和 服务端配置,Feign 和 Hystrix做高可用配置

文章目录 Eureka一、erueka 客户端配置二、eureka 服务端配置 三、高可用配置FeignHystrix 通过这篇文章来看看spring Cloud在代码中的具体应用&#xff0c;以及配置和注解&#xff1b; Eureka 一、erueka 客户端配置 1、Eureka 启禁用 eureka.client.enabledtrue 2、Eurek…

在Windows上配置MySql开发java,导入JDBC的jar包后连接SQL Server数据库结合Java和MySql的一些简单实践

在Windows上配置MySql 我们先进入MySql官网 在官网中选择MySQL Installer for Windows 进入后选择第一个下载 接下来安装即可&#xff0c;在安装时&#xff0c;可以只安装MySql Server&#xff08;默认选项&#xff09;,选择Full也可&#xff0c;这样会同时安装workbench以及…

智能优化算法应用:基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜻蜓算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…