学习笔记 4

发布时间:2022-07-03 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了学习笔记 4脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

学习笔记 4

第七章 文件操作#

7.1 文件操作级别

按照从低到高的顺序排列如下:

1. 硬件级别

  • Fdisk:将硬盘、U盘或SDc盘分区
  • mkfs:格式化磁盘分区,为系统做好准备
  • fsck:检查和维修系统
  • 碎片整理:压缩文件系统中的文件

2. 操作系统内核中的文件系统函数 注:前缀k表示内核函数。 3. 系统调用 用户模式程序使用系统调用来访问内核函数。 oPEn()、read()、lseek()和 close()函数都是c语言库函数。每个库函数都会发出一个系统调用,使进程进入内核模式来执行相应的内核函数。 4. I/O库函数 系统调用可让用户读/写多个数据块,这些数据块只是一系列字节。用户通常需要读/写单独的字符、行或数据结构记录等。如果只有系统调用,用户模式程序则必须自己从缓冲区执行这些操作。大多数用户会认为这非常不方便。为此,C语言库提供了一系列标准的I/O函数,同时也提高运行效率 I/O库函数包括: FILE mode I/O:fopen(),fread(); fwrITe(),fseek(),fclose(),fflush() char mode I/O:gete(), getchar(),ugete(); putc(),putchar() line mode I/O:gets(),fgets0; puts(),fputs() formatted I/O:scanf(),fscanf(),sscanf(); PRintf(),fprintf(),sprintf() 除了读/写内存位置的sscanf0/sprintf0函数之外,所有其他I/O库函数都建立在系统调用之上,它们最终会通过系统内核发出实际数据传输的系统调用。 5. 用户命令 用户可以使用Unix/Linux命令来执行文件操作,而不是编写程序。如:mkdir,rmdir,cd,pwd,ls,link,unlink,rm,cat,cp,mv,chmod,etc. 每个用户命令实际上是一个可执行程序(cd除外)。 6. sh 脚本 虽然比系统调用方便很多,但是必须要手动输入命令。

7.2 文件I/O操作

文件I/O操作示意图:

学习笔记 4

双线上方的上部分表示内核空间,下半部分表示进程的用户空间。该图显示了进程读/写文件流时的操作序列。

7.3 低级别文件操作

1. 分区 一个块存储设备,如硬盘、U盘SD卡等,可以分为几个逻辑单元,称为分区。各分区均可以格式化为特定的文件系统,也可以安装在不同的操作系统上。大多数引导程序,如 GRub、LILO等,都可以配置为从不同的分区引导不同的操作系统。分区表位于第一个扇区的字节偏移446(0xIBE)处,该扇区称为设备的主引导记录(mbr)。表有4个条目,每个条目由一个16字节的分区结构体定义。

(1)在Linux下,创建一个名为mydisk的虚拟磁盘映像文件。 dd if=/dev/zero of=mydisk bs=1024 count=1440

学习笔记 4

dd是一个将1440(1KB)个0字节块写入目标文件mydisk的程序。 (2)在磁盘映像文件上运行fdisk: fdisk mydisk

学习笔记 4

2. 格式化分区 fdisk只是将一个存储设备划分为多个分区。每个分区都有特定的文件系统类型,但是分区还不能使用。为了存储文件,必须先为特定的文件系统准备好分区。该操作习惯上称为格式化磁盘或磁盘分区。在Linux中,它被称为mkfs,命令: 在一个nblocks设备上创建一个TYPE文件系统,每个块都是bsize字节。如果bsize未指定,则默认块大小为1KB。

