对文件学习有了一定的了解,想整理一下文件所学所用到的一些函数。
1.
在设计程序是可依靠上述两个函数对文件访问权限进行修改。
由shell命令中man 2 chmod可看出chmod和fchmod的区别就是对文件的操作中chmod以文件名为条件,而fchmod以文件描述符做条件。
然后凭借第二参数mode对文件修访问权限进行指定的修改,其上便是mode具有的宏和其作用。
2.
(1)open函数用来打开或创建一个文件(pathname为打开或创建的文件名,flags为宏定义,对应open函数的几种作用),比如打开文件时可以因flags的值来确定文件是只读还是只写或是读写均可。
当flags使用O_CREAT则是创建一个文件,此时会用到mode,以说明文件的存取权限。
××××××新文件的实际存取权限是mode和umask按照(mode & ~umask)运算之后的结果来确定新文件的访问权限。××××××
(2)create函数较为特殊,说是可打开且可创建文件,实际都是新建文件,creat函数中pathname指向的文件若不存在则创建一个新文件,若指向的文件存在则用新文件覆盖旧文件。实际两则都相当与创建了一个新文件,所以无论怎样操作creat函数打开的文件中并没有数,所以×××creat只能以只写模式打开文件×××。且其创建函数的实际权限与open相同。
(3)
close用来关闭一个 已经打开的文件,该文件由文件描述符fd决定。
3.文件的读写
(1)
read函数用来从打开的文件中读取数据,文件描述符fd得到后,对相应的文件进行读取,读取count个字节的数据到buf中。read返回实际读取字节的大小(可以此作为判断条件)。
(2)
看参数就知道,write只是用来从打开的文件中写如数据,将count个字节的buf中的数据写入fd指向的文件中。
4.
lseek可以用来移动文件读写指针的位置。
SEEEK_SET,SEEK_CUR,SEEK_END分别是从文件开始处,文件当前位置和文件结尾处开始计算偏移量。
lseek(int fildes,0,SEEK_SET) 将文件读写指针移动到文件开始处
lseek(int fildes,0,SEEK_END) 将文件读写指针移动到文件结尾处
lseek(int fildes,0,SEEK_CUR) 获取文件读写指针当前位置(相对文件开头的偏移)
5.
dup和dup2都用来复制oldfd指向的文件描述符。
dup返回最小的未被使用的文件描述符,返回的文件描述符和oldfd指向同一个文件。(共享所有的锁定,读写指针和各项权限或标志位)。
dup2则是以newfd代替dup中的最小未被使用的文件描述符。若newfd由指向则先释放其指向的文件在进行操作。
6.
fcntl可以用来对已打开的文件操作符进行各种控制操作以及改变已打开的文件的各种属性。
F_SETFL对已打开的文件进行操作,将其设置为第三个参数arg指定的打开方式(只包含O_APPEND,O_NONBLOCK,O_ASYNC)。
F_GETFL可以获得文件的打开方式,以标志值的方式返回。
(标志值与文件权限的r=4,w=2,x=1有相似)。
fcntl还可做文件锁作用
若作文件锁则第三个参数指向struct flock *lock
了l_type用来设置读锁(F_RDLCK)和写锁(F_WRLCK)。写锁只可单独使用,若有写锁则不可在加写锁或读锁,若有读锁则可继续加读锁但不可添加写锁。
F_SETLK,当设置读锁时fd指向的文件必须以可读方式打开,当设置写锁时必须以可写方式打开,当设置两种锁时必须以可读可写方式打开。
F_SETLKW 与F_SETLK功能类似,当不同的锁因为其他的锁被阻止时,会等待相冲突的锁被释放。
7.
这三个函数都是为了获得文件的详细信息储存在结构体buf中,不同的是stat和lstat以文件名访问,fstat以文件描述符访问。
stat和lstat的区别是,假设有一快捷方式,stat读取的是快捷方式指向的文件的本身状态信息,而lstat旧读取快捷方式本身的文件状态信息。
8. 设置文件属性
(1)
此三个函数的区别与上述三个函数的区别相同。
chown会将path指向的文件所有者id更改为参数owner代表的用户id,将文件所有者的组id改变为group代表的id。
(文件的所有者只能改变文件的组id为其所属组中的一个,超级用户才可以随意修改id)
(2)
truncate函数将path指向的文件大小修改为参数length指定的大小。若length大于原本的文件则会扩展文件大小,在扩展的区域用0填满。若length小于原本文件的大小,则超出的部分会被删除。
(3)
utime用于改变热和文件的存取时间和修改时间。若buf是一个空指针,则改变其存取时间和修改时间为当前时间。若buf不为空,则改变其时间为buf中的值。
(4)
umask函数可以修改进程的umask{新文件的实际存取权限是mode和umask按照(mode & ~umask)运算之后的结果来确定新文件的访问权限} 就是修改大括号中的umask的值。
9.文件的删除和移动
(1)
rename会将参数中oldpath所指定的文件名改为参数newpath指定的文件名,也可以写为详细地址,若地址不同则会移动文件,改名和移动文件可以通过该函数一次性完成。
(2)
unlink可以实现对文件的删除,但是只删除文件本身,并不会对其链接的文件进行删除。
10.目录操作
(1)
mkdir创建一个目录,pathname威信件目录的目录名,mode(mode & ~umask)为其权限。
(2)
rmdir删除目录。
(3)
getcwd函数可以将当前工作目录的绝对路径复制到buf参数中。
(4)
chdir函数将当前工作目录改变为path指定的目录。chdir只影响调用该函数的进程,对于其他进程则修改不了。(不能随意切换工作目录)
(5)
opendir用来代开参数name指向的目录,并返回DIR*型的目录流,类似于文件描述符。
(6)
readdir用来从参数dir所指向的目录中读取目录项信息,函数执行成功返回下一个文件的信息,若目录中文件已全部被访问过则返回NULL。
(7)
closedir用来关闭参数dir指向的目录。