linux下如何将整形转化为字符串

linux下如何将整形转化为字符串,第1张

有如下两种常用方法。一、可以通过调用C库函数itoa实现。1 原型。char*itoa(int value,char*string,int radix)2 头文件。stdlib.h3 功能。将value的值,转换为字符串,并存到string中,如果转化后的字符串长度超过radix,那么只存radix位。4 样例。int i=1234char buf[10]itoa(i, buf, 10)执行后buf内容为字符串"1234"。二、通过sprintf格式化输出到字符串中。itoa并不是C语言标准库函数,所以并不是每个平台均支持该函数。当不支持时,可以用sprintf函数来达到同样效果。1 原型。int sprintf( char *buffer, const char *format, [ argument] … )2 头文件。stdio.h3 功能。类似于printf,根据格式化字符串format,将后续参数列表中的参数逐个输出。不过输出目标不是标准输出终端,而是字符串buffer。4 样例。int i=1234char buf[10]sprintf(buf,"%d",i)执行后buf内容同样为字符串"1234"。

不是C语言吧?是系统命令。用来列举object文件(比如编译出的a.out)的symbols.

用法是:

nm [-a|--debug-syms] [-g|--extern-only]

[-B] [-C|--demangle[=style]] [-D|--dynamic]

[-S|--print-size] [-s|--print-armap]

[-A|-o|--print-file-name]

[-n|-v|--numeric-sort] [-p|--no-sort]

[-r|--reverse-sort] [--size-sort] [-u|--undefined-only]

[-t radix|--radix=radix] [-P|--portability]

[--target=bfdname] [-fformat|--format=format]

[--defined-only] [-l|--line-numbers] [--no-demangle]

[-V|--version] [-X 32_64] [--help] [objfile...]

具体而言,nm用来列出目标文件的符号清单。

如果没有为nm命令指出目标文件,则nm假定目标文件是a.out。下面列出该命令的任选项,大部分支持“-”开头的短格式和“-“开头的长格式。

-A、-o或--print-file-name:在找到的各个符号的名字前加上文件名,而不是在此文件的所有符号前只出现文件名一次。

例如nmlibtest.a的输出如下:

CPThread.o:

00000068TMain__8CPThreadPv

00000038TStart__8CPThread

00000014T_._8CPThread

00000000T__8CPThread

00000000?__FRAME_BEGIN__

…………………………………

则nm-A的输出如下:

libtest.a:CPThread.o:00000068TMain__8CPThreadPv

libtest.a:CPThread.o:00000038TStart__8CPThread

libtest.a:CPThread.o:00000014T_._8CPThread

libtest.a:CPThread.o:00000000T__8CPThread

libtest.a:CPThread.o:00000000?__FRAME_BEGIN__

…………………………………………………………..

-a或--debug-syms:显示调试符号。

-B:等同于--format=bsd,用来兼容MIPS的nm。

-C或--demangle:将低级符号名解码(demangle)成用户级名字。这样可以使得C 函数名具有可读性。

-D或--dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。

-fformat:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。

-g或--extern-only:仅显示外部符号。

-n、-v或--numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。

-p或--no-sort:按目标文件中遇到的符号顺序显示,不排序。

-P或--portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-fposix。

-s或--print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。

-r或--reverse-sort:反转排序的顺序(例如,升序变为降序)。

--size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。

-tradix或--radix=radix:使用radix进制显示符号值。radix只能为“d”表示十进制、“o”表示八进制或“x”表示十六进制。

--target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。

-u或--undefined-only:仅显示没有定义的符号(那些外部符号)。

-l或--line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。对于已定义的符号,查找符号地址的行号。对于未定义符号,查找指向符号重定位入口的行号。如果可以找到行号信息,显示在符号信息之后。

-V或--version:显示nm的版本号。

--help:显示nm的任选项。

ar cs libmy.a//创建一个库

ar rs libmy.a 1.o//增加一个模块

ar t libmy.a//显示库里的模块

ar d libmy.a 1.o//删除一个模块

进程读写文件之前需要 打开文件 ,得到 文件描述符 ,然后 通过文件描述符读写文件 .

