笔记八:linux系统编程之IO

笔记:linux系统编程之IO
应用层     内核层     硬件层
应用层:数据结构 、java、android、C、C++,C#;
l inux高级编程:涉及内核为应用层提供接口函数;
内核五大功能:
文件管理
进程管理
设备管理
内存管理
网络管理

printf显示原理:显示器属于硬件,内核主要通过驱动程序写到内核,printf想进入内核,必须通过内核提供的接口函数(write)进入内核,让内核通过驱动将要显示的结果在硬件上显示。
内核编程:驱动程序的学习
内核为什么要提供那些接口?

1.内核必须要为应用程序服务,应用程序没有内核服务,则应用程序功能单一;
2.内核是一个稳定的代码,同时要为多个用户空间服务,为了防止用户空间某些程序使内核代码奔溃或者产生其他问题
IO:
文件IO
标准IO
目录IO
进程:
进程控制
线程
进程通信(有名管道、无名管道、信号、IPC通信)

网络通信:仍属于进程通信,它是一个网络中二台机器之间的二个进程之间的通信;

文件IO
open函数
write函数
read函数
open函数   ---打开或者创建一个文件

openchar *, flag, mode)在fcntl.h文件中声明。函数的作用:创建或打开某个文件,参数:最多有三个参数;

第一个参数,char * 包含有文件名和路径

第二个参数:flag 打开文件的方式

第三个参数:mode 创建文件的权限。

  • flag内容如下:

flag
功能
O_RDONLY
只读
O_WRONLY
只写
O_RDWR
读写
O_CREAT
创建一个文件
O_EXCL
如果使用 O_CREAT 时文件存在,则可返回错误消息。这一   参数可测试文件是否存在。
O_TRUNC
打开文件(会把已经存在的内容给删除)。
O_APPEND
追加方式打开文件(不会把已经存在的内容给删除)。

 返回值:
成功:文件描述符,它是一个非负的正整数,即文件的ID号,相当于人的身份证号;
出错:-1。

Open 函数创建文件时的权限是:
== mode & (~umask)

B111 111 111 & ~(B 000 010 010)  =  B 111 101 101

   内核的一个重要功能是文件管理,系统有非常多的文件,内核怎样认识每一个文件呢?内核采用ID号的方式标识这些文件,inode 号,node号表示不同的文件,比如ls  –lai   i,只要文件不一样,inode号就不一样。

ID号有什么规律呢?
    从 0 开始累加,程序进行时(进程),内核会自动打开 3 个文件描述符, 0 1 2 ,分别对应,标准输入、输出和出错,这样在程序中,每打开一个文件,文件描述符值从 3 开始累加。 
  0:键盘输入
  1:显示器输入
  2:出错处理
  1. write(int fd, void *buf, size_t count )

第一个参数:向哪一个文件中去写;第二个参数:向这个文件中写什么内容;第三个参数:向这个文件中写多少个。函数的返回值:是实际写的字节数。

返回值:是实际写的字节数
  1. read(int fd, void *buf, size_t count)

第一个参数:从哪一个文件中去读;第二个参数:读到什么地方去;第三个参数:读多少个。函数的返回值:是实际读的字节数。

返回值:是实际读的字节数
  1. lseek(int fd, off_t offset, int whence),该函数的头文件: sys/types.h  unistd.h

功能:调整读写的位置指针;

第一个参数:要调整的文件的文件描述符;

第二个参数:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移);

第三个参数:当前位置的基点,有三个标志,

       SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小;

SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。

SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。函

          数的

返回值:成功:文件当前的位置,出错:-1

  1. close(fd)

调用close()函数可以关闭一个打开的文件。

调用成功返回0,出错返回-1,并设置errno

注:当一个进程终止时,该进程打开的所有文件都由内核自动关闭;

例子:拷贝文件==》cp命令的实现
#include "unistd.h"
#include "fcntl.h"
#include "stdio.h"
int main()
{
  int fd;
  int ret,readret;
  char buf[]="hello linux\n";
  char readbuf[128]={0};
  fd=open("./a.c",O_RDWR | O_CREAT | O_EXCL,0777);
  if(fd < 0)
  {
      printf("creat file a.c failure\n");
      return -1;
  }
  printf("creat file a.c sucess,fd=%d\n",fd);
  ret=write(fd,buf,8);
  printf("write ret=%d\n",ret);
  // change read_write_pointer
  lseek(fd,-4,SEEK_END);
  readret=read(fd,readbuf,128);
  printf("readbuf=%s,readret=%d\n",readbuf,readret);
  close(fd);
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值