linux:文件描述符 整数
如果有文件被某个程序访问。那么程序中就有文件描述符。
进程:一个运行中的程序。
标准输入设备文件 0
标准输出设备文件 1
标准错误输出设备文件 2
标准输出设备文件 1
标准错误输出设备文件 2
这三个设备文件都是终端设备驱动产生的驱动设备文件。
这三个文件描述符都代表终端。
这三个文件描述符都代表终端。
创建一个进程,使用getpid打印进程编号,然后进入/proc/$(pid)/fd目录。
ctrl + c 杀死进程并重启shell
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
sys/types.h 中保存了一些linux自定义的类型名和宏名
sys/stat.h 中保存了一些用来获得文件,进程等状态的函数。
sys/stat.h 中保存了一些用来获得文件,进程等状态的函数。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <fcntl.h>
flags:标识 打开方式
O_RDWR 可读可写
O_RDONLY 只读
O_WRONLY 只写
O_CREAT 创建
O_EXCL 只可创建一次
O_APPEND 追加
mode:权限 文件的权限
S_IRUSR | S_IWUSR
O_RDWR 可读可写
O_RDONLY 只读
O_WRONLY 只写
O_CREAT 创建
O_EXCL 只可创建一次
O_APPEND 追加
mode:权限 文件的权限
S_IRUSR | S_IWUSR
int open(const char *pathname, int flags);
打开一个文件并返回文件的描述符号 fd
int open(const char *pathname, int flags, mode_t mode);
创建或者打开一个文件并返回fd
int creat(const char *pathname, mode_t mode);
和两个参数的open相同
打开一个文件并返回文件的描述符号 fd
int open(const char *pathname, int flags, mode_t mode);
创建或者打开一个文件并返回fd
int creat(const char *pathname, mode_t mode);
和两个参数的open相同
00000 文件拥有者
0777 当前用户
777 os决定 默认
如果失败 返回-1
成功 返回带回的东西或者0
在os内核中,有一块区域专门保存进程中的错误信息,我们称之为错误输出缓冲区
这个区域的内容可以使用perror函数输出或者printf的%m占位符替代。
这个区域的内容可以使用perror函数输出或者printf的%m占位符替代。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
#include <unistd.h>
ssize_t read(//返回-1表示失败 返回0表示成功但没读到东西 正数表示读到了几个字节
int fd, //读取的文件的文件描述符号
void *buf, //读到的数据保存地址
size_t count); //字节数 大小
int fd, //读取的文件的文件描述符号
void *buf, //读到的数据保存地址
size_t count); //字节数 大小
ssize_t write(
int fd,
const void* buf,
size_t count);
int fd,
const void* buf,
size_t count);
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
写一个结构体到文件
#include <stdio.h>
#include <unistd.h>//write
#include <fcntl.h>//open
#include <stdlib.h>//%m
//1 声明结构体
struct student{
char name[20];
int age;
char sex;
double score;
};
#include <unistd.h>//write
#include <fcntl.h>//open
#include <stdlib.h>//%m
//1 声明结构体
struct student{
char name[20];
int age;
char sex;
double score;
};
int main(){
char filename[20] = "student.dat";
//2 定义并初始化结构体
struct student stu = {"测试",3,'f',33.33};
//3 创建并打开文件
int fd = open(filename,O_WRONLY | O_CREAT,0666);
if(-1 == fd)
printf("创建并打开文件%s失败:%m\n",filename),exit(-1);
printf("打开文件%s %m!\n",filename);
char filename[20] = "student.dat";
//2 定义并初始化结构体
struct student stu = {"测试",3,'f',33.33};
//3 创建并打开文件
int fd = open(filename,O_WRONLY | O_CREAT,0666);
if(-1 == fd)
printf("创建并打开文件%s失败:%m\n",filename),exit(-1);
printf("打开文件%s %m!\n",filename);
//4 写入信息
int r;
r = write(fd,&stu,sizeof stu);
if(r>0){
printf("write %m!\n");
}
int r;
r = write(fd,&stu,sizeof stu);
if(r>0){
printf("write %m!\n");
}
//5 关闭文件
close(fd);//在进程将要结束的时候,os会自动关闭进程打开的所有fd
close(fd);//在进程将要结束的时候,os会自动关闭进程打开的所有fd
return 0;
}
}