当前位置: 首页 > 编程日记 > 正文

Linux 文件系统及 ext2 文件系统

linux 支持的文件系统类型

Ext2:    
  有点像 UNIX 文件系统。有 blocks,inodes,directories 的概念。
Ext3:    
  Ext2 的加强版,添加了日志的功能。支持 POSIX ACL(Access control Lists,访问控制列表) 。
Isofs(iso9660):    
  CDROM 文件系统。
Sysfs:
  基于 ram 的文件系统,起始于 ramfs。用于导出终端用户可以简便使用的内核对象(kernel objects)。
Procfs:    
  proc 文件系统作为一个内核内部数据结构的界面。可以用来获取关于系统的信息,也可以用 sysctl 命令在系统运行时改变内核的参数。
比如,可以通过下面的命令来查看 cpu 信息:
  1. # cat /proc/cpuinfo

也可以打开或者关闭 IP 数据包的路由与转发( routing/forwarding ):
  1. # cat /proc/sys/net/ipv4/ip_forward
    # echo "1" > /proc/sys/net/ipv4/ip_forward
    # echo "0" > /proc/sys/net/ipv4/ip_forward

NFS:    
网络文件操作系统(network file system),允许不同的用户和系统使用 C/S 的方式来共享同一个文件。NFS 允许共享以上的所有文件系统。
 
Linux 还支持 Microsoft NTFS,vfat 等其它文件系统。在 Linux 内核源码树中,Documentation/filesystem 目录下列有所有支持的文件系统。
 
使用 mount 命令可以查看当前挂载的文件系统:
  1. $ mount

文件系统的几个基本概念

Inodes

每个文件都被 inode 数据结构所表示(以前也被写作i-node)。每个 inode 包含系统中一个物理文件的信息。这个文件可以是目录,socket,buffer,字符或者字块设备,符号链接或者常规文件。所以一个 inode 可以视为一个实体的信息块,描述它在磁盘中的位置,大小,时间戳,文件类型,访问权限和所有者。

Directories

目录是树状的结构。每个目录可以同时包含文件和子目录。
目录被当作特殊的文件来实现。实际上,一个目录就是一个包含了目录项(directory entry)的文件。每个目录项包含一个 inode 号以及一个文件的名字。当一个进程查找一个文件,内核代码通过路径在目录中查找相应的 inode 号。找到 inode 号后,相应的 inode 被加载进内存以作后续使用。

Links

Unix 文件系统实现了链接的概念。
inode 一般关联一个目录项。但是,使用硬链接(hard link)可以让一个 inode 关联多个目录项。其 inode 中有一个域包含着文件关联的数量。
创建一个硬链接:
  1. # ln /root/file1 /root/file2

创建一个软链接(symbolic link or soft link):
  1. ln -s /path/to/file1.txt /path/to/file2.txt

原理:
从图中可以看到,硬链接与原始文件共用一个 inode - 345666,345666 号 inode 现在关联两个文件。如果创建的是软链接,它本身会再新建一个 inode - 966600,这个 96660 号 inode 数据块地址指向 966699 号 inode。软链接有点像 windows 的快捷方式。快捷方式本身是个文件,但却指向另外一个地址。而硬链接更像是具有计数功能的别名。
理解了这一张图就不难理解:
  1. $ ln FileAFileB#创建一个硬链接
    $ ls -il FileAFileB#具有相同的 inode 号
    1482256-rw-r--r--     2 bruno bruno     21May515:55FileA
    1482256-rw-r--r--     2 bruno bruno     21May515:55FileB
    $ rm FileA
    $ cat FileB#将看到FileA的内容
    $ ln -s FileBFileC#创建软链接
    $ ls -il FileBFileC#FileC文件类型是l-链接文件,且与 FileB 具有不同的 inode
    1482256-rw-r--r--     1 bruno bruno     21May515:55FileB
    1482226 lrwxrwxrwx    1 bruno bruno      5May516:22FileC->FileB
    $ rm FileB
    $ cat FileC#提示不存在该文件,皮之不存毛将焉附?

硬链接 VS 软链接
硬链接软链接
硬链接不能在目录间创建可以在不同目录间创建
不能跨越文件系统边界可以跨文件系统边界
指向源头,即使源头被移动或者移除不会更新
   

Device files   

类unix操作系统中,可以能过特别的文件来访问设备。这些文件并不占用文件系统的空间,只是一个设备驱动的访问点。

