基本接口:
文件读写:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char* pathname,int flags)
int open(const char* pathname,int flags,mode_t mode);
int creat(const char *pathname, mode_t mode)
参数说明:
pathname :要打开的文件名
flags:标志位,指定打开文件的操作方式以及打开时的一些行为。
mode:用于新文件的权限标志位。
返回值:
-1: 操作失败,并设置变量errno的值
不为 -1:文件描述符,
flags参数的取值可以为:
1、O_RDONLY :以只读的方式打开文件
2、O_WRONLY :以只写的方式打开文件
3、O_RDWR : 以读写的方式打开文件
以上三种取值是互斥的,不能同时使用,但是他们可以和以下的取值用或的方式组合起来使用:
1、O_CREAT :如果被打开的文件不存在,就自动穿件这个文件
2、O_EXCL :如果O_CREAT标志已经使用,那么当由pathname参数指定的文件已经存在时,open函数返回失败。如果pathname给出的是一个符号链接,那么无论它指向的文件是否存在,对open函数的调用都会返回失败。
3、O_NOCITY :如果被打开的文件是一个终端设备文件,它不会成为这个进程的控制终端。
4、O_TRUNC :如果被打开的文件存在并且是以可写方式的打开的,则清空文件原有的内容
5、O_APPEND :新写入的内容将被添加在文件原来内容的后面,
6、O_NONBLOCK :被打开的文件将以非阻塞的方式进行操作
O_NONBLOCK一样。7、O_NDELAY : 同
8、O_SYNC :被打开的文件将以同步I/O的方式进行操作,即任何写操作都会同步到硬件设备上。同步完成后,对写函数的调用才会返回。
9、O_NOFOLLOW :如果pathname是一个符号链接,则对open函数的调用将返回失败。
10、O_DIRECTORY :如果pathname不是目录,则对open函数的调用将返回失败。
需要注意的事,open函数有两个原型,其中一个多出了mode,它用于指定创建的新文件的访问权,如果打开的时候使用了O_CREAT标志创建文件,则一般都要给出mode参数,她的一些常用取值如表1.0所示,这些值可以用按位或的方式进行组合使用。新文件的所属用户和所诉组合
S_IRWXU | 00700 | 文件所属用户有读写和执行权限 |
S_IRUSR (S_IREAD) | 00400 | 文件所属用户有读权限 |
S_IMUSR (S_IWRITE) | 00200 | 文件所属用户有写权限 |
S_IXUSR (S_IEXEC) | 00100 | 文件所属用户有执行权限 |
S_IRWXG | 00070 | 组内用户有读写和执行权限 |
S_IRGRP | 00040 | 组内用户有读权限 |
S_IWGRP | 00020 | 组内用户有写权限 |
S_IXGRP | 00010 | 组内用户有执行权限 |
S_IRWXO | 00007 | 其他用户有读写和执行权限 |
S_IROTH | 00004 | 组内用户有读权限 |
S_IWOTH | 00002 | 组内用户有写权限 |
S_IXOTH | 00001 | 组内用户有执行权限 |
因为在调用open函数的时候,O_WRONLY,O_CREAT,O_TRUNC三个标志位经常组合使用,因此由一个专门的函数creat()来实现,如下:
creat(pathname, mode)
实际等价于:open(pathnames,O_WRONLY|O_CREAT|O_TRUNC, mode)
两个不同进程可以同时打开同一个文件,但是他们的文件描述符一般是不一样的,也可以同时对该文件进行读写,只是后面进程写的会覆盖前面进程写的内容。