前言
提笔不会忘字的人,提键盘却忘了编程语言,差点忘本了,用python,shell等脚本语言忘记C语言怎么用了,研究文件系统简单的文件读写不会写了,记录一下。
简单的文件读写
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
int main() {
const char* filename = "example.txt";
mode_t mode = 0666; // 文件权限模式
int fd = open(filename, O_CREAT | O_WRONLY, mode);
if (fd == -1) {
perror("Failed to open or create file");
return 1;
}
// 文件打开成功,可以进行写入操作
const char* content = "Hello, World!";
ssize_t bytes_written = write(fd, content, strlen(content));
if (bytes_written == -1) {
perror("Failed to write to file");
return 1;
}
printf("Successfully written %ld bytes to file.\n", bytes_written);
// 关闭文件
if (close(fd) == -1) {
perror("Failed to close file");
return 1;
}
return 0;
}
细细分析
1.打开方式
open函数是一个在C语言中用于打开文件的系统调用函数。它提供了对文件的创建、打开和访问的功能。open函数的原型如下:
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
open函数的参数如下:
- pathname:要打开或创建的文件的路径名。
- flags:指定打开文件的方式和行为的标志位。可以使用多个标志位,通过按位或 (|) 运算符进行组合。常用的标志位包括:
- O_RDONLY:
功能:以只读方式打开文件。
示例:open(filename, O_RDONLY); - O_WRONLY:
功能:以只写方式打开文件。
示例:open(filename, O_WRONLY); - O_RDWR:
功能:以读写方式打开文件。
示例:open(filename, O_RDWR); - O_CREAT:
功能:如果文件不存在,则创建文件。
示例:open(filename, O_CREAT | O_WRONLY, mode);
注意事项:通常与O_WRONLY或O_RDWR一起使用,并需要提供文件的权限模式(mode)参数。 - O_EXCL:
功能:与O_CREAT一起使用时,确保文件不存在,防止文件被覆盖。
示例:open(filename, O_CREAT | O_WRONLY | O_EXCL, mode);
注意事项:如果文件已经存在,带有O_EXCL标志的open()函数调用将失败返回。 - O_TRUNC:
功能:如果文件存在并成功打开,则将其截断为空文件(清空文件内容)。
示例:open(filename, O_WRONLY | O_TRUNC); - O_APPEND:
功能:在文件末尾追加写入内容,而不是覆盖现有内容。
示例:open(filename, O_WRONLY | O_APPEND); - O_NONBLOCK:
功能:以非阻塞方式(非等待方式)打开文件,读写操作可能会立即返回。
示例:open(filename, O_RDONLY | O_NONBLOCK); - O_SYNC:
功能:要求每次写入文件时都要进行物理磁盘同步,确保数据写入磁盘后再返回。
示例:open(filename, O_WRONLY | O_SYNC);
- O_RDONLY:
- mode:只有在使用O_CREAT标志位创建新文件时才需要指定。它用于设置新文件的权限模式(文件的访问权限)。如果不使用O_CREAT标志位,则可以将mode参数省略。
open函数返回一个整数值,表示文件描述符(file descriptor)。如果打开或创建文件失败,返回值为-1,并设置全局变量errno以指示错误的类型。
2.文件权限
文件权限模式选项用于设置文件的读取、写入和执行权限。在UNIX/Linux系统中,可以使用以下选项来设置文件权限模式:
- S_IRUSR:
功能:文件所有者的读权限。
值:0400(八进制)。 - S_IWUSR:
功能:文件所有者的写权限。
值:0200(八进制)。 - S_IXUSR:
功能:文件所有者的执行权限。
值:0100(八进制)。 - S_IRGRP:
功能:文件所属组的读权限。
值:0040(八进制)。 - S_IWGRP:
功能:文件所属组的写权限。
值:0020(八进制)。 - S_IXGRP:
功能:文件所属组的执行权限。
值:0010(八进制)。 - S_IROTH:
功能:其他用户的读权限。
值:0004(八进制)。 - S_IWOTH:
功能:其他用户的写权限。
值:0002(八进制)。 - S_IXOTH:
功能:其他用户的执行权限。
值:0001(八进制)。 - S_IRWXU:
功能:用户(拥有者)具有读、写和执行权限。
值:0700(八进制)。 - S_IRWXG:
功能:组具有读、写和执行权限。
值:0070(八进制)。 - S_IRWXO:
功能:其他用户具有读、写和执行权限。
值:0007(八进制)。
这些选项可以通过按位或运算符(|)组合使用,以设置所需的权限模式。例如,要为文件设置所有者具有读和写权限,而其他用户仅具有读权限,可以使用以下模式:
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
如果使用777即为:
mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO;
可以使用%o,进行输出查看mode的值。
#include <sys/stat.h>
#include <stdio.h>
int main() {
mode_t mode = S_IRWXU; // 设置文件所有者的权限为读、写和执行
printf("Mode: %o\n", mode);
return 0;
}
3.chmod给文件权限
在C语言中,可以使用chmod函数来修改文件的权限。chmod函数的原型如下:
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mode);
chmod函数接受两个参数:
- pathname:要修改权限的文件路径名。
- mode:要设置的文件权限模式。
#include <sys/stat.h>
#include <stdio.h>
int main() {
const char* filename = "example.txt";
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; // 设置文件权限为 640
if (chmod(filename, mode) == -1) {
perror("Failed to change file permissions");
return 1;
}
printf("File permissions changed successfully.\n");
return 0;
}