The Second Extended File system(EXT2)

ext2 是目前 Linux 社区中最成功的文件系统。
像很多其它文件系统,ext2 中的文件也保存在数据块中。数据块的大小是固定的,即使不同的 ext2 文件系统数据块的大小可能是不同的,但一旦 ext2 被创建(mke2fs),这个文件系统中数据块的大小就被固定了。
每个文件的大小都被向上取整成整数个块。如果块的大小为 1024B,一个文件的大小为 1025B,那这个文件需要两个块来存储。
物理布局:
其中,block 0 总是指向磁盘或者分区的第一个扇区,如果启动记录(boot record)存在,那么一定在 block 0 中。
超级块(super block)总是位于磁盘或者分区开始的第 1024 字节处。如果一个块大小为 1 KB,那么超级块位于 block 1。如果一个块的大小大于 1024B,那么超级块位于 block 0。
两个例子:
表-Floppy Disk 布局,块大小为 1KB
Block OffsetLengthDescription
byte 0512 bytesboot record (if present)
byte 512512 bytesadditional boot record data (if present)
-- block group 0, blocks 1 to 1439 --
byte 10241024 bytessuperblock
block 21 blockblock group descriptor table
block 31 blockblock bitmap
block 41 blockinode bitmap
block 523 blocksinode table
block 281412 blocksdata blocks
表-20M 的 ext2 文件系统,使用 1KB 的块
Block OffsetLengthDescription
byte 0512 bytesboot record (if present)
byte 512512 bytesadditional boot record data (if present)
-- block group 0, blocks 1 to 8192 --
byte 10241024 bytessuperblock
block 21 blockblock group descriptor table
block 31 blockblock bitmap
block 41 blockinode bitmap
block 5214 blocksinode table
block 2197974 blocksdata blocks
-- block group 1, blocks 8193 to 16384 --
block 81931 blocksuperblock backup
block 81941 blockblock group descriptor table backup
block 81951 blockblock bitmap
block 81961 blockinode bitmap
block 8197214 blocksinode table
block 84087974 blocksdata blocks
-- block group 2, blocks 16385 to 24576 --
block 163851 blockblock bitmap
block 163861 blockinode bitmap
block 16387214 blocksinode table
block 166013879 blocksdata blocks

ext2—Inode

表—Inode 数据结构
Offset (bytes)Size (bytes)Description
02i_mode
22i_uid
44i_size
84i_atime
124i_ctime
164i_mtime
204i_dtime
242i_gid
262i_links_count
284i_blocks
324i_flags
364i_osd1
4015 x 4i_block
1004i_generation
1044i_file_acl
1084i_dir_acl
1124i_faddr
11612
i_osd2
i_mode:
    16 bit,用来表明所描述文件的类型以及访问权限,可能的值有:
ConstantValueDescription
-- file format --
EXT2_S_IFSOCK0xC000socket
EXT2_S_IFLNK0xA000symbolic link
EXT2_S_IFREG0x8000regular file
EXT2_S_IFBLK0x6000block device
EXT2_S_IFDIR0x4000directory
EXT2_S_IFCHR0x2000character device
EXT2_S_IFIFO0x1000fifo
-- process execution user/group override --
EXT2_S_ISUID0x0800Set process User ID
EXT2_S_ISGID0x0400Set process Group ID
EXT2_S_ISVTX0x0200sticky bit
-- access rights --
EXT2_S_IRUSR0x0100user read
EXT2_S_IWUSR0x0080user write
EXT2_S_IXUSR0x0040user execute
EXT2_S_IRGRP0x0020group read
EXT2_S_IWGRP0x0010group write
EXT2_S_IXGRP0x0008group execute
EXT2_S_IROTH0x0004others read
EXT2_S_IWOTH0x0002others write
EXT2_S_IXOTH0x0001others execute 
 
i_uid:
    16 bit,文件所属用户的用户 id
    

ext2—Block Groups,块组

多个块组成一个块组(Block Group),这样可以减少碎片化,并且在读取大量连续的数据时可以减少寻道时间(head seeking)。

ext2—Superblock,超级块

