当前位置:首页 > CN2资讯 > 正文内容

Linux respawn格式说明 linux rear

2天前CN2资讯



文章目录

  • 1. Linux的errno和指针
  • 1.1. 整型和指针类型转换
  • 3. 测试程序
  • 3.1. ARM测试结果
  • 3.2. ARM64测试结果


1. Linux的errno和指针

常见的Linux函数返回值类型包括整型和指针,内核中这两种返回值类型的函数会互相调用。Linux的errno为整型,为了与errno对应,Linux将指针分为3种:

  • 空指针:NULL,地址为0
  • 异常指针:地址空间的高4095字节。0xfffff001 - 0xffffffff(32位)和0xfffffffffffff001 - 0xffffffffffffffff(64位)
  • 普通指针

errno的最大值MAX_ERRNO在err.h定义,值为4095。关于变量转换类型后的值,可以使用测试程序来进行测试。

long

void *(arm)

unsigned long(arm)

void *(arm64)

unsigned long(arm64)

0

(nil)

0

(nil)

0

-1

0xffffffff

0xFFFFFFFF

0xffffffffffffffff

0xFFFFFFFFFFFFFFFF

-MAX_ERRNO

0xfffff001

0xFFFFF001

0xfffffffffffff001

0xFFFFFFFFFFFFF001

为了处理两种数据类型的转换,内核提供了include/linux/err.h。

1.1. 整型和指针类型转换

interface

input

output

function

IS_ERR_VALUE

any

bool

强制转换为unsigned long后,判断是否大于(unsigned long)-MAX_ERRNO

ERR_PTR

long

void *

errno转指针

PTR_ERR

pointer

long

指针转errno

IS_ERR

pointer

bool

判断指针是否异常

IS_ERR_OR_NULL

pointer

bool

判断指针是否异常或NULL

ERR_CAST

pointer

void *

将任意类型的指针转为void型指针

PTR_ERR_OR_ZERO

pointer

int

如果是异常指针,返回指针对应的errno,否则返回0

2. C语言中整型数据的存储和数据类型转换原理

