例:将一个文件中的内容写到另外一个文件中。
执行结果:
说明已经成功将一个文件中的内容写到另外一个文件中。
off_t实际上是整型,fd是文件描述符,offset是读写位置的偏移量,whence是位置,它分为三种:SEEK_SET、SEEK_CUR、SEEK_END。
(1)获取文件大小
(2)文件的拓展
例:从文件结尾向后拓展2000个字节。
执行结果:
最后发现文件大小是2015个字节,因为最后的写操作向里面写入了一个字节。
将拓展之后的文件称为空洞文件。
(1)stat命令:查看文件的详细信息
(2)stat函数:
其中path是传入参数,传入的是文件的路径。buf是传出参数。buf是一个结构体指针,函数stat会把数据写到已经准备好的buf指向的结构体中,所以buf是传出参数。stat函数的返回值:如果是0说明成功,如果返回-1说明出错了。
其中st_mode是16位的变量:
用st_mode“与”上相应的掩码就得到了相应的结果。比如st_mode & S_IRWXO,得到的就是代表其他人权限的那3位。
(1)例:stat函数应用:将文件的大小输出出来。
执行结果:
注:命令行参数中argv[0]是当前可执行文件的名字,所以我们要将argv[1]传入stat函数。
如果传入的参数是该文件的一个软链接,那么stat函数仍然会去追踪该文件,所以输出的是该文件的大小,而不是软链接文件的大小:
(2)lstat函数
如果把程序中的stat函数换成lstat函数,那么上面的两个实验会分别输出以下结果:
可以看到如果传入的参数是该文件的一个软链接,那么lstat函数不会去追踪该文件,所以输出的是软链接文件的大小。
此外,这几个命令也分为追踪和不追踪:
truncate函数:文件的拓展
(1)unlink函数作用:删除一个文件的目录项并减少它的链接数,若成功返回0,否则返回-1。如果想通过调用这个函数来成功删除文件,就必须拥有这个文件的所属目录的写和执行权限。
(2)unlink函数使用:
1)如果是符号链接,则删除符号链接
2)如果是硬链接,硬链接数减1,当减为0时,释放数据块和inode。
3)如果文件硬链接数为0,但有进程已打开该文件,并持有文件描述符,则等该进程关闭该文件时,kernel才真正去删除该文件。(利用该特性创建临时文件,先open,然后调用unlink并不会真正删除,接下来还可以对该文件进行读写操作,最后当close文件后,该文件才会真正被删除。)
例:
注:
(1)在执行write(fd, "hello\n", 6);后,文件指针已经不在文件的起始位置了,所以我们要重置文件指针,然后才能从文件中读数据。重置文件指针的函数为:
(2)将读出的内容写到屏幕上,文件描述符为1(标准输出)。
(1)chdir函数、getcwd函数
例:
在进程中修改当前进程的路径到上一级目录,并在上一级目录创建一个文件chdir.txt,然后将当前进程的工作目录打印出来。注:shell的工作目录并没有改变。
执行结果:
(2)mkdir函数
(3)rmdir函数
(4)opendir函数
(5)readdir函数
例:递归读目录获取文件个数
getFileNum函数传入的是目录所在路径,返回的是该目录中的普通文件个数。readdir函数如果返回不为NULL,说明该目录中有目录或者文件,那么进入while循环,while循环会自动地遍历该目录中的文件或目录;否则如果readdir函数返回NULL,说明该目录为空目录,那么就不进入while循环了。while循环退出后,total保存的就是该目录中的普通文件个数。关闭目录,然后返回total。
执行结果:
(1)dup函数返回的是文件描述符表中没有被占用的最小的文件描述符。
比如dup(3),该函数会返回4,因为4是文件描述符表中没有被占用的最小的文件描述符。然后3和4就都是指向该文件的文件描述符了。
(2)dup2(old, new) 如果old和new不同,那么函数返回后,old和new就都是指向old指向文件的文件描述符,并且如果new之前指向打开的文件的话,会先关闭该文件。如果old和new相同的话,该函数无实际操作,直接返回old。
注:当关闭文件时,要用close函数将指向该文件的两个文件描述符都关掉。
函数原型:
当cmd参数是F_GETFL时,我们将arg设为0,那么函数的返回值是上图中F_GETFL右侧的7种之一,表示当前文件的状态。
当cmd参数是F_SETFL时,我们将arg设置为O_开头的宏,那么该文件会设置为相应的状态。
函数的返回值如果为-1代表失败。
例:
执行结果:
可以发现字符串p是从文件的头部开始写,并覆盖原来的内容。将文件状态修改之后,再次输入新内容q,可以发现该内容会追加到旧内容的后面。