超级块包含文件系统的所有配置信息,包括文件系统中有多少 inodes 和 blocks,以及它们中有多少是空闲的,在每个块组(block group)中有多少 inodes 和 blocks。
超级块的主拷贝被存储在磁盘开始 1024 字节处。由于它对于文件系统的挂载至关重要,整个文件系统的块组(block group)将会保存它的备份拷贝。
ext2 的第一个版本(修订号为 0)在每个块组的开始处都保存一份超级块副本。对于大型文件系统来说,这种方法会消耗大量的空间,所有在接下的版本中(修订号为 1),可以将副本保存在指定的块组中。块组号可以选择 0 ,1 以及以 3,5,7 为底的幂。
 
在超级块中的所有域都以小端模式存储在磁盘中(其它的 ext2 数据结构也是这样),这样 ext2 文件系统在机器间就很方便移植,因为不需要知道文件系统是哪类机器创建的。
超级块持有的信息有:
魔数(magic number)
    标志 ext2 文件系统的超级块,挂载软件(mounting software)以此来确认这是 ext2 文件系统的超级块。比如 0xEF53。
修订级别(revision level)
    通过主要和次要的修订级别,可以知道当前文件系统是否支持只有在一些特殊修订版的文件系统中才有的功能特性,以及哪些新的功能特性能安全地应用在当前的文件系统中。
挂载次数及最大挂载次数
    两个数合起来决定文件系统是否需要全面检查。每当文件系统被挂载,挂载的次数自增,当它等于最大的挂载次数时,将显示“达到最大挂载次数,推荐运行 e2fsck”
块组号
    当前超级块副本所在的块组号
块大小
    文件系统中块的大小,以字节(byte)为单位。
每组的块数
    在一个组内块的数目。跟块大小一样,当文件系统被创建时,这个数量就被固定了。
空闲的块
    文件系统中空闲的块。
空间的 inodes
    文件系统中空闲的 inode。
第一个 inode
    ext2 根文件系统中的第一个 inode 是根目录 ‘/’。

ext2—Block Group Descriptor,组描述符

为文件系统中的每个块组创建一个组描述符。每个组描述符都代表文件系统中的一个块组,组描述符中所有信息都只是所描述的块组的信息。
每个组描述符(group descriptor)包含以下信息
Offset (bytes)Size (bytes)Description
04bg_block_bitmap
44bg_inode_bitmap
84bg_inode_table
122bg_free_blocks_count
142bg_free_inodes_count
162bg_used_dirs_count
182bg_pad
2012bg_reserved
bg_block_bitmap:
    所表示的块组中 block bitmap 的块号(block id),32 bit
bg_inode_bitmap:
    所表示的块组中 inode bitmap 的块号,32 bit
bg_inode_table:
所表示的块组中 inode table 的块号,32 bit
bg_free_blocks_count:
    所表示的块组中空闲的块数,16 bit
bg_free_inodes_count:
    所表示的块组中空闲的 inodes 数量,16 bit
bg_used_dirs_count:
    所表示的块组中 inodes 给目录用的数量,16 bit
bg_pad:
    16 bit,用来使得整个数据结构对齐 32 bit 的边界
bg_reserved:
    12 个保留字节,为以后的版本留出的空间

ext2—Block Group Descriptor Table,组描述符表

组描述符表(block group descriptor table)是一个组描述符的数组,用来定义所有块组的参数。包含 inode bitmap,inode table,block bitmap 的位置,以及空闲块、空闲 inodes 的数量,以及其它有用的信息。它包含所有块组的信息。
组描述符表跟在超级块后面。如果块大小为 1KB,那么它将在第三个块,或者如果块大小为 2KB 它将在第二个块。如果有超级块的拷贝副本,那么在超级块的拷贝副本后面同样有组描述符表的拷贝副本。
如果块组有很多,组描述表可以申请多个块来存储相应的组描述符信息。

ext2—Block Bitmap

在小一点的文件系统中,Block Bitmap 位于组块的第一个块中(因为小,为了节省空间所以不放超级块或者组块描述符表的备份)。通常它的位置可以通过读取块组相关联的组描述符中的 bg_block_bitmap 来获得。
每个位表示块组中块的当前状态,1 表示“已使用”,0 表示 “空闲/可用”。块组中第一个块使用第 0 个字节的第 0 个 bit 来表示,相应地,第二个块用使用第 0 个字节的第 1 个 bit,第八个块使用第 0 个字节的第 7 个 bit 表示,第 9 个块使用第 1 个字节的第 0 个 bit 来表示。

ext2—Inode Bitmap

