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

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

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

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

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

open(char *, 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;
}

笔记八:linux系统编程之IO的更多相关文章

  1. Linux系统编程之IO_缓冲和非缓冲

    下面是一段类似日志记录的代码,已获取通讯的报文内容和当时的环境参数内容,就是创建一个文件,使用标准IO的fopen.fprintf进行输出记录.但是在调试中,刚开始我就傻眼了,文件创建成功了,但是实时 ...

  2. linux系统编程之lseek帮助文档

    通过man 2 lseek可以查看linux中的系统函数lseek函数的帮助文档,为了更好的学习,我把这些重要内容翻译过来 NAME lseek - reposition read/write fil ...

  3. linux系统编程之I/O内核数据结构

    文件在内核中是用三种数据结构进行表示的 (1)文件描述符表:文件描述符表是一个结构体数组,数组的下标就是open函数返回的文件描述符. 文件描述符表的每一个记录有两个字段   *文件描述符标志 * 文 ...

  4. linux网络编程之IO函数

    Linux操作系统中的IO函数主要有read(),write(),recv(),send(),recvmsg(),sendmsg(),readv(),writev(). 接收数据的recv()函数 # ...

  5. linux网络编程之IO模型

    本文转自作者:huangguisu 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓 ...

  6. Java IO学习笔记八:Netty入门

    作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...

  7. kali Linux系列教程之BeFF安装与集成Metasploit

    kali Linux系列教程之BeFF安装与集成Metasploit 文/玄魂 kali Linux系列教程之BeFF安装与集成Metasploit 1.1 apt-get安装方式 1.2 启动 1. ...

  8. 【hadoop代码笔记】Mapreduce shuffle过程之Map输出过程

    一.概要描述 shuffle是MapReduce的一个核心过程,因此没有在前面的MapReduce作业提交的过程中描述,而是单独拿出来比较详细的描述. 根据官方的流程图示如下: 本篇文章中只是想尝试从 ...

  9. 如何提高Linux下块设备IO的整体性能?

    编辑手记:本文主要讲解Linux IO调度层的三种模式:cfp.deadline和noop,并给出各自的优化和适用场景建议. 作者简介: 邹立巍 Linux系统技术专家.目前在腾讯SNG社交网络运营部 ...

  10. Linux 网络编程(IO模型)

    针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...

随机推荐

  1. 【内存管理】ION内存管理器浅析(system heap)(基于linux 4.14)

    什么是ION ION具体不知道是什么的缩写,只知道是android系统上google引入的内存管理方式,为了实现用户与内核间数据共享时零拷贝.多用于多媒体,比如camera和display,graph ...

  2. ffmpeg均匀分割视频命令

    ffmpeg -y -i input.wav -f segment -segment_time 5 output-%d.wav -segment_time 分割视频片段大小 -segmenet_lis ...

  3. 贪心算法(Java)

    贪心算法 文章目录 贪心算法 0.写在前面 1.贪心算法的基本要素 1.1 贪心选择性质 1.2 最优子结构性质 1.3 贪心算法与动态规划算法的差异 2.贪心算法的特点 3.贪心法的正确性证明 4. ...

  4. 关与python面向对象的认识

    面向对象编程 类:从一堆对象中以抽象的方式把相同的特征归类得到. 抽象类 类 实列 子类抽象为父类,子类继承父类特征. 类实例化为实例,实例抽象为类. class Human(object): cen ...

  5. C++ accumulate()函数的用法

    accumulate定义在 numeric 中,作用有两个,一个是累加求和,另一个是自定义类型数据的处理. 头文件 #include <numeric> 原型 默认求累加和 templat ...

  6. 微信小程序分享出去的页面再点进来,如何取值并且在新用户未授权的情况下,授权后跳到当前页面

    1.如何点击分享的页面进来,授权后跳转到当前页面 可以在授权成功后,将openid.头像.昵称入库成功之后,标记一下,及getStorageSync // 通过code获取openid getUser ...

  7. Map遍历增加key报错如何解决

    public static void main(String[] args) throws Exception{ Map<String,Object> aa=new HashMap< ...

  8. Win32窗口设置为透明

    可以使用以下方法将Win32窗口设置为透明: 定义窗口类时,在WNDCLASSEX结构体中设置hbrBackground成员为NULL. 在窗口创建时,使用WS_EX_LAYERED风格和SetLay ...

  9. 快速掌握Linux三剑客命令使用

    前言 Linux三剑客指的是grep.sed以及awk命令的使用,这三个命令功能异常强大,大到没朋友.grep命令主打"查找",sed命令主打"编辑",awk命 ...

  10. 自己动手从零写桌面操作系统GrapeOS系列教程——12.QEMU+GDB调试

    学习操作系统原理最好的方法是自己写一个简单的操作系统. 写程序不免需要调试,写不同的程序调试方式也不同.如果做应用软件开发,相应的程序调试方式是建立在有操作系统支持的基础上的.而我们现在是要开发操作系 ...