内核提供了两个打开文件的系统调用 open openat .

打开文件的主要步骤如下:

(1)需要 在父目录的数据中查找文件对应的目录项 , 从目录项得到索引节点的编号,然后在内存中创建索引节点的副本 .因为各种文件系统类型的物理结构不同,所以需要提供索引节点 *** 作集合的 lookup 方法和文件 *** 作集合的 open 方法.

(2)需要分配文件的一个打开实例-- file 结构体,关联到文件的索引节点.

(3)在进程的打开文件表中 分配一个文件描述符 , 把文件描述符和打开实例的映射添加到进程的打开文件表 中.

进程可通过使用系统调用 close 关闭文件.

系统调用close的执行流程如下:

(1)解除打开文件表和file实例的关联.

(2)在close_on_exec位图中清楚文件描述符对应的位.

(3)释放文件描述符,在文件描述符位图中清除文件描述符对应的位.

(4)调用函数fput释放file实例:把引用计数减1,如果引用计数是0,那么把file实例添加到链表delayed_fput_list中,然后调用延迟工作项delayed_fput_work.

延迟工作项delayed_fput_work的处理函数是flush_delayed_fput,遍历链表delayed_fput_list,针对每个file实例,调用函数__fput来加以释放.

创建不同类型的文件,需要使用不同的命令.

(1) 普通文件 :touch FILE ,这条命令本来用来更新文件的访问时间和修改时间,如果文件不存在,创建文件.

(2) 目录 :mkdir DIRECTORY .

(3) 符号链接(软链接) :ln -s TARGET LINK_NAME 或ln --symbolic TARGET LINK_NAME .

(4) 字符或块设备文件 :mknod NAME TYPE [MAJOR MINOR] .

(5) 命名管道 :mkpipe NAME .

(6) 硬连接 :命令"ln TARGET LINK_NAME ".给已经存在的文件增加新的名称,文件的索引节点有一个硬链接计数,如果文件有n个名称,那么硬链接计数是n.

创建文件需要在文件系统中 分配一个索引节点 ,然后 在父目录的数据中增加一个目录项来保存文件的名称和索引节点编号 .

删除文件的命令如下:

(1)删除任何类型文件:unlink FILE .

(2)rm FILE ,默认不删除目录,如果使用"-r""-R"或"-recursive",可以删除目录和目录的内容.

(3)删除目录:rmdir DICTIONARY .

内核提供了unlink,unlinkat用来删除文件的名称,如果文件的硬链接计数变成0,并且没有进程打开这个文件,那么删除文件.提供了rmdir删除目录.

删除文件需要从父目录的数据中删除文件对应的目录项, 把文件的索引节点的硬链接计数减1(一个文件可以有多个名称,Linux把文件名称称为硬链接),如果索引节点的硬链接计数变成0,那么释放索引节点 .因为各种文件系统的物理结构不同,所以需要提供索引节点 *** 作集合的 unlink 方法.

设置文件权限的命令如下:

(1)chmod [OPTION]... MODE[, MODE]... FILE...

mode : 权限设定字串,格式[ugoa...][[+-=][rwxX]...][,...]

其中:

(2)chmod [OPTION]... OCTAL-MODE FILE...

参数OCTAL-MODE是八进制数值.

系统调用chmod负责修改文件权限.

修改文件权限需要修改文件的索引节点的文件模式字段,文件模式字段包含文件类型和访问权限.因为各种文件系统类型的索引节点不同,所以需要提供索引节点 *** 作集合的 setattr 方法.

访问外部存储设备的速度很慢,为了避免每次读写文件时访问外部存储设备, 文件系统模块为每个文件在内存中创建一个缓存 ,因为 缓存的单位是页 ,所以称为 页缓存 .

(1) 索引节点的成员i_mapping 指向地址空间结构体(address_space).进程在打开文件的时候, 文件打开实例(file结构体)的成员f_mapping 也会指向文件的地址空间.

(2)每个文件有一个地址空间结构体 address_space ,成员 page_tree 的类型是结构体radix_tree_root:成员 gfp_mask是分配内存页的掩码,成员rnode指向基数树的根节点 .