跟 Block Bitmap 类似,不同的是,每个位表示的是 Inode Table 中的 inode 而不是一个块。
每个块组都有一个 inode bitmap,并且位置同样由块组对应的组描述符中的 bg_inode_bitmap 决定。

ext2—Inode Table

Inode table 被用来保持追踪每个目录,常规文件,符号链接,或者特殊文件;它们的位置,大小,类型及访问权限都被保存在 inodes 中。文件名及 inode 是分开的,inode 并不保存文件名,文件名被保存在目录文件中。
每个块组都有一份 inode table,它的位置由组块对应描述符中的 bg_inode_table 决定。
inode table 中的前几项会被保留。在版本 0 中有 11 项为保留项,版本 1 或者后面几个版本被保留的 inode 项由超级块结构中的 s_first_ino 指定。
表—已知被保留的 inode 项:
Constant NameValueDescription
EXT2_BAD_INO1bad blocks inode
EXT2_ROOT_INO2root directory inode
EXT2_ACL_IDX_INO3ACL index inode (deprecated?)
EXT2_ACL_DATA_INO4ACL data inode (deprecated?)
EXT2_BOOT_LOADER_INO5boot loader inode
EXT2_UNDEL_DIR_INO6undelete directory inode

ext2—Directories,目录

目录用来有层次地组织文件。每个目录都能包含其它目录,常规文件及特殊文件。
目录被当作数据块来保存,并用一个 inode 指向它。指向目录的 inode 中 i_mode 字段被设定为 EXT2_S_IFDIR,由此来表明文件类型为目录。
在 inode table 中每二个表项的 inode 指向根目录(root directory)的数据。它是 inode table 的保留项,被指定为 EXT2_ROOT_INO。
在版本 0 中目录以链表的形式存储。版本 1 及后面的版本引进索引目录(indexed directories)。
链表形式:

链表形式目录项结构:
Offset (bytes)Size (bytes)Description
04inode
42rec_len
61name_len[a]
71file_type[b]
80-255name
举个栗子:
inode:
    目录项的 inode。
record length:
    目录项的长度(以字节为单位)。
name length:
    目录项名字的长度(以字节为单位)。
file type:
    文件类型
典型的文件类型及取值:
Constant NameValueDescription
EXT2_FT_UNKNOWN0Unknown File Type
EXT2_FT_REG_FILE1Regular File
EXT2_FT_DIR2Directory File
EXT2_FT_CHRDEV3Character Device
EXT2_FT_BLKDEV4Block Device
EXT2_FT_FIFO5Buffer File
EXT2_FT_SOCK6Socket File
EXT2_FT_SYMLINK7Symbolic Link
name:目录项的名字。
注:
1)版本 0 的 Ext2 使用 2 个字节的 name_len。由于大部分的实现文件名严格限制最大为 255 个字符,所以这两个字节被截断,低字节部分还是用来存储文件名,高字节用来存储文件类型 file_type。这个时候可以不通过 inode 来查询文件类型了。这个时候看起来会是这个样子:
2)目录项必须 4 字节对齐边界(没有任何目录项会横跨两个数据块)。如果一个目录项不能塞进一个数据块中,那么它就只能放到下一个数据块中了。
举个栗子:

Table . Sample Linked Directory Data Layout, 4KiB blocks

Offset (bytes)Size (bytes)Description
Directory Entry 0
04inode number: 783362
42record length: 12
61name length: 1
71file type: EXT2_FT_DIR=2
81name: .
93padding
Directory Entry 1
124inode number: 1109761
162record length: 12
181name length: 2
191file type: EXT2_FT_DIR=2
202name: ..
222padding
Directory Entry 2
244inode number: 783364
282record length: 24
301name length: 13
311file type: EXT2_FT_REG_FILE
3213name: .bash_profile
453padding
Directory Entry 3
484inode number: 783363
522record length: 16
541name length: 7
551file type: EXT2_FT_REG_FILE
567name: .bashrc
631padding
Directory Entry 4
644inode number: 783377
682record length: 12
701name length: 4
711file type: EXT2_FT_REG_FILE
724name: mbox
Directory Entry 5
764inode number: 783545
802record length: 20
821name length: 11
831file type: EXT2_FT_DIR=2
8411name: public_html
951padding
Directory Entry 6
964inode number: 669354
1002record length: 12
1021name length: 3
1031file type: EXT2_FT_DIR=2
1043name: tmp
1071padding
Directory Entry 7
1084inode number: 0
1122record length: 3988
1141name length: 0
1151file type: EXT2_FT_UNKNOWN
1160name:
1163980padding 
索引形式:
一旦文件数量开始增长,链接形式的目录就会变得很慢。为了提高性能,基于 hash 的索引用来快速查找文件。
 
