linux系统调用和文件操作
- 格式:docx
- 大小:69.39 KB
- 文档页数:4
LinuxC讲解系统调⽤readdir,readdir_r以及如何遍历⽬录下的所有⽂件readdir与readdir_r简要说明readdir可以⽤来遍历指定⽬录路径下的所有⽂件。
不过,不包含⼦⽬录的⼦⽂件,如果要递归遍历,可以使⽤深度遍历,或者⼴度遍历算法。
readdir_r 是readdir的可重⼊版本,线程安全。
readdir因为直接返回了⼀个static的struct dirent,因此是⾮线程安全。
readdir如何遍历⽬录⼦⽂件?1. opendir打开⽬录opendir有2个版本:opendir,fopendir。
前者参数为⽬录对应字符串,后者参数为⽬录对应已打开⽂件描述符。
#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);DIR *fdopendir(int fd);⽤法模型:DIR *dirp;const char *base_dir = "/home/martin/document";if ((dirp = opendir(base_dir)) != NULL) {perror("opendir error");return -1;}// 调⽤readdir遍历⽬录⼦⽂件...closedir(base_dir);2. readdir遍历⽬录⼦⽂件readdir需要⼀个已打开(调⽤opendir)的DIR对象作为参数。
#include <dirent.h>struct dirent *readdir(DIR *dirp);int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);dirent 结构定义struct dirent {ino_t d_ino; /* inode number i节点编号 */off_t d_off; /* not an offset; see NOTES 早期⽂件系统中,telldir返回⽂件在⽬录内的偏移 */unsigned short d_reclen; /* length of this record dirent 记录的实际长度 */unsigned char d_type; /* type of file; not supportedby all filesystem types ⽂件类型 */char d_name[256]; /* filename ⽂件名 */};成员介绍:d_ino i节点编号,操作系统⽤来识别⽂件的,每个⽂件都有⼀个inode number(参见)d_off 早期⽂件系统中,⽂件系统使⽤平⾯表格,telldir返回⽂件在⽬录内的偏移,⽽d_off就代表这个偏移的缓存。
简介⼏种系统调⽤函数:write、read、open、close、ioctl 在 Linux 中,⼀切(或⼏乎⼀切)都是⽂件,因此,⽂件操作在 Linux 中是⼗分重要的,为此,Linux 系统直接提供了⼀些函数⽤于对⽂件和设备进⾏访问和控制,这些函数被称为系统调⽤(syscall),它们也是通向操作系统本⾝的接⼝。
⼀、系统调⽤ 系统调⽤就是 Linux 内核提供的⼀组⽤户进程与内核进⾏交互的接⼝。
这些接⼝让应⽤程序受限的访问硬件设备,提供了创建新进程并与已有进程进⾏通信的机制,也提供了申请操作系统其他资源的能⼒。
系统调⽤⼯作在内核态,实际上,系统调⽤是⽤户空间访问内核空间的唯⼀⼿段(除异常和陷⼊外,它们是内核唯⼀的合法⼊⼝)。
系统调⽤的主要作⽤如下:1)系统调⽤为⽤户空间提供了⼀种硬件的抽象接⼝,这样,当需要读写⽂件时,应⽤程序就可以不⽤管磁盘类型和介质,甚⾄不⽤去管⽂件所在的⽂件系统到底是哪种类型;2)系统调⽤保证了系统的稳定和安全。
作为硬件设备和应⽤程序之间的中间⼈,内核可以基于权限、⽤户类型和其他⼀些规则对需要进⾏的访问进⾏判断;3)系统调⽤是实现多任务和虚拟内存的前提。
要访问系统调⽤,通常通过 C 库中定义的函数调⽤来进⾏。
它们通常都需要定义零个、⼀个或⼏个参数(输⼊),⽽且可能产⽣⼀些副作⽤(会使系统的状态发⽣某种变化)。
系统调⽤还会通过⼀个 long 类型的返回值来表⽰成功或者错误。
通常,⽤⼀个负的值来表明错误,0表⽰成功。
系统调⽤出现错误时,C 库会把错误码写⼊ errno 全局变量,通过调⽤ perror() 库函数,可以把该变量翻译成⽤户可理解的错误字符串。
⼆、⼏种常⽤的系统调⽤函数2.1 write 系统调⽤ 系统调⽤ write 的作⽤是把缓冲区 buf 的前 nbytes 个字节写⼊与⽂件描述符 fildes 关联的⽂件中。
它返回实际写⼊的字节数。
如果⽂件描述符有错或者底层的设备驱动程序对数据块长度⽐较敏感,该返回值可能会⼩于 nbytes。
linux 服务器常用操作命令1.基本命令- pwd:查看当前所在目录- ls:列出当前目录下的文件和文件夹- cd:切换目录- touch:创建文件- mkdir:创建新的目录- rm:删除文件或目录- cp:复制文件或目录- mv:重命名文件或目录,或移动文件或目录到其他位置- cat:查看文件内容- grep:在文件中搜索指定的字符串- find:查找文件并执行相应操作- chmod:修改文件和目录的权限- chown:修改文件和目录的所有者- top:实时查看系统的资源使用情况- ps:显示当前正在运行的进程信息2.文件操作- echo:输出文本内容到终端或文件- head:显示文件的前几行- tail:显示文件的后几行- less:按页查看文件内容- wget:下载文件- tar:打包和解压文件- gzip:压缩文件- unzip:解压缩文件- file:查看文件类型- scp:在本地和远程服务器之间进行文件传输- sftp:通过SSH协议在本地和远程服务器之间进行文件传输3.网络相关- ifconfig:显示网络接口配置信息- ping:测试与指定主机的连通性- netstat:显示网络连接、路由表和网络接口信息- ssh:建立安全的远程登录连接- telnet:建立与远程主机的非安全连接- nslookup:域名解析工具- traceroute:显示数据包在网络上的传输路径- ifup/ifdown:启用/禁用网络接口- iptables:配置防火墙规则4.系统管理- uname:显示系统信息- whoami:显示当前用户- id:显示用户信息- date:显示系统日期和时间- uptime:显示系统的运行时间和平均负载- free:显示内存的使用情况- df:显示磁盘空间的使用情况- du:查看文件和目录的磁盘使用情况- kill:关闭指定进程- reboot:重启系统- shutdown:关闭系统5.用户和权限管理- useradd:创建用户- userdel:删除用户- passwd:修改用户密码- su:切换用户- sudo:以超级用户权限执行命令- visudo:配置sudo的访问权限- chattr:修改文件属性- addgroup:创建用户组- delgroup:删除用户组- chmod:修改文件和目录的权限- chown:修改文件和目录的所有者6.日志管理- tail:实时显示日志文件的最后几行内容- cat:显示整个日志文件的内容- grep:在日志文件中搜索指定的字符串- systemctl:管理系统服务- journalctl:查看系统日志7.进程管理- ps:显示当前正在运行的进程信息- top:实时查看当前系统进程的资源占用情况- kill:终止指定进程- nice:调整进程的优先级- nohup:在后台运行命令,不受终端断开影响- renice:修改进程的优先级这些是Linux服务器常用的操作命令,能够实现大部分日常操作和系统管理任务。
Linux内核中系统调用详解什么是系统调用?(Linux)内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。
用户可以通过系统调用命令在自己的应用程序中调用它们。
从某种角度来看,系统调用和普通的函数调用非常相似。
区别仅仅在于,系统调用由(操作系统)核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。
随Linux核心还提供了一些(C语言)函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。
为什么要用系统调用?实际上,很多已经被我们习以为常的C语言标准函数,在Linux 平台上的实现都是靠系统调用完成的,所以如果想对系统底层的原理作深入的了解,掌握各种系统调用是初步的要求。
进一步,若想成为一名Linux下(编程)高手,也就是我们常说的Hacker,其标志之一也是能对各种系统调用有透彻的了解。
即使除去上面的原因,在平常的编程中你也会发现,在很多情况下,系统调用是实现你的想法的简洁有效的途径,所以有可能的话应该尽量多掌握一些系统调用,这会对你的程序设计过程带来意想不到的帮助。
系统调用是怎么工作的?一般的,进程是不能访问内核的。
它不能访问内核所占内存空间也不能调用内核函数。
(CPU)(硬件)决定了这些(这就是为什么它被称作"保护模式")。
系统调用是这些规则的一个例外。
其原理是进程先用适当的值填充(寄存器),然后调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。
在(Intel)CPU中,这个由中断0x80实现。
硬件知道一旦你跳到这个位置,你就不是在限制模式下运行的用户,而是作为操作系统的内核--所以你就可以为所欲为。
进程可以跳转到的内核位置叫做sysem_call。
这个过程检查系统调用号,这个号码告诉内核进程请求哪种服务。
然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。
linux命令操作手册一、文件操作1.1 创建文件:使用touch命令可以创建一个空文件,语法为“touch 文件名”。
1.2 编辑文件:使用文本编辑器(如vi、nano等)可以编辑文件,语法为“编辑器文件名”。
1.3 复制文件:使用cp命令可以复制文件,语法为“cp 源文件目标文件”。
1.4 移动文件:使用mv命令可以移动文件,语法为“mv 源文件目标目录”。
1.5 删除文件:使用rm命令可以删除文件,语法为“rm 文件名”。
二、目录操作2.1 创建目录:使用mkdir命令可以创建目录,语法为“mkdir 目录名”。
2.2 删除目录:使用rmdir命令可以删除目录,语法为“rmdir 目录名”。
2.3 移动目录:使用mv命令可以移动目录,语法为“mv 目录名目标目录”。
2.4 复制目录:使用cp命令可以复制目录,语法为“cp -r 源目录目标目录”。
三、文本操作3.1 查看文件内容:使用cat命令可以查看文件内容,语法为“cat 文件名”。
3.2 编辑文件内容:使用文本编辑器(如vi、nano等)可以编辑文件内容。
3.3 查找文本:使用grep命令可以查找文本,语法为“grep '查找内容' 文件名”。
3.4 替换文本:使用sed命令可以替换文本,语法为“sed 's/查找内容/替换内容/g' 文件名”。
四、压缩与解压4.1 压缩文件:使用tar命令可以压缩文件,语法为“tar -czvf 压缩文件名.tar.gz 源文件或目录名”。
4.2 解压文件:使用tar命令可以解压文件,语法为“tar -xzf 压缩文件名.tar.gz”。
五、文件查找5.1 查找文件:使用find命令可以查找文件,语法为“find 查找路径-name '文件名'”。
5.2 查找目录:使用find命令可以查找目录,语法为“find 查找路径-type d -name '目录名'”。
Linux基本命令及其应用Linux是一种类Unix操作系统,具有高度的开放性和灵活性。
作为一名Linux用户,我们需要熟悉Linux基本命令及其应用,以便能够很好地管理和维护系统。
本篇论文将介绍常用的Linux基本命令及其应用,包括文件与目录操作、用户和权限管理、进程和系统状态管理等。
一、文件与目录操作1. pwd:查看当前工作目录2. cd:切换目录3. ls:列出目录中的所有文件和子目录4. mkdir:创建新目录5. touch:创建空文件或改变文件的修改时间6. rm:删除指定的文件或目录7. cp:复制文件或目录8. mv:移动文件或目录二、用户和权限管理1. useradd:添加新用户2. userdel:删除用户3. passwd:更改用户密码4. groupadd:添加新用户组5. groupdel:删除用户组6. chown:更改文件或目录的所有者7. chmod:更改文件或目录的访问权限三、进程和系统状态管理1. top:监控进程和系统资源的使用情况2. ps:列出当前运行的进程3. kill:终止指定进程4. free:查看系统内存使用情况5. df:查看文件系统使用情况6. netstat:查看网络状态信息以上是常用的Linux基本命令及其应用,在实际应用中,还需要结合具体的环境和任务,进行深入的学习和应用。
下面将举例说明Linux基本命令的具体应用。
1.文件与目录操作在实际应用中,我们常常需要对文件进行复制、移动、重命名等操作,下面以复制文件为例进行说明。
假设当前目录下有一个文件test.txt,需要将其复制到/tmp目录中,可以使用cp命令:cp test.txt /tmp/如果需要复制整个目录,可以使用cp命令的-r选项:cp -r /home/user/test /tmp/2.用户和权限管理在实际应用中,我们需要为不同的用户分配不同的权限,以保护系统的安全性。
下面以创建新用户为例进行说明。
linux 系统调用流程Linux系统调用流程一、引言Linux是一种自由开源的操作系统,其核心部分是内核。
内核负责管理计算机的硬件资源,并提供各种系统调用供用户程序使用。
本文将介绍Linux系统调用的流程,包括用户程序如何通过系统调用接口向内核发起请求以及内核如何处理这些请求。
二、系统调用的定义系统调用是用户程序与内核之间的接口。
用户程序通过调用特定的系统调用函数来请求内核执行某些操作,例如读写文件、创建进程等。
内核接收到这些请求后,会进行相应的处理并返回结果给用户程序。
三、系统调用的流程1. 用户程序发起系统调用请求用户程序通过调用系统调用函数向内核发起请求。
这些系统调用函数通常由C库提供,并在用户程序中使用。
用户程序需要提供相应的参数,以告知内核所需的操作类型和操作对象。
2. 用户程序转入内核态用户程序发起系统调用请求后,会进入内核态。
在内核态下,用户程序的权限更高,可以执行一些普通用户无法执行的操作,例如访问硬件资源。
3. 内核处理系统调用请求内核接收到系统调用请求后,会根据请求的类型和参数进行相应的处理。
内核会首先检查请求的合法性,验证用户程序的权限和参数的有效性。
如果请求合法,内核会执行相应的操作;如果请求非法,内核会返回错误信息给用户程序。
4. 内核执行系统调用操作内核根据系统调用请求的类型和参数执行相应的操作。
例如,如果用户程序请求打开一个文件,内核会检查文件是否存在,并分配相应的文件描述符。
如果用户程序请求创建一个进程,内核会为进程分配资源并初始化进程上下文。
5. 内核返回结果给用户程序内核在执行完系统调用操作后,会将结果返回给用户程序。
如果操作成功,内核会返回相应的数据或完成状态;如果操作失败,内核会返回错误码,用户程序可以根据错误码进行相应的处理。
6. 用户程序继续执行用户程序在接收到内核返回的结果后,会根据结果进行相应的处理。
如果操作成功,用户程序可以继续执行后续的逻辑;如果操作失败,用户程序可以根据错误码采取相应的措施,例如重新尝试或向用户报告错误信息。
Linux(CC++)下的⽂件操作open、fopen与freopenopen是下的底层系统调⽤函数,fopen与freopen c/c++下的标准I/O库函数,带输⼊/输出缓冲。
linxu下的fopen是open的封装函数,fopen最终还是要调⽤底层的系统调⽤open。
所以在linux下如果需要对设备进⾏明确的控制,那最好使⽤底层系统调⽤(open),open对应的⽂件操作有:close, read, write,ioctl 等。
fopen 对应的⽂件操作有:fclose, fread, fwrite, freopen, fseek, ftell, rewind等。
freopen⽤于重定向输⼊输出流的函数,该函数可以在不改变代码原貌的情况下改变输⼊输出环境,但使⽤时应当保证流是可靠的。
详细见第3部分。
-------------------------------------------------------------------------------------------------------------------open和fopen的区别:1,fread是带缓冲的,read不带缓冲.2,fopen是标准c⾥定义的,open是POSIX中定义的.3,fread可以读⼀个结构.read在linux/unix中读⼆进制与普通⽂件没有区别.4,fopen不能指定要创建⽂件的权限.open可以指定权限.5,fopen返回⽂件指针,open返回⽂件描述符(整数).6,linux/unix中任何设备都是⽂件,都可以⽤open,read.-------------------------------------------------------------------------------------------------------------------1、open系统调⽤(linux)需要包含头⽂件:#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>函数原型:int open( const char * pathname, int oflags);int open( const char * pathname,int oflags, mode_t mode);mode仅当创建新⽂件时才使⽤,⽤于指定⽂件的访问权限。
Linux文件系统操作命令Linux文件系统操作命令大全Linux命令有很多,那么Linux文件系统操作命令又有哪些呢?下面YJBYS店铺为你介绍!文件系统操作命令:1. cat:可以显示文件的内容(经常和more搭配使用),或将多个文件合并成一个文件。
2. chgrp:用来改变文件或目录所属的用户组,命令的参数以空格分开的要改变属组的文件列表,文件名支持通配符,如果用户不是该文件的所有者,则不能改变该文件的所属组。
3. chmod:用于改变文件或目录的访问权限,该命令有两种用法:一种是使用图形化的方法,另一种是数字设置法。
4. chown:用来将指定用户或组为特定的所有者。
用户可以设置为用户名或用户ID,组可以是组名或组ID。
特定的文件是以空格分开的可以改变权限的文件列表,文件名支持通配符。
5. clear:用来清除终端屏幕。
6. cmp:用来比较两个文件的大小。
7. cp:(copy)可以将文件或目录复制到其他目录中,就如同Dos 下的copy命令一样,功能非常强大。
在使用cp命令时,只需要指定源文件名或目标目录即可。
8. cut:用来移除文件的部分内容。
9. diff:用来找出两个文件的不同之处。
10. du:用来显示磁盘的剩余空间的大小。
11. file:用来显示文件的类型。
12. find:用来在目录中搜索文件,并执行指定的操作。
13. head:只查看文件的头几行内容,而不必浏览整个文件。
14. ln:可以在文件之间创建链接,实际上是给某个文件指定一个访问它的别名。
15. less:用法与more类似,可以查看超过一屏的文件内容,不同的是less除了可以按空格键向下显示文件外,还可以利用方向键来滚动显示文件,要结束浏览,只要在less的提示符“:”后按Q即可。
16. locate:可用于查找文件,且比find命令的搜索速度快。
17. ls(list):用来显示当前目录中的文件和子目录列表。
linux 系统调用号表Linux系统调用号表是一个非常重要的概念,它提供了Linux操作系统中各种系统调用的编号及其对应的功能。
系统调用是操作系统提供给用户程序使用的一组接口,通过系统调用,用户程序可以请求操作系统执行特定的功能,如文件操作、进程管理等。
Linux系统调用号表是一个包含了众多系统调用的列表,每个系统调用都有一个唯一的编号。
这个编号是操作系统内部用来标识不同系统调用的方式之一。
通过使用系统调用号,用户程序可以向操作系统发起请求,告诉操作系统需要执行哪个系统调用。
在Linux系统中,系统调用号表是以数组的形式存在的。
数组的每个元素对应一个系统调用,其值为该系统调用的编号。
通过查阅系统调用号表,用户程序可以获知每个系统调用的编号,从而方便地使用系统调用提供的功能。
系统调用号表的设计是经过精心考虑的,每个系统调用的编号都是根据其功能特点和使用频率来确定的。
编号的分配是有一定规律的,相似功能的系统调用通常会有相近的编号,这样可以方便用户程序记忆和使用。
系统调用号表的设计是为了方便用户程序开发者使用系统调用,提供了一种统一的方式来标识和调用系统调用。
通过使用系统调用号表,用户程序可以直接通过编号来调用系统调用,而不需要知道系统调用的具体名称和实现细节。
Linux系统调用号表是Linux操作系统中一个重要的数据结构,它提供了系统调用的编号及其对应的功能。
通过使用系统调用号表,用户程序可以方便地调用系统调用,从而实现各种功能。
这个表的设计是经过精心考虑的,以方便用户程序的开发和使用。
无论是文件操作、进程管理还是其他功能,系统调用号表都为用户程序提供了一个统一的接口。
零、本课程能学到的内容
1、文件系统及文件的IO操作。
2、linux的多进程编程。
3、linux的多线程编程。
4、进程及线程之间的同步和异步通信
5、linux的网络编程(编写服务器、客户端、TCP、UDP程序)。
一、linux的系统调用
用户程序通过软中断的方式,让cpu切换到内核态运行,数据就借此传输。
对于CPU来说,它不知道现在运行是用户程序还是内核程序。
软中断后,cpu根据拿到的数据,进行特定的任务,然后退出中断,将任务的结果交回给用户程序。
这个任务如何描述?是通过数字来编号的。
例子:写一个打印字符串的程序,通过系统调用来完成。
需要传递的参数有:指向字符串的指针(字符串的首地址),字符串的长度。
汇编写法
用int $0x80产生软中断
C的写法
直接使用syscall函数(它的本质就是用软中断来产生系统调用)
系统调用编号见:/usr/include/asm/unistd_32.h里
一共有358个。
其中,4号对应的write调用。
二、linux文件系统基础
扇区(sector):磁头读取的最小单位数据,在磁盘上类似一个扇子的形状。
一般是512个字节。
块(block):软件读取磁盘的最小单位数据,一般来说是扇区的2的n次幂大小,常用的有4096个字节。
块就是文件存放的最小单位。
如果有一个文件是15045个字节,那么就分成4个块存储,最后那个块的数据是不满的。
可以用数组的方式将一个文件的所有数据块的编号保存起来。
这个数组多大合适?
前提是数组大小要固定,才好管理。
用一个15元素的数组来保存数据块的编号。
其中0-11元素,保存数据块的前面12个,第12个元素是一个一级指针,指向另一个表格,那个表格是4096字节,可以保存1024个块的编号。
如果还不够,第13个元素是一个二级指针,指向的那个表格是一级指针表格。
14个元素是三级指针,指向的表格是二级指针表格。
全部用完可以存储2G大小的文件的数据块编号。
在文件系统内部,如何来表示一个文件呢?
用一个inode结构体来表示一个文件。
inode是index node的意思。
也叫索引节点。
一个索引节点对应一个文件,有多少个文件就有多少个索引节点。
inode结构体里面有文件的大小、文件的修改时间、文件的权限、文件的数据块的编号数组。
inode结构体数组保存了所有文件的inode,这个数组的下标就是inode编号。
文件名或者目录名保存目录文件的数据块里面。
在linux里面,一个目录也是一个文件,叫做目录文件,其它的叫做普通文件。
目录文件里就有,inode编号和文件名的对应关系。
那么,给出文件路径时,如何找到这个文件的数据块?
/usr/include/stdio.h
首先,找到根目录的数据块,从里面找到文件和inode编号关系表,
例如usr 这个文件名和inode编号为10002是对应的,那么就到inode结构体数组里找出下标为10002的元素,得到对应文件usr的数据块,因为usr也是一个文件夹,既然是文件夹,它的数据块里面也会有关系表,就可以找到include这个文件的数据块,最后找到stdio.h的数据块,这个是一个普通文件,就把它的数据块全部取出来。
这里搜索的起点是根目录的数据块,那么这个文件的数据块到哪里找?
在一个磁盘里面,最开始的几个块,存储了本磁盘的很多重要数据,例如块的大小,有哪些inode下标空闲,哪些已经用了,最重要的是根目录的数据块。
所有的参数存放在其中的一个块,这个块叫做超级块(super block)。
在磁盘格式化,实际就是生成一个超级块。
这个块的重要性毋庸置疑,如果数据被损坏,则磁盘没办法使用。
三、打开文件
在linux里面,用open函数就可以打开一个文件。
函数原型:int open(const char * path, int flag)
函数如果打开成功,则返回一个文件描述符f ile d escribtor,这个描述符fd是一个非负整数。
1、文件描述符
在文件被打开后,需要用一个结构体来描述这个被打开的文件。
这个结构体是struct file。
它包含了文件的读写指针、文件的长度、文件的属主等等重要属性。
另外,对于任意一个程序(进程),还有一个结构体,描述当前程序打开的所有文件。
struct files_struct
fd就是fd_array数组的下标。
打开一个文件后,生成一个struct file来保管文件的属性,然后将该结构体的首地址放到fd_array数组里面的一个空闲的位置,然后将该元素的下标返回。
下次如果要访问这个文件,直接拿着下标去找就行了。
需要说明的是,对于任意一个程序来说,一般都会默认打开三个文件,键盘输入端、屏幕输出端、错误输出端。
它们的编号分别为0,1,2。
在我们用open打开一个文件的时候,一般会在描述符里面找出一个最小的空闲描述符作为文件的描述符。
利用这个技术,可以人为的关闭屏幕输出端1,然后再打开另外一个文件,这个时候,printf就会自动将文字输出那个文件里。
2、错误代码
在系统调用失败的时候,系统会自动往一个全局变量写一个数据,就是错误代码。
这个全局变量是int errno。
单单看这个变量是没意义的,必须要解读。
可以用strerror(errno)来将这个数据解读成一个字符串。
errno需要包含errno.h头文件,strerror需要包含string.h。
另外还可以使用perror来打印错误信息。
小结:
1、用户程序通过系统调用的方式让内核执行特定的任务,系统调用是通过软中
断实现的。
2、系统内部用inode来唯一确定一个文件。
3、文件打开后,用struct file结构体来描述这个文件的属性,对于程序(进程而
言),有一个struct files_struct结构体描述程序打开的所有文件,里面的fd_array数组保存着指向各个struct file的指针,open的返回值就是fd_array 数组的最小可用下标。
4、默认的文件描述符0-输入,1-输出,2-错误输出。
5、出错后,errno这个全局变量会保存错误的代码,用strerror可用解读出信息。