一、linux文件权限
字符表示法 二进制 十进制 说明
r - - 100 4 仅可读
- w - 010 2 仅可写
- - x 001 1 仅可执行
r w - 110 6 可读可写
r - x 101 5 可读可执行
- w x 011 3 可写可执行
r w x 111 7 可读可写可执行
- - - 000 0 无权限
二、C语言文件读写
int open(const char *pathname, int flags);
2.1 flags参数详解
- O_CREAT:在文件打开过程中创建新文件
- O_RDONLY:以只读方式打开文件。
- O_WRONLY:以只写方式打开文件。
- O_RDWR:以读写方式打开文件。
- O_APPEND:在文件末尾追加数据,而不是覆盖现有内容。
- O_TRUNC:如果文件已经存在,将其截断为空文件。
- O_EXCL:与 O_CREAT 一起使用时,如果文件已经存在,则 open() 调用将失败。
- O_SYNC:使文件写操作变为同步写入,即将数据立即写入磁盘。
- O_NONBLOCK:以非阻塞方式打开文件,即使无法立即进行读写操作也不会被阻塞。
当文件为空的时候,文件指针初始化指向0的位置,随着写入,文件指针会落到最后一个字符的后面。当文件描述符被关闭后,重新使用open
函数文件指针会指向0。
open 函数
open
函数用于打开一个文件,并返回一个文件描述符(file descriptor),这个描述符可以用于后续的文件读写操作。
语法:
#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);
-
pathname
是要打开的文件的路径名。 -
flags
是打开文件时的标志,它可以指定文件的打开方式(例如只读、只写、追加等)。一些常用的标志包括:O_RDONLY
: 只读方式打开文件O_WRONLY
: 只写方式打开文件O_RDWR
: 读写方式打开文件O_CREAT
: 如果文件不存在则创建文件O_APPEND
: 追加方式打开文件- 等等(可以使用按位或
|
连接多个标志)。
-
mode
是一个权限参数,仅在使用O_CREAT
标志创建文件时才需要。它指定了文件的权限,比如0644
。
返回值:
- 如果成功,
open
函数返回一个非负整数的文件描述符,可以用于后续的文件 I/O 操作。 - 如果失败,返回值为 -1,并设置全局变量
errno
表示出错的原因。
示例:
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
int main() {
int fd;
fd = open("example.txt", O_WRONLY | O_CREAT, 0644);
if (fd == -1) {
perror("open");
return 1;
}
// 可以在这里进行文件写操作等
close(fd);
return 0;
}
lseek 函数
lseek
函数用于移动文件描述符指向文件中的位置。
语法:
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
fd
是文件描述符,通过open
函数获取。offset
是偏移量,可以是正数、负数或零,用来指定相对于whence
的偏移量。whence
用于确定offset
是相对于文件开始位置、当前位置还是文件末尾位置,有三个可选值:SEEK_SET
:偏移量相对于文件开头SEEK_CUR
:偏移量相对于当前位置SEEK_END
:偏移量相对于文件末尾
返回值:
- 如果成功,
lseek
函数返回从文件开头到新的文件位置的偏移量。 - 如果失败,返回值为 -1,并设置全局变量
errno
表示出错的原因。
示例:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main() {
int fd;
off_t offset;
fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
// 设置文件偏移量到文件末尾
offset = lseek(fd, 0, SEEK_END);
if (offset == -1) {
perror("lseek");
close(fd);
return 1;
}
printf("File size: %ld bytes\n", offset);
close(fd);
return 0;
}
这些函数是 C 语言中用于文件操作的基础函数,可以通过它们来进行文件的打开、关闭、读写以及定位操作。
下面是一个操作文件的例子
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char *buf = "你好啊 世界!";
int fd = open("./file1", O_RDWR); // 尝试以读写模式打开名为 "file1" 的文件
if (fd == -1)
{
printf("open file1 failed\n"); // 如果文件打开失败,输出错误消息
fd = open("./file1", O_RDWR | O_CREAT, 0600); // 以读写模式和创建标志创建名为 "file1" 的新文件,文件权限为 0600
if (fd > 0)
{
printf("create file1 success!\n"); // 如果成功创建文件,输出成功消息
}
}
printf("open success: fd = %d\n", fd); // 打印文件描述符
int write_num = write(fd, buf, strlen(buf)); // 向文件写入内容,返回写入的字节数
if (write_num != -1)
{
printf("write %d bytes to file\n", write_num); // 打印成功写入的字节数
}
off_t offset = -21; // 设置偏移量为负数
lseek(fd, -21, SEEK_CUR); // 在当前位置偏移 -21 个字节
// 读取数据
char *temp = (char*)malloc(sizeof(char) * write_num + 1);
read(fd,temp,100);
printf("%s\n",temp);
close(fd); // 关闭文件
return 0;
}
参考文章
推荐文章:Linux 文件基本属性