索引目录根(indexed directory root)
为了与链表形式的目录兼容,在 block 0 的开始处放置了一些假的目录项。 . 及 .. 文件夹目录项就是这些的一部分。
Offset (bytes)Size (bytes)Description
-- Linked Directory Entry: . --
04inode: this directory
42rec_len: 12
61name_len: 1
71file_type: EXT2_FT_DIR=2
81name: .
93padding
-- Linked Directory Entry: .. --
124inode: parent directory
162rec_len: (blocksize - this entry's length(12))
181name_len: 2
191file_type: EXT2_FT_DIR=2
202name: ..
222padding
-- Indexed Directory Root Information Structure --
244reserved, zero
281hash_version
291info_length
301indirect_levels
311reserved - unused flags 
 
hash_version:
    1 字节,表示 hash 的版本
info_length:
    1 字节,表示索引目录信息结构体(dx_root)的大小,即是上表中的 Indexed Directory Root Information。
indirect_levels:
    1 字节,表示间接索引的层数。在 Linux 2.6.28 中这个值为 1。
 
索引目录项(index directory entry)
索引目录项关联一个文件名的哈希值,根据这个哈希值可以快速地查找到相应的 inode 节点。这些索引目录项跟在上面说的索引目录根后面。
 
它长得像这样:

Table 4-6. Indexed Directory Entry Structure (dx_entry)

Offset (bytes)Size (bytes)Description
04hash
44block
 
hash:
    4 字节,文件名的哈希值
block:
4 字节,包含相应文件名的目录项的 inode 数据块的索引

目录的查找算法

1)计算文件名的哈希值
2)读取 index root
3)使用二分查找查找第一个包含该哈希的子目录
4)重复第 3 步直到到达树的最低一层
5)读取叶子目录项数据块,使用常规的查找
6)如果找到了这个文件名,返回该目录项及 buffer
7)否则,如果下个目录项的冲突位被设置了,那么在下一块数据块中继续查找

目录的插入算法

插入一个新的目录项到目录中比之目录查找要复杂得多。
1)探测要插入的目录项的索引,过程跟查找一样
2)如果目标叶子数据块已经满了,把它分成两份并标记这个数据块将被插入新的目录项
3)跟往常一样插入这个新的目录项到叶子数据块

参考资料:

http://www.cyberciti.biz/tips/understanding-unixlinux-file-system-part-i.html
http://www.cyberciti.biz/tips/understanding-unixlinux-symbolic-soft-and-hard-links.html
http://www.bestweb.tips/linux-file-attributes/
http://www.linuxclues.com/articles/17.htm
https://en.wikipedia.org/wiki/Ext2
http://www.tldp.org/HOWTO/Filesystems-HOWTO-6.html
http://e2fsprogs.sourceforge.net/ext2intro.html
http://www.tldp.org/LDP/tlk/fs/filesystem.html
http://www.nongnu.org/ext2-doc/ext2.html



来自为知笔记(Wiz)



转载于:https://www.cnblogs.com/codetravel/p/4779430.html

相关文章:

php每分钟刷新一次的验证码,php如何在进入页面的时候自动刷新一次验证码

页面直接进入login页面的时候无法获取到$_SESSION["auth"]值,只能刷新一次验证码才能获取到值,怎么才能在用户访问的时候自动刷新一次验证码,求大神支招。。。验证码回复讨论(解决方案)哪里获取到$_SESSION["auth"]值&am…

vs2010快捷方式

【窗口快捷键】 CtrlW,W: 浏览器窗口 CtrlW,S: 解决方案管理器 CtrlW,C: 类视图 CtrlW,E: 错误列表 CtrlW,O: 输出视图 trlW,P: 属性窗口 CtrlW,T: 任务列表 CtrlW,X: 工具箱 CtrlW,B: 书签窗口 CtrlW,U: 文档大纲 CtrlD,B: 断点窗口 CtrlD,I: 即时窗口 CtrlTab: 活…

移动端rem屏幕设置

