设为首页收藏本站 |天气与日历| 2025-04-19 星期六 13:20:00 乙巳(蛇)年 三月廿二 未时
     
切换到窄版

私人站点

 找回密码
 立即注册
搜索
查看: 328|回复: 0

IO的基础

[复制链接]

954

主题

954

帖子

3875

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3875
发表于 2022-3-11 23:08:21 | 显示全部楼层 |阅读模式
  • 认识内核对象
不允许访问内核设备和内存,
但可以通过内核系统函数区访问.
对每个内核对象进行编号ID.
如果访问内核对象,只能通过ID
编程模型:
  • 申请得到一个ID
  • 在内核系统函数中使用ID得到对应内核对象数据


  • 怎么访问文件
使用函数,传递一个文件,系统打开文件加载文件数据
返回一个ID.
使用函数,传递ID,得到数据.
使用函数传递ID,告诉系统释放文件.

ID:文件描述符号. file description (fd)
每一个程序执行的时候都有一个目录,存放打开的文件描述符
  • 每个程序默认打开三个文件设备
  • 0:标准输入
  • 1:标准输出
  • 2:错误输出


  • 操作文件描述符
ssize_t write(
int fd,
void  * buf,  //要写入内核对象的数据
size_t size,//写入数据大小

)


返回:
  • >0 实际写入的数据
  • -1  写入错误



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);
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|编程站点 ( 冀ICP备2023028127号-2 )|友链申请|

GMT+8, 2025-4-19 13:20 , Processed in 0.091125 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表