LINUX杂谈篇(花10分钟学盲盒知识点)(perror,O_CREAT|O_RDWR,S_IRWXU,lseek, dup,system,struct stat statbuf,常规文件位)

ok 朋友们 废话不多说我们来看看下面的代码吧!

第一题:

if(fd1< 0) {
perror("open :");
printf("errno is:%d \n",errno);

 这段代码是用于处理文件打开失败的情况:

open()函数在打开文件成功时会返回一个非负的文件描述符,如果打开失败会返回-1。
所以这里使用if语句判断文件描述符fd1是否小于0,如果小于0就表示打开失败。
perror函数可以打印出打开失败的错误原因。它会打印出错误码对应的错误字符串,如"No such file or directory"。
同时使用printf打印出具体的错误码errno,这是一个包含系统错误号的全局变量。
不同的错误号代表不同的错误原因,打印出来可以帮助定位问题。

所以总体来说,这段代码的功能是:
如果文件打开失败(fd1<0),则使用perror打印错误原因字符串,同时打印errno数值,以便定位打开失败的具体原因。这是处理文件操作错误的常用方法。
通过打印错误信息可以帮助调试和解决为什么文件打开会失败。

第二题:

fd1=open("file1",O_CREAT|O_RDWR,S_IRWXU);

这段代码是打开一个名为file1的文件进行读写操作,如果文件不存在则创建该文件:

open()函数是Linux系统调用,用于打开文件
 "file1"是待打开的文件名

其中需要知道:
O_CREAT表示如果文件不存在则创建该文件
O_RDWR表示打开文件用于读写
O_CREAT和O_RDWR通过位或|操作合并成一个参数传给open()
S_IRWXU是一个文件权限常量,其值111表示文件所有者具有读写执行权限 
open()成功会返回一个非负的文件描述符fd1
fd1可以在后续进行读写该文件,比如使用read(), write()等函数

所以这段代码的功能是:
如果文件file1存在,打开它用于读写
如果文件file1不存在,则创建该文件,设置权限为所有者读写执行
 返回文件描述符fd1,用于后续通过系统调用进行文件读写操作
通过open()函数打开文件,返回文件描述符进行I/O是Linux程序常见的文件操作方式。

第三题:

lseek(fd2,16,SEEK_SET);
char buf[20]="ABCDEFGHIJKLMN";
fdw2=write(fd2,buf,20);

这段代码是利用文件描述符fd2向文件写入数据:


lseek()函数用于设置/移动文件读写指针位置
fd2是通过open()函数获得的有效文件描述符 
SEEK_SET表示从文件开头开始计算位置


lseek(fd2,16,SEEK_SET)将文件读写指针定位到文件开头的第16个字节位置
buf是字符数组缓冲区,包含20个字节的数据"ABCDEFGHIJKLMN"
write()函数利用文件描述符fd2将buf中的数据写入文件
它会从文件指针位置开始写入,这里是第16个字节
写入数据长度是buf的长度,即20字节


所以这段代码的功能是:
利用文件描述符fd2先通过lseek()将文件指针定位到特定位置(第16字节),然后使用write()将内存缓冲区中的数据写入文件。
通过文件描述符操作读写指针和数据,实现了对文件的随机读写访问。

第四题:

fd1 = dup(fd);
if(fd1 < 0)
perror("dup");

 这段代码是利用dup函数对文件描述符fd进行拷贝:


- dup函数用于拷贝一个现有的文件描述符,返回新的文件描述符
- fd是通过open函数获得的有效文件描述符
- dup(fd)将fd拷贝一份,返回新的文件描述符fd1
- 如果dup返回值fd1小于0,表示拷贝失败
- 然后调用perror函数打印错误信息,告知失败原因


dup函数的作用是:


- 为一个已打开的文件返回一个新的文件描述符
- 新的和原来的文件描述符都引用同一个底层文件
- 通过dup可以为一个文件获得多个文件描述符
- 这些描述符都可以用于对同一个文件的读写操作

所以这段代码是利用dup函数对文件描述符fd进行拷贝,获得新的fd1。如果失败通过perror打印错误原因。
dup很常见于需要同时读写一个文件的场景。

第五题:

system("rm -f file");

 这段代码使用system函数调用了shell命令rm来删除一个文件:


- system函数可以在C程序中调用外部命令(如shell命令)
- rm是Linux/Unix系统下删除文件命令
- -f参数表示即使文件不存在也不输出错误信息
- "rm -f file"是一个shell命令字符串,用于删除名为file的文件
- 该字符串作为参数传给system函数
- system函数会启动一个子进程,在子进程中执行该shell命令
- 如果命令执行成功,system函数返回0,否则返回非零值


所以这段代码的功能是:

利用system函数调用操作系统的rm命令,强制删除名为file的文件,如果文件不存在也不报错。
通过调用外部命令实现文件操作,相比自己编写文件删除代码更简单高效。这是C语言常用的一种执行外部命令的方法。

第六题:

struct stat statbuf;

 struct stat statbuf;
这行代码声明了一个结构体(struct)类型的变量statbuf。

struct stat是Linux系统定义的一个结构体类型,它用于存储文件状态信息。
struct stat包含了文件的各种属性,如:
- 设备号
- 文件类型和模式 
- 链接数
- 用户/组ID
- 文件大小
- 最后访问时间
- 最后修改时间
- 最后状态改变时间
等详细文件信息。
通过声明这个结构体变量statbuf,后续可以使用stat系统调用来获取某个文件(通过文件描述符或者路径)的statbuf信息。
例如:
stat("file", &statbuf);
就可以获取文件file的详细状态信息,并存储在statbuf结构体变量中。
然后通过访问statbuf的各个成员,就可以得到文件大小、类型等各种属性值。
所以这行代码声明了一个结构体变量,用于存储文件状态信息。这在文件操作中很常见。

补充知识点:文件类型的常规文件位

文件类型位(File Type Bits)存储在struct stat结构体的st_mode字段中。
在Linux系统下,文件类型位使用S_IFMT宏定义的文件类型掩码来提取:


#define S_IFMT 0170000 
文件类型位包括:
- S_IFREG: 常规文件(Regular File),该文件包含数据或代码。0x8000
- S_IFDIR: 目录(Directory),0x4000 
- S_IFCHR: 字符设备文件(Character Device File),0x2000
- S_IFBLK: 块设备文件(Block Device File),0x6000
- S_IFIFO: 管道(FIFO/Named Pipe),0x1000
- S_IFLNK: 符号链接(Symbolic Link), 0xa000
- S_IFSOCK: 套接字(Socket), 0xc000
其中,S_IFREG的值0x8000就代表文件类型位中的常规文件标识。
通过与该值进行比对,可以使用S_ISREG宏判断一个文件是否是常规文件类型。
所以在Linux系统中,文件类型位中标识常规文件的具体值就是0x8000,对应S_IFREG这个文件类型常量。
这可以用于识别通过stat获取文件信息后的文件类型。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值