//修改页面title var pageTitledocument.getElementsByTagName("title")[0].innerHTML; if(location.href.indexOf("index.html")>-1 || location.href.indexOf("html")-1){document.getElementsByTagName("title")[0].innerHTML&q…

二维指针操作链表

背景 Linus slashdot: https://meta.slashdot.org/story/12/10/11/0030249 Linus大婶在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了…

php多选框怎么传值,tp3.2如何处理多选框传参和判断状态

创建多选框:(1)普通的多选:123(2)在数据库中遍历出来的多选框,value和data-id都要赋值(大家都懂,我就不说啦):{$vo.title} 2.我是用jq做的异步,我是使用英文“,”分割字段存储的。我们的前端是自己封装过的,大家根据自…

UIWebView和UIActivityIndicatorView的结合使用

环境:Xcode6.1 UIWebView是iOS开发中常用的一个控件,是内置的浏览器控件,我们可以用它来浏览网页,加载文档等。这篇文件将结合UIActivityIndicatorView控件制作一个小实例(加载apple的官网)。效果如下: 一.建立一个Sin…

Python对象类型——字符串、列表、元组

字符串Python连接多个字符串可用“”号,但这个操作不如把所有子字符串放到一个列表或可迭代对象中,然后调用一个join方法来把所有内容连接在一起节约内存。原始字符串操作符(R/r):相当于取消“\”转义,在使…

leetcode--1:(python)Two Sum

2019.5.25: #1 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. Example: 我的解法&#xff1…

memset初始化内存

在suse 9,运行man memset 查看memset的解释如下&#xff1a; “NAME memset - fill memory with a constant byte SYNOPSIS #include <string.h> void *memset(void *s, int c, size_t n); DESCRIPTION The memset() function fills the fir…

php 数字变量,php入门变量之数字_PHP教程

在介绍变量时&#xff0c;我明确指出PHP具有整型和浮点型(小数)数字类型。但是&#xff0c;依据我的经验&#xff0c;这两种类型都可以归类到一般的数字之下(在极大程度上是这样的)。下面列举下PHP中有效的数字类型的变量&#xff1a;83.1410980843985-4.23985084.4e2注意&…

BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减dp(v) min{ dp(p)xv*yp1 }假设dp(v)由i转移比由j转移优(i>j), 那么dp(i)xv*yi1 < dp(j)xv*yj1化简得 (dp(i) - dp(j))/(yi1-yj1) > -xv然后就斜率优…

雨季来临 对车辆涉水说“NO”

七月的上海开始进入暴雨频发的季节。在城市排水系统受到考验的同时&#xff0c;车主们的车辆也同样经受着雨水的考验。而每年都会有相当一部分车辆因为“水害”&#xff0c;使车辆自身的价值受到很大的影响。为此开新通过以下案例为大家做个分析。并推荐几个实用的技巧以备不时…

C#编写dll进行sql server数据库扩展储存过程

一、编写C#函数文件 1、新建一个类库文件 备注&#xff1a;sqlserver 2008只能用.net3.5版本。 2、如有想加入强命名的话可如下步骤&#xff1a; 参考博文&#xff1a;https://blog.csdn.net/donnie88888888/article/details/52743064 1、运行在“开始菜单”-“程序”-“Micros…

malloc(0)-malloc 0 字节

C17中有如下描述&#xff1a; 7.22.3 Memory management functions 1 The order and contiguity of storage allocated by successive calls to the aligned_alloc, calloc, malloc, and realloc functions is unspecified. The pointer returned if the allocation succeeds …

php常见排序算去,PHP兑现常见排序算法

PHP实现常见排序算法//插入排序(一维数组)function insert_sort($arr){$count count($arr);for($i1; $i$tmp $arr[$i];$j $i - 1;while($arr[$j] > $tmp){$arr[$j1] $arr[$j];$arr[$j] $tmp;$j--;}}return $arr;}//选择排序(一维数组)function select_sort($arr){$coun…

C#中 int.TryParse 的用法

int i -1;bool b int.TryParse(null, out i);执行完毕后&#xff0c;b等于false&#xff0c;i等于0&#xff0c;而不是等于-1&#xff0c;切记。 int i -1;bool b int.TryParse("123", out i); 执行完毕后&#xff0c;b等于true&#xff0c;i等于123&#xff1b;…

