|
不允许访问内核设备和内存,
但可以通过内核系统函数区访问.
对每个内核对象进行编号ID.
如果访问内核对象,只能通过ID
编程模型:
- 申请得到一个ID
- 在内核系统函数中使用ID得到对应内核对象数据
使用函数,传递一个文件,系统打开文件加载文件数据
返回一个ID.
使用函数,传递ID,得到数据.
使用函数传递ID,告诉系统释放文件.
ID:文件描述符号. file description (fd)
每一个程序执行的时候都有一个目录,存放打开的文件描述符
ssize_t write(
int fd,
void * buf, //要写入内核对象的数据
size_t size,//写入数据大小
)
返回:
ssize_t read(
int fd,
void *buf,//返回数据空间的大小
size_t size//空间大小
)
返回:
- >0 实际读取的数据
- =0 碰到文件结束符号EOF (ctrl+d)
- -1 读取错误
[C] 纯文本查看 复制代码 #include <stdlib.h>
#include <stdio.h>
main()
{
//printf("%d\n",getpid());
//while(1);
/*
int r=write(0,"Hello\n",6);
write(1,"world\n",6);
write(2,"louis\n",6);
int a=20;
write(1,&a,4);
*/
char buf[32];
//memset(buf,0,32);
bzero(buf,32);
int r=read(0,buf,30);
printf("实际输入:%d\n",r);
if(r>0)
{
buf[r]=0;
printf("::%s\n",buf);
}
if(r==0)
{
printf("ctrl+d\n");
}
if(r==-1)
{
printf("输入错误!\n");
}
}

fd文件操作
通过文件描述符号读写各种数据
open函数与creat函数
[C] 纯文本查看 复制代码 int open(
const char *filename,//文件名
int flags,//open的方式[创建/打开]
mode_t mode//权限(只有创建的时候有效)
)
返回:
>=0:内核文件描述符号.
=-1:打开/创建失败
open的方式:
必选方式:O_RDONLY O_WRONLY O_RDWR,必须选择一个
创建/打开:O_CREAT
可选方式:
对打开可选方式:O_APPEND O_TRUNC(清空数据)
对创建可选方式:O_EXCL
组合:
创建:
O_RDWR|O_CREAT
O_RDWR|O_CREAT | O_EXCL
打开:
O_RDWR
O_RDWR|O_APPEND
O_RDWR|O_TRUNC
权限:
建议使用8进制数
关闭
void close(int fd);
案例1:
创建文件
案例2:
创建文件并写入数据
20 short float
tom 20 99.99
bush 70 65.00
达内 40 100.00
注意:
文件的创建的权限受系统的权限屏蔽的影响
umask //显示屏蔽权限.
umask 0666 //设置权限屏蔽.
ulimit -a 显示所有的其他限制.
案例3:
打开文件读取数据
重点:
怎么打开读取
文件尾的判定
基本类型的数据读写.
案例4:
结构体读取
描述:从键盘读取若干条数据,保存到文件
数据追加
3.文件描述符号与重定向
1.判定文件描述符号与终端的邦定关系
int isatty(int fd)
返回非0:fd输出终端
0:fd输出被重定向
2.防止重定向
/dev/tty
总结:
2.文件的创建与打开(了解设置位的作用)
3.文件的读写(字符串/基本类型/结构体)
4.了解描述符号与重定向
[C] 纯文本查看 复制代码 /*创建文件*/
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
int fd;
char name[20];
short age;
float score;
char sex;
fd=open("test.dat",
O_RDWR|O_CREAT|O_EXCL,
00666);
if(fd==-1) printf("open error:%m\n"),exit(-1);
//写第一条
memcpy(name,"tom",strlen("tom")+1);
age=20;
score=99.99;
sex='F';
write(fd,name,sizeof(name));
write(fd,&age,sizeof age);
write(fd,&score,sizeof(float));
write(fd,&sex,sizeof(sex));
//写第二条
memcpy(name,"Bush",strlen("Bush")+1);
age=70;
score=65.00;
sex='M';
write(fd,name,sizeof(name));
write(fd,&age,sizeof age);
write(fd,&score,sizeof(float));
write(fd,&sex,sizeof(sex));
//写第三条
memcpy(name,"达内",strlen("达内")+1);
age=10;
score=99.00;
sex='F';
write(fd,name,sizeof(name));
write(fd,&age,sizeof age);
write(fd,&score,sizeof(float));
write(fd,&sex,sizeof(sex));
close(fd);
}
|
|