linux_c 编程:Linux文件操作

1.文件的创建,打开和关闭

  • open系统调用用来打开或创建一个文件。
#include<sys/types.h>
#include<sys/stat.h>
#include<fcnlt.h>
open("filename[N]", int flag)
open("filename[N]", int flag, mode_t mode)
//文件打开成功返回文件描述符fd,打开失败返回-1

第二个参数(文件的打开方式)的宏如下:
- O_RDONLY:只读打开;
- O_WRONLY:只写打开;
- O_RDWR:可读可写;
- O_CREAT:若文件不存在则自动创建,当第二个参数里含有这个宏的时候才会使用第三个参数,也就是给创建的文件附上权限,和之前的chmod函数里面的mode是一样的。
- O_EXCL:如果O_CREAT被设置,此参数也被设置的话,它会检查要创建的文件是否存在,如果不存在的话则创建,存在的话则导致文件打开出错。
- O_TRUNC:如果创建的文件名已经存在,则会将原来的文件里面的数据进行覆盖。原文件中保存的数据将会消失。
- O_APPEND:在对文件进行写的操作的时候,会从原有数据的末尾开始进行写入。
- O_SYNC:数据同步功能,以同步的方式打开文件,任何对文件的修改都会阻塞,直到磁盘上的数据同步以后才会返回。
- O_NOFOLLOW:如果参数filename指的是一符号链接,则会令文件打开失败。
- O_DIRECTORY:如果参数filename指的不是一目录,则会令打开文件失败。
- O_NONBLOCK和O_NDELAY:对于open及随后的对该文件的操作都会立即返回,是非阻塞的。
注意:文件的权限mode实际上是与umask按照&运算之后得到的结果,umaks的内容请参阅鸟哥的linux或自行百度。

  • creat函数用来进行文件的创建
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int creat(const char * pathname, int mode)
//这个函数的参数在此不做赘述。和open基本没有差别
//此函数调用成功会返回一个文件描述符,失败会返回-1
  • close函数用来进行文件的关闭操作
#include<unistd.h>
int close(fd)
//此函数以文件描述符来作为参数,关闭指定的文件
//注意此函数并不能保证文件是否全部被写回磁盘之中
//函数调用成功时返回0,失败时返回-1

2.文件的读写

  • read函数
#include<unistd.h>
int read(fd,char * buf, int size)
//此函数调用成功返回从文件中读到的字节数,调用失败返回-1
//如果返回的是0则表示读到文件的末尾或是无数据可读
//如果实际读到的字节数比要求读到的字节数少,则有可能是读到了文件的末尾或是读操作信号中断。

fd表示文件描述符,size表示要求读到的字节数

3.文件读写指针的移动

  • lseek函数用来移动文件读写指针的位置
#include<sys/types.h>
#include<unistd.h>
int lseek(fd, offset, whence)
//此函数调用成功返回当前的读写位置,调用失败返回-1

offset参数是文件指针所要移动的偏移量,可以是负数,表示向前移动
whence是文件指针的起始位置,whence有三个参数:
SEEK_SET:文件的开始位置
SEEK_CUR:文件的当前位置
SEEK_END:文件的末尾

3.dup,dup2,fcntl函数

  • dup,dup2函数用来复制文件描述符
#include<unistd.h>
int dup(int fd)
int dup2(int oldfd, int newfd)
//dup函数调用成功时返回最小的尚未被调用的文件描述符,失败时返回-1
//返回的新文件描述符与旧文件描述符指向同一个文件,共享所有的锁,读写指针,各项权限或标志位。
//dup2函数可以用参数newfd指定新的文件描述符的数值
//若newfd指定的文件描述符已经被占用,系统就会关闭使用旧的fd的程序释放该文件描述符,若oldfd与newfd相等,则返回newfd,函数调用失败返回-1
  • fcntl函数用来对已打开的文件描述符进行各种控制操作以改变打开文件的各种属性
#include<unistd.h>
#include<fcntl.h>
int fcntl(int fd, int cmd)
int fcntl(int fd, int cmd, long arg)
int fcntl(int fd, int cmd, struct flock * lock)
//fcntl的参数个数根据cmd值的不同而不同,具体有以下几种功能:

F_DUPFD:fcntl的功能和dup的功能一样,都是将fd复制。调用成功返回fd,失败返回-1

F_GETFD:fcntl用来获取文件描述符的close - on - exec的标志调用成功返回标志值,若此标志值的最后一位是0,则该标志没有被设置,及执行了exec相关函数(每个文件描述符都有一个close-on-exec标志。默认情况下,这个标志最后一位被设置为 0。这个标志符的具体作用在于当开辟其他进程调用exec()族函数时,在调用exec函数之前为exec族函数释放对应的文件描述符。)之后文件的描述符还是打开的

F_SETFD:fcntl此时的作用是设置文件描述符的close-on-exec的标志,设置位为第三个参,成功返回0,失败返回-1

F_GETFL:fcntl用来获得文件的打开方式,成功返回标志值,失败返回-1

F_SETFL:fcntl用来设置文件的打开方式,linux下只能设置O_APPEND,O_NONBLOCK(对文件的操作会立即返回,非阻塞),O_ASYNC(数据同步)

  • 对fcntl的应用贴上源码链接:

    https://github.com/championheng/linux-Actual-programming/blob/master/文件系统/fcntl_access.c

  • 文中有错误的地方欢迎大家在评论区指出,共勉。
    由于文件锁比较难懂,我会专门为大家讲一下文件的加锁。

你可能感兴趣的:(编程,linux,系统调用)