2022-2028年中国综艺节目市场深度调研及投资前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国综艺节目行业市场行业相关概述、中国综艺节目行业市场行业运行环境、分析了中国综艺节目行…

cocos2d-js 自定义事件监听派发

熟悉js的dom事件或者flash事件的&#xff0c;基本都能立马明白cc.eventManager的用法。 cc.eventManager有两种注册监听器的方式&#xff0c;一种是原生事件&#xff0c;例如 cc.eventManager.addListener({ event: cc.EventListener.KEYBOARD, onKeyReleased: function(keyCod…

URL编码转义,冒号和/不转,否则导致http链接失效

URL含有中文需要转义 参考 https://blog.csdn.net/benbenxiongyuan/article/details/10608095 自己写一个 1 public boolean checkURLFileIsExist(String stringURL){2 boolean isExist false;3 String sEncodeURL;4 5 try{6 // URL内中文…

C面向对象之透明指针的运用

不透明指针(opaque pointer)可以用来在C中实现封装。 什么是不透明指针(opaque pointer) 从字面意思来看&#xff0c;“不透明”意味着看不到内部&#xff0c;因此“不透明指针”即看不到内部定义的指针。这样说有些抽象&#xff0c;我们来看个例子&#xff1a; #include &l…

支付宝 php rsa算法,:PHP支付宝接口RSA验证

这两天一直困扰的PHP RSA签名验证问题终于解决了&#xff0c;由于之前RSA接触的不多&#xff0c;再加上官方至今还未有PHP的SDK可供参考&#xff0c;因此走了一些弯路&#xff0c;写在这里和大家分享。虽然支付宝官方还未提供相关SDK&#xff0c;PHP确实可以实现RSA方式的签名&…

int与string转换

参考&#xff1a; http://greatverve.cnblogs.com/archive/2012/10/24/cpp-int-string.html 转载于:https://www.cnblogs.com/predator-wang/p/4789775.html

更改Jenkins升级站点

更新地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 【图示】&#xff1a;

Android 模仿微信启动动画(转)

本文内容 环境项目结构演示微信启动动画本文演示微信启动动画。请点击此处下载&#xff0c;自行调试。 顺便抱怨一下&#xff0c;实践性&#xff08;与研究性质的相对&#xff09;技术博的“七宗罪”&#xff1a; 第一宗罪&#xff0c;错字连篇&#xff0c;逻辑不清&#xff1b…

navicat for mysql收藏夹

navicat for mysql如果库表非常多的化&#xff0c;每次输入表名比较繁琐。 可以进入收藏夹便于快速打开经常使用的库表。 打开要入收藏夹的表&#xff0c;文件-添加收藏夹。 也可以快捷键shiftctrl1 如果已经有3个占用了&#xff0c;则自动跳到第4个栏位 也可以快捷键shiftctrl…

C 变量的作用域

下面的程序输出什么&#xff1f;思考一下 #include <stdio.h>// Driver Code int main() {{int x 10, y 20;{// The outer block contains// declaration of x and// y, so following statement// is valid and prints// 10 and 20printf("x %d, y %d\n",…

oracle字段重复新增错误,oracle在已有重复数据的列上创建唯一约束

在有重复数据的列上添加unique constraints,大家正常的解决办法就修改重复数据,但也可以 保留重复数据,使约束对以后的数据有限制,不过我们还可以用以下的方法来添加唯一约束. SQL create table aa(num number(6),email varchar2(32)); 表已创建。 SQL insert在有重复数据的列上…

poj_3067 树状数组

题目大意 左右两个竖排&#xff0c;左边竖排有N个点&#xff0c;从上到下依次标记为1,2,...N; 右边竖排有M个点&#xff0c;从上到下依次标记为1,2....M。现在从K条直线分别连接左边一个点和右边一个点&#xff0c;求这K条直线的交点个数&#xff08;左右竖排上的点不算做交点&…

2022-2028年中国自主可控行业深度调研及投资前景预测报告(全卷)

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国自主可控行业市场行业相关概述、中国自主可控行业市场行业运行环境、分析了中国自主可控行…

linux /etc/fstab文件参数求解释

2019独角兽企业重金招聘Python工程师标准>>> # cat /etc/fstab# # /etc/fstab # Created by anaconda on Mon Dec 17 09:06:53 2012 # # Accessible filesystems, by reference, are maintained under /dev/disk # See man pages fstab(5), findfs(8), mount(8) and…