其实,在C语言中,数值是以补码的形式存储的,正数存储的内容就是其本身(原码),负数补码的计算方法如下:

  • 取绝对值
  • 取反码,也就是对每一位取反
  • 对反码加1,得到补码
  • 以char型为例,-1在内存中的表示计算方法如下:


    取反码 反码加1 0000 0001 1111 1110 1111 1111


    关于为什么使用补码存储数据,可以参整数在内存中是如何存储的,为什么它堪称天才般的设计。

    2.1. 负数的强制类型转换

    做强制类型转换时,就是把内存中的数据(补码)看作要转换的类型。将-1强制转换为unsigned char型时,就可得到值为0xFF,以此类推,可知将-转换为unsigned long时,值为0xFFFFFFFF(32位)或0xFFFFFFFFFFFFFFFF(64位)。同样的道理-4095转换为unsigned long时,值为0xFFFFF001(32位)或0xFFFFFFFFFFFFF001(64位)。需要注意的是,类型转换是临时的,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值。

    2.2. 强制数据类型降级

    数据类型级别从高到低为:

    unsigned long long long long unsigned long long unsigned int int unsigned short short unsigned char char

    从高级到低级转换时,超出数值位数的高位部分将被丢弃。另外,降级转换也是是临时的。

    3. 测试程序

    #include <stdio.h> #include <string.h> #define MAX_ERRNO 4095 union err_t { int i; long l; unsigned int ui; unsigned long ul; void *p; char ch[sizeof(unsigned long)]; }; static void test(long val) { union err_t err; memcpy(&err, &val, sizeof(val)); printf("int: %d\n", err.i); printf("long: %ld\n", err.l); printf("unsigned int: %u, 0x%08X\n", err.ui, err.ui); printf("unsigned long: %lu, 0x%08lX\n", err.ul, err.ul); printf("void *: %p\n", err.p); } int main(void) { printf("\ntesting: 0\n"); test(0); printf("\ntesting: -1\n"); test(-1); printf("\ntesting: -MAX_ERRNO\n"); test(-MAX_ERRNO); #if 0 printf("\ntesting: -4096\n"); test(-4096); #endif return 0; }

    3.1. ARM测试结果

    交叉编译后使用QEMU运行查看结果。

    arm-linux-gnueabihf-gcc -static -o err_arm err.c qemu-arm err_armtesting: 0 int: 0 long: 0 unsigned int: 0, 0x00000000 unsigned long: 0, 0x00000000 void *: (nil) testing: -1 int: -1 long: -1 unsigned int: 4294967295, 0xFFFFFFFF unsigned long: 4294967295, 0xFFFFFFFF void *: 0xffffffff testing: -MAX_ERRNO int: -4095 long: -4095 unsigned int: 4294963201, 0xFFFFF001 unsigned long: 4294963201, 0xFFFFF001 void *: 0xfffff001

    3.2. ARM64测试结果

    交叉编译后使用QEMU运行查看结果。

    aarch64-linux-gnu-gcc -static -o err_aarch64 err.c qemu-aarch64 err_aarch64testing: 0 int: 0 long: 0 unsigned int: 0, 0x00000000 unsigned long: 0, 0x00000000 void *: (nil) testing: -1 int: -1 long: -1 unsigned int: 4294967295, 0xFFFFFFFF unsigned long: 18446744073709551615, 0xFFFFFFFFFFFFFFFF void *: 0xffffffffffffffff testing: -MAX_ERRNO int: -4095 long: -4095 unsigned int: 4294963201, 0xFFFFF001 unsigned long: 18446744073709547521, 0xFFFFFFFFFFFFF001 void *: 0xfffffffffffff001


      你可能想看:

      扫描二维码推送至手机访问。

      版权声明:本文由皇冠云发布,如需转载请注明出处。

      本文链接:https://www.idchg.com/info/25713.html

      分享给朋友:

      “Linux respawn格式说明 linux rear” 的相关文章

      亚马逊CDN CloudFront:提升网站安全性与加载速度的理想选择

      亚马逊CDN概述 亚马逊CloudFront是亚马逊云科技旗下的一项内容分发网络(CDN)服务,它通过全球范围内的多个数据中心高效分发内容。我对这项服务的了解使我意识到,CloudFront不仅仅是一个简单的资源分发工具,它的设计旨在确保内容的流畅、高效、安全传输,尤其在当今对速度与安全性高度重视的...

      国外离线下载服务比较:如何选择最适合你的工具

      在信息时代,国外离线下载服务成为了许多用户的得力助手。这种服务的主要功能,是让用户在没有网络连接的情况下,也能提前将所需的数据或文件下载到本地或云端存储中。这种方法特别适合那些经常出行或在网络不佳的环境中工作的用户。通过离线下载,用户可以在网络恢复后更快、更方便地访问所需内容。 离线下载的应用非常广...

      宝塔的设计概念与历史发展:信仰与文化的桥梁

      宝塔的设计概念 宝塔,这一宗教建筑的象征,体现了深厚的文化内涵和独特的美学设计。作为佛教的重要象征,宝塔的设计概念不仅包括其结构和形态的美感,也涵盖了宗教信仰的意义。最初的宝塔设计如同一个倒扣的钵盂,象征着对佛教教义的恭敬与追思。随着时间的推移,宝塔的构造和装饰逐渐演变,形成了今天我们所见的多样化风...

      国内到东京快还是首尔快网络速度对比分析

      引言 在这个数字化快速发展的时代,网络速度对我们生活的影响越来越显著。很多时候,我们的工作、学习和娱乐都离不开稳定的网络连接。尤其是当我们考虑访问国外网站或进行国际交流时,网络速度的重要性更是无法忽视。今天,我想带大家探讨国内到东京和首尔的网络速度比较,看看这两个城市的网络表现究竟有何不同。 为什么...

      2024年RackNerd在纽约的主机服务优势与促销活动分析

      RackNerd简介 RackNerd 是一家在美国知名的主机商,以其稳定的虚拟主机、KVM VPS、Hybrid Dedicated Servers和独立服务器租用方案而备受青睐。公司成立以来,致力于为全球用户提供高性能、可靠性强的服务器解决方案。对于我来说,RackNerd的服务不仅包括针对个人...

      黑五狂欢购物攻略:如何高效享受黑色星期五折扣

      黑五,全称“黑色星期五”(Black Friday),是每年感恩节后的第一天。随着这个节日的到来,许多商店和电商都会推出琳琅满目的促销活动,标志着圣诞购物季的开端。我第一次听到黑五,是在朋友们热火朝天地讨论即将到来的折扣和特卖,这种热情真是难以抗拒。 黑五起源于美国,为什么叫“黑色”呢?这个名字其实...