7.4 EXT2 文件系统简介

  1. 数据结构 在Linux下,我们可以创建一个包含简单EXT2文件系统的虚拟磁盘。 dd if=/dev/zero of=mydisk bs=1024 count=1440 mke2fs -b 1024 mydisk 1440 得到的EXT2文件系统有1440个块,每个块大小为1KB。
  2. Block#0:引导块,文件系统不会使用它。它用于容纳从磁盘引导操作系统的引导程序。 Block#1: 超级块(在硬盘分区中字节偏移量为1024)。用于容纳关于整个文件系统的信息。 Block#2:块组描述符(硬盘上的s _ First _ data _ blocks-1) EXT2将磁盘块分成几个组,每个组有8192个块(硬盘上的大小为32K) Block#8:块位图(Bmap) 位图用来表示某种项的位序列。0表示对应项处于FREE状态,1表示处于IN _ USE状态。1个软盘有1440个块,但Block#0未被文件系统使用,所以对应位图只有1439个有效位,无效位视作IN _ USE处理,设置为1. Block#9:索引节点位图(Imap) 一个索引节点就是用来代表一个文件的数据结构。EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用B9 中 Imap中的一个位表示。在EXT2 FS 中,前10个索引节点是预留的。所以,空EXT2FS的Imap 以10个1开头,然后是0。无效位再次设置为1。 Block#10:索引(开始)节点块(bg _ inode _ table) 每个文件都用一个128字节(EXT4中的是256字节)的独特索引节点结构体表示。

第八章 使用系统调用进行文件操作

8.1、8.2 系统调用###

在操作系统中,进程以两种不同的模式运行,即内核模式和用户模式,简称Kmode和 Umode。在Umode中,进程的权限非常有限。它不能执行任何需要特殊权限的操作。特殊权限的操作必须在Kmode下执行。系统调用(简称Syscall)是一种允许进程进入Kmode以执行Umode不允许操作的机制。复刻子进程、修改执行映像,甚至是终止等操作都必须在内核中执行。

  • 查看系统调用手册页:man 2 stat

    学习笔记 4

8.3 使用系统调用进行文件操作

系统调用必须由程序发出。它们的用法就像普通函数调用一样。每个系统调用都是一个库函数,它汇集系统调用参数,并最终向操作系统内核发出一个系统调用。例如: int syscall(int a,int b,int c,int d); 其中,第一个参数a是系统调用编号,b、c、d是对应内核函数的参数。内核的系统调用处理程序根据系统调用编号将调用路由到一个相应的内核函数。当进程结束执行内核函数时,会返回到用户模式,并得到所需的结果。返回值≥0表示成功,-1表示失败。如果失败,errno变量(在errno.h中)会记录错误编号,它们会被映射到描述错误原因的字符串。

  • 简单的系统调用: access:检查对某个文件的权限 int access(char *pathname, int mode); chdir:更改目录 int chdir(const char *path); chmod:更改某个文件的权限 int chmod(char *path, mode_t mode); chown:更改文件所有人 int chown(char *name, int uid, int gid); chroot:将(逻辑)根目录更改为路径名 int chroot(char *pathname); getcwd:获取CWD的绝对路径名 char *getcwd(char *buf, int size); mkdir创建目录 int mkdir(char *pathname, mode_t mode); rmdir:移除目录(必须为空) int rmdir(char *pathname); link:将新文件名硬链接到旧文件名 int link(char *oldpath, char *newpath); unlink:减少文件的链接数;如果链接数达到0,则删除文件 int unlink(char *pathname); syMLink:为文件创建一个符号链接 int symlink(char *oldpath, char *newpath); rename:更改文件名称 int rename(char *oldpath,char *newpath); utime:更改文件的访问和修改时间 int utime(char *pathname, struct utimebuf *time) 以下系统调用需要超级用户权限。 mount:将文件系统添加到挂载点目录上 int mount(char *specialfile,char *mountDir); umount:分离挂载的文件系统 intumount(char *dir); mknod:创建特殊文件 int mknod(char *path,int mode, int device);

8.4 常用的系统调用

stat:获取文件状态信息

int stat(char *filename, struct stat *buf)  
int fstat(int filedes,struct stat *buf)  
int 1stat(char *filename,struct stat *buf)  

