一切皆文件
用代码创建的文件,默认路径在可执行文件同级目录下(本质是进程通过系统接口创建的)
文件宏
在Linux下,有一些与文件操作相关的宏可以用于处理文件描述符和文件权限。以下是一些常用的文件宏:
STDIN_FILENO
:表示标准输入的文件描述符,其值为0。STDOUT_FILENO
:表示标准输出的文件描述符,其值为1。STDERR_FILENO
:表示标准错误输出的文件描述符,其值为2。
这些宏用于表示标准输入、标准输出和标准错误输出的文件描述符。
另外,还有一些与文件权限相关的宏,用于设置文件的权限:
S_IRUSR
:表示用户(文件所有者)读权限。S_IWUSR
:表示用户写权限。S_IXUSR
:表示用户执行权限。
类似地,还有S_IRGRP
、S_IWGRP
和S_IXGRP
分别表示组读、写和执行权限,以及S_IROTH
、S_IWOTH
和S_IXOTH
分别表示其他用户读、写和执行权限。
这些宏可以与open()
函数中的mode
参数一起使用,以设置文件的权限。
例如,以下代码片段演示了如何使用这些宏来打开一个文件并设置其权限:
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("file.txt", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
if (fd == -1) {
// 处理文件打开失败的情况
}
// 写入数据到文件
const char *data = "Hello, World!";
write(fd, data, strlen(data));
// 关闭文件
close(fd);
return 0;
}
在上面的示例中,open()
函数使用O_CREAT
选项创建一个新文件,O_WRONLY
选项指定文件只能用于写入。S_IRUSR | S_IWUSR
设置了文件的权限,使得用户具有读和写的权限。
std
在Linux下,stdin
、stdout
和stderr
是与文件操作相关的特殊文件描述符。它们分别对应标准输入、标准输出和标准错误输出。
以下是与文件操作相关的一些std
系列函数:
-
int open(const char *pathname, int flags, mode_t mode)
:打开一个文件,并返回一个文件描述符。pathname
是文件路径,flags
是打开模式,mode
是文件权限。返回的文件描述符可以用于后续的文件操作。 -
ssize_t read(int fd, void *buf, size_t count)
:从文件描述符fd
中读取数据,并将其存储到缓冲区buf
中。count
是要读取的字节数。返回值是实际读取的字节数。 -
ssize_t write(int fd, const void *buf, size_t count)
:将数据从缓冲区buf
写入到文件描述符fd
中。count
是要写入的字节数。返回值是实际写入的字节数。 -
int close(int fd)
:关闭文件描述符fd
。
这些函数允许您在Linux系统中进行文件的打开、读取和写入操作。
至于为什么stdin
是0,stdout
是1,stderr
是2,这是因为在Unix/Linux系统中,每个进程都有一个文件描述符表,其中前三个文件描述符分别是0、1和2。这是由于历史原因和Unix的设计惯例。
stdin
(标准输入)的文件描述符是0,用于接收用户的输入。stdout
(标准输出)的文件描述符是1,用于输出程序的正常输出。stderr
(标准错误输出)的文件描述符是2,用于输出程序的错误信息。
这种约定使得程序可以使用简单的方式将输出重定向到文件或其他设备,例如将输出重定向到文件中:./program > output.txt
。
fd在内核中本质是一个数组小标