(3)使用基数树管理页缓存,把文件的页索引映射到内存页的页描述符.

每个文件都有一个地址空间结构体address_space,用来建立数据缓存(在内存中为某种数据创建的缓存)和数据来源(即存储设备)之间的关联.结构体address_space如下:

地址空间 *** 作结合address_space_operations的主要成员如下:

页缓存的常用 *** 作函数如下:

(1)函数find_get_page根据文件的页索引在页缓存中查找内存页.

(2)函数find_or_create_page根据文件的页索引在页缓存中查找内存页,如果没有找到内存页,那么分配一个内存页,然后添加到页缓存中.

(3)函数add_to_page_cache_lru把一个内存页添加到页缓存和LRU链表中.

(4)函数delete_from_page_cache从页缓存中删除一个内存页.

进程读文件的方式有3种:

(1)调用内核提供的 读文件的系统调用 .

(2)调用glibc库封装的读文件的 标准I/O流函数 .

(3)创建基于文件的内存映射,把 文件的一个区间映射到进程的虚拟地址空间,然后直接读内存 .

第2种方式在用户空间创建了缓冲区,能减少系统调用的次数,提高性能.第3种方式可以避免系统调用,性能最高.

读文件的主要步骤如下:

(1)调用具体文件系统类型提供的文件 *** 作集合的read和read_iter方法来读文件.

(2) read或read_iter方法根据页索引在文件的页缓存中查找页,如果没有找到,那么调用具体文件系统类型提供的地址空间集合的readpage方法来从存储设备读取文件页到内存中 .

为了提高读文件的速度,从存储设备读取文件页到内存中的时候,除了读取请求的文件页,还会预读后面的文件页.如果进程按顺序读文件,预读文件页可以提高读文件的速度如果进程随机读文件,预读文件页对提高读文件的速度帮助不大.

进程写文件的方式有3种:

(1)调用内核提供的 写文件的系统调用 .

(2)调用glibc库封装的写文件的 标准I/O流函数 .

(3)创建基于文件的内存映射,把 文件的一个区间映射到进程的虚拟空间,然后直接写内存 .

第2种方式在用户空间创建了缓冲区,能够减少系统调用的次数,提高性能.第3种方式可以避免系统调用,性能最高.

写文件的主要步骤如下:

(1)调用具体文件系统类型提供的文件 *** 作集合的write或write_iter方法来写文件.

(2)write或write_iter方法调用文件的地址空间 *** 作集合的 write_begin 方法, 在页缓存查找页,如果页不存在就分配页然后把数据从用户缓冲区复制到页缓存的页中 最后调用文件的地址空间 *** 作集合的 write_end 方法.

进程写文件时,内核的文件系统模块把数据写到文件的页缓存,没有立即写回到存储设备.文件系统模块会定期把脏页写回到存储设备,进程也可以调用系统调用把脏页强制写回到存储设备.

管理员可以执行命令"sync",把内存中所有修改过的文件元数据和文件数据写回到存储设备.

内核提供了 sync , syncfs , fsync , fdatasync , sync_file_range 等系统调用用于文件写回.

把文件写回到存储设备的时机如下:

(1)周期回写.

(2)当脏页的数量达到限制的时候,强制回写.

(3)进程调用sync和syncfs等系统调用.

对于类似内存的块设备,例如NVDIMM设备,不需要把文件从存储设备复制到页缓存.DAX绕过页缓存,直接访问存储设备,对于基于文件的内存映射,直接把存储设备映射到进程的虚拟地址空间.

调用系统调用mmap创建基于文件的内存映射,把文件的一个区间映射到进程的虚拟地址空间,这会调用具体文件系统类型提供的文件 *** 作集合的mmap方法.mmap方法针对设置了标志位S_DAX的索引节点,处理方法如下:

(1)给虚拟内存区域设置标志位VM_MIXEDMAP和VM_HUGEPAGE.

(2)设置虚拟内存 *** 作集合,提供fault,huge_fault,page_mkwrite和pfn_mkwrite方法.


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7085259.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-01
下一篇2023-04-01

发表评论

登录后才能评论

评论列表(0条)

    保存