文件权限
①可读 r
②可写 w
③可执行 x
也可用数字表示:r=4,w=2,x=1。所以7=rwx
ls -l //查看当前目录文件属性
运行结果如下:
-rwxrw-r-- 1 xdq book 1 Sep 7 16:41 read.c
10个字符用于确定不同用户权限。共分为四个部分:类型、文件所有者、文件所有者同组用户、其他用户。
- 第一个字符代表文件(-)、目录(d),链接(l)
- 第一组rwx:文件所有者的权限是可读可写可执行
- 第二组rw-:文件所有者同组用户的权限是可读可写
- 第三组r–:其他用户的权限为仅可读
文件描述符
1.对内核来说,所有打开文件都是用文件描述符引用。fd是一个非负整数,当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当读写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传递给read和write。Linux系统包括的默认文件描述符:
0标准输入
1标准输出
2标准错误
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
char readBuf[128];
read(0,readBuf,5);
write(1,readBuf,strlen(readBuf));
printf("\n");
return 0;
}
2.文件描述符这个数字在一个进程中表示一个特定的含义。当open一个文件时,操作系统在内存中构建了数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和内存中的动态文件的数据绑定。后续操作动态文件,只需要用这个文件描述符区分。
3.文件描述符的作用域是当前进程。open函数打开文件成功返回一个文件描述符,失败返回-1。
linux文件操作基本流程
①打开/创建文件
②读/写文件
③关闭文件
文件操作解析
1.先使用open函数打开文件,打开成功得到文件描述符,然后对文件进行读写(或其他)操作,最后使用close函数关闭文件,若不关闭文件会造成文件损坏。
2.文件存放在块设备文件系统中,称为静态文件。打开文件时,内核在进程中创建数据结构(结构体)记录打开的文件;同时申请一段内存将静态文件的内容从块设备中提取到内核中的特定地址存放管理(动态文件)。
3.打开文件后对文件的操作都是针对动态文件进行操作。对动态文件操作完成后,动态文件与静态文件的内容并不匹配,关闭文件时内核将动态文件的内容更新到静态文件中。
4.为何这样操作?
块设备对块进行操作,内存对字节进行操作。进行修改时,只能对整个块进行操作,无法对单个字节进行操作。
打开/创建文件(open)
函数原型:
参数说明:
pathname:打开/创建的文件名字(含路径)
flags:打开文件的操作方式
主类:
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 可读可写 //三者只可选其一
副类:
O_CREAT 如果文件不存在则创建该文件
O_EXCL 如果使用O_CREAT选项且文件存在,则返回错误消息(-1)
O_TRUNC 如果文件已经存在则删除文件中原有数据
O_APPEND 以追加的方式打开,加到文件的尾端
O_NOCTTY 如果文件为终端,那么终端不可以调用open系统调用的那个进程的控制终端
mode:创建文件时的文件权限
返回值:
成功返回文件描述符,失败返回-1
实例:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int fd;
fd = open("./file1",O_RDWR|O_CREAT,0600);
printf("fd = %d\n",fd);
if(fd == -1){
printf("error!\n");
exit(-1);
}
return 0;
}
运行结果:
fd = 3
-rw------- 1 xdq book 0 Sep 7 17:21 file1 //通过ls -l查看
关闭文件(close)
对文件进行操作(读写)时,操作完成都需要关闭文件,否则会造成文件损坏。
函数原型:
参数说明:
fd:文件描述符
写文件(write)
函数原型:
参数说明:
fd:文件描述符
buf:存放写入内容的缓冲区
count:写入的字节数
返回值:
没有写入内容返回-1 ,成功写入返回字节数
- 注意:如果文件中有内容,且打开文件时没有进行处理,则会覆盖原来的内容
读文件(read)
函数原型:
参数说明:
fd:文件描述符
buf:存放读取内容的缓冲区
count:读取的字节数
返回值:
成功读取返回读取的字节数,若光标在文件结尾返回0,失败则返回-1
文件光标偏移(lseek)
对文件进行读写操作时,光标会不断偏移。当写入内容后,光标偏移至文件尾,此时读取不到内容,需要将光标移动到文件头才能正常读取。
函数原型:
参数说明:
fd:文件描述符
offset:偏移值(偏移的字节数,offset可以是负值。正值向后偏移,负值向前偏移)
whence:偏移基础位置(在这个基础上偏移offset个字节)
whence为以下其中一种:
SEEK_SET 文件头
SEEK_CUR 文件当前位置
SEEK_END 文件尾
返回值:
成功返回偏移值,失败返回-1
综合实例
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int fd;
ssize_t n_write;
ssize_t n_read;
char *writeBuf = "hello world!";
char *readBuf;
//打开/创建文件
fd = open("./file1",O_RDWR|O_CREAT,0600);
printf("fd = %d\n",fd);
if(fd == -1){
printf("error!\n");
exit(-1);
}
//写文件
n_write = write(fd,writeBuf,strlen(writeBuf));
printf("n_write = %d\n",(int)n_write);
//光标偏移
lseek(fd,0,SEEK_SET);
//读文件
readBuf = (char *)malloc(n_write);
n_read = read(fd,readBuf,n_write);
printf("n_read = %d txt:%s\n",(int)n_read,readBuf);
//关闭文件
close(fd);
return 0;
}
运行结果:
fd = 3
n_write = 12
n_read = 12 txt:hello world!