open:打开一个文件进行读、写、追加 close:关闭打开的文件描述符 int close(int fd) read:读取打开的文件描述符 int read(int fd, char buf[ ],int count) write:写人打开的文件描述符 int writelint fd,char buf[ ], int count) lseek:重新定位文件描述符的读/写偏移量 int 1seek(int fd, int offset, int whence) dup:将文件描述符复制到可用的最小描述符编号中 int dup(int olDFd); dup2:将oldfd复制到newfd中,如果newfd已打开,先将其关闭 link:将新文件硬链接到旧文件 int link(char *oldPath,char *newPath) unlink:取消某个文件的链接;如果文件链接数为0,则删除文件 int unlink(char *pathname); symlink:创建一个符号链接 int symlink(char *target,char *newpath) readlink:读取符号链接文件的内容 int readlink(char *path, char *buf,int bufsize) umask:设置文件创建掩码;文件权限为(mask&~umask) int umask(int umask);

8.5 链接文件

Unix/Linux允许使用不同的路径名来表示同一个文件。这些文件叫作LINK文件。链接有两种类型:硬链接和软链接(符号链接)

  • 硬链接 命令 ln oldpath newpath 创建从newpath到oldpath的硬链接。硬链接文件会共享文件系统中相同的文件表示数据结构(索引节点)。文件链接数会记录链接到同一索引节点的硬链接数量。硬链接仅适用于非目录文件。否则,它可能会在文件系统名称空间中创建循环。系统调用: unlink(char *pathname) 会减少文件的链接数。如果链接数变为0,文件会被完全删除。这就是rm(file)命令的作用。
  • 软链接 命令 ln -s oldpath newpath 创建从newpath到oldpath的软链接或符号链接。newpath是LNK类型的普通文件,包含oldpath字符串。软链接适用于任何文件,包括目录。软链接在以下情况下非常有用。 (1)通过一个较短的名称来访问一个经常使用的较长路径名称。 (2)将标准动态库名称链接到实际版本的动态库。

8.6 stat系统调用

stat/lstat/fstat系统调用可将一个文件的信息返回。 stat按文件名统计指向文件,并在缓冲区中填写stat信息。 lstat与stat相同,除非是符号链接,统计链接本身,而不是链接所引用文件。区别:stat遵循链接,lstat不遵循。 fstat与stat相同,也只在文件名处说明filedes(由open(2)返回)所指向的打开文件。

8.7 open-close-lseek系统调用

open:打开一个文件进行读、写、追加 int open(char *file, int flags,int mode); close:关闭打开的文件描述符 int close(int fd); read:读取打开的文件描述符 int readlint fd, char buf[ 1,int count); write:写人打开的文件描述符 int writelint fd, char buf[ ],int count); lseek:将文件描述符的字节偏移量重新定位为偏移量 int 1seek(int fd, int offset, int whencel; umask:设置文件创建掩码;文件权限为(mask&~umask)

8.8 read()系统调用

read()将n个字节从打开的文件描述符读入用户空间中的buf[]。返回值是实际读取的字节数,如果read()失败,会返回-1。

8.9 write()系统调用

write()将n个字节从用户空间中的buf[]写人文件描述符,必须打开该文件描述符进行写、读写或追加。返回值是实际写入的字节数,通常等于n个字节,如果write()失败,则为-1。

问题与解决思路

问题一:在下载manpages时报错显示无法获得锁####

学习笔记 4

百度得知,在ubuntu系统的termial下,用apt-get install 安装软件的时候,如果在未完成下载的情况下将terminal close。此时 apt-get进程可能没有结束。结果,如果再次运行apt-get install 命令安装如今,可能会发生下面的提示: 无法获得锁 /VAR/lib/dpkg/lock - open (11: 资暂时不可用) 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它? 解决方法

  1. 终端输入 ps aux ,列出进程。找到含有apt-get的进程,直接sudo kill PID。

  2. 强制解锁,命令:

    sudo rm /var/cache/apt/Archives/lock sudo rm /var/lib/dpkg/lock

    学习笔记 4

脚本宝典总结

以上是脚本宝典为你收集整理的学习笔记 4全部内容,希望文章能够帮你解决学习笔记 4所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。