1. gdb调试
2. makefile的编写
3. 系统IO函数

1. gdb调试:
        1. 启动gdb + 可执行文件
        2. 查看代码:
                l==list
                l (默认给出main函数的前十行)(再次输入l会给继续列出后面的内容 之后可以按回车即可)
                l 行号(或函数名)
                l filename:行号(或函数名)
        3. 设置断点:
                设置当前文件断点:
                    b == break
                    b 行号(或函数名)                
                设置指定文件断点:
                    b fileName:行号(函数名)
                设置条件断点:
                    b 10 if 某个变量==19
                删除断点:
                    delete == del == d
                    d 断点的编号
                获取编号:
                    info == i
                    info b
        4. 查看设置的断点
                i==info
                i b
        5. 开始 执行gdb调试
                执行一步操作: start  (或r==run 直接运行或到断点停止)
                单步继续执行: n
                执行多步, 直接停在断点处:c
        5. 单步调试
                进入函数体内部: s
                从函数体内部跳出: finish
                不进入函数体内部: n
                退出当前循环: u
        6. 查看变量的值: p == print
                    p 变量名
        7. 查看变量的类型: ptype 变量名
        8. 设置变量的值: set var 变量名 = 赋值
        9. 设置追踪变量
                display + 变量名
                取消追踪变量 :undisplay 编号
                获取编号: info display
        10. 退出gdb调试
                    quit
        
2. makefile的编写:项目的代码管理工具,节省编译项目的时间,一次编写终身受益
        1. makefile的命名:makefile (或Makefile)
        2. makefile的规则:(vi makefile 直接创建文件)
                规则中的三要素: 目标(app名字), 依赖(用到的.c文件), 命令(gcc命令)
                    目标:依赖条件
                    (tab缩进)命令
                子目标和终极目标的关系: 生成最终目标
                用户自定义的规则:
                    clean:
                        (-makedir \aa 不能成功,不加-则在此处命令暂停,加-则可以忽略该命令向下继续执行)
                        rm *.o -f    (-f强制删除,即使没有)
                        
                    make clean       (执行对应的clean规则的命令)
                    若当前目录下有名为clean的文件,则不能执行相应规则
                    解决方案 -->在前一行做伪目标声明:.PHONY:clean
        3.执行makefile生成终极目标app:make    (会在下一行显示一些gcc命令)        4.若想生成目标,检查规则中的依赖条件是否存在,如果不存在,寻找是否有规则用来生成该依赖文件。检查规则中的目标是否需要更新,必须检查它的所有依赖,依赖中有任意一个被更新,则目标必须更新。依赖文件比目标文件时间晚,则需要更新。
        5.可以在makefile 中声明变量如obj=main.o sum.o sub.o
            使用变量:$(obj)
        6. makefile的两个函数(makefile中所有的函数必须都有返回值)
                wildcard:查找指定目录下指定类型的文件,一个参数
                    src = $(wildcard ./*.c)    找到./src 目录下所有后缀为.c的文件,以串的形式赋给变量src
                patsubst:匹配替换,从src中找到所有.c 结尾的文件,并将其替换为.o
                    obj = $(patsubst %.c ,%.o ,$(src))    把src变量中所有后缀为.c的文件替换成.o
        7.     makefile中的自动变量
            $<: 规则中的第一个依赖
            $@: 规则中的目标
            $^: 规则中的所有依赖
            只能在规则的命令中使用
        app:main.o sub.o mul.o
            gcc main.o sub.o mul.o -o app
            (gcc $^ -o $@)
        
        %.o:%.c (第一个%逐个匹配终极目标的依赖,第二个%匹配第一个%内容)
            gcc -c $< -o $@
        8.Makefile自己维护的变量,都是大写的。
            CC = cc  (gcc)
            CPPFLAGS : 预处理器需要的选项 如:-I
            CFLAGS:编译的时候使用的参数 –Wall –g -c
            LDFLAGS :链接库使用的选项 –L -l
            用户可以修改这些变量的默认值CC = gcc
3. 系统IO函数
        1>. 一些概念

文件描述符

    PCB

库函数与系统函数的关系

2>. open
                函数原型:
                    int open(const char *pathname, int flags);
                    int open(const char *pathname, int flags, mode_t mode);
                打开方式:
                    必选项flags:
                        O_RDONLY   只读
                        O_WRONLY   只写
                        O_RDWR     读写
                    可选项:
                        O_CREAT    创建新文件
                            第三个参数:文件权限: 本地有一个掩码:umask 可查看  umask 022 可临时修改
                                    文件的实际权限: 给定的权限 & 本地掩码(取反)==实际的文件权限
                                    7  7  7
                                    111111111(给定权限的8进制)
                                    111111101(掩码去反的8进制)
                                    ---------    
                                    111111101
                                    7  7  5
                        O_EXCL     如果同时指定了O_CREAT,并且文件已存在,则出错返回。<stdio.h>void perror(const char *s)用来将上一个函数发生错误的原因输出到标准设备(stderr)        
                        O_TRUNC    将文件截断为0,如果文件已存在,则将其长度截断(Truncate)为0字节。
                        O_APPEND   追加如果文件已有内容,这次打开文件所写的数据附加到文件的末尾。
        3>. read    从打开的设备或文件中读取数据。
                函数原型:ssize_t read(int fd, void *buf, size_t count);
                    fd:文件描述符
                    buf:数据缓冲区
                    count:请求读取的字节数
                返回值:
                    1. -1 读文件失败
                    2. 0 文件读完了
                    3. >0 读取的字节数
        4>. write    向打开的设备或文件中写数据。
                函数原型:ssize_t write(int fd, const void *buf, size_t count);
                返回值:
                    -1 --> 失败
                    >=0 --> 写入文件的字节数
        5>. lseek    修改文件偏移量(读写位置) 。文件的拓展, 最后需要做额外的写操作 。
                函数原型:off_t lseek(int fd, off_t offset, int whence)
                    off_t offset --> 偏移量
                    int whence --> 偏移位置
                        SEEK_SET - 从文件头向后偏移
                        SEEK_CUR - 从当前位置向后偏移
                        SEEK_END - 从文件尾部向后偏移
                返回值:
                    较文件起始位置向后的偏移量
                    允许超过文件结尾设置偏移量,文件会因此被拓展。
                    失败返回 -1
                获取文件长度:lseek(fd, 0, SEEK_END);    返回值即为文件长度
        6>. close
                参数:open函数的返回值
                返回值:
                    0 --> 正常关闭
                    -1 --> 关闭出现错误
                
cpu 为什么要使用虚拟地址空间与物理地址空间映射?解决了什么样的问题?

1.方便编译器和操作系统安排程序的地址分布。
        程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
        
2.方便进程之间隔离
        不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程使用的物理内存。
        
3.方便OS使用你那可怜的内存。
        程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,
        内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。

对大文件的读写两种方式:
    read write  -- 每次读1个byte  效率低
    
    getc putc   -- 每次读1个byte  效率高
        标准C库函数内部提供了一个缓冲区

Linux学习笔记-基本操作4的更多相关文章

  1. Linux学习笔记-基本操作5

    1. Linux文件操作相关函数 stat函数 :获取文件属性(从inode上获取)                返回值:                    成功:0               ...

  2. Linux学习笔记-基本操作1

    1>. 命令解析器2>. Linux快捷键3>. Linux 系统目录结构4>. 用户目录5>. 文件和目录操作6>. 文件和目录的属性7>. 文件权限, 用 ...

  3. Linux学习笔记-基本操作3

    1. vim编辑器的使用2. gcc编译器3. 静态库的制作 -- lib4. 动态库的制作    -- dll vi -- vimvim是从vi发展过来的一款文本编辑器vi a.txt前提: 安装了 ...

  4. Linux学习笔记-基本操作2

    1. 压缩包管理2. 进程管理3. 网路管理4. ftp服务器搭建5. nfs服务器搭建6. ssh服务器7. scp命令8. 其他命令9. 关机重启 1. 压缩包管理 1>. 屌丝版:不能对目 ...

  5. 20155303狄惟佳预备作业三Linux学习笔记

    20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...

  6. Linux 学习笔记 1 使用最小的系统,从分区安装系统开始

    我们常用的linux系统在安装过程中大多都省略了对系统进行分区的操作,以至于后期,不了解什么是分区以及分区当中最基本的一些概念, 我们不说最细的知识,只求了解这个过程,那直接步入正题,开始第一节的学习 ...

  7. Linux 学习笔记 5 文件的下载、压缩、解压、初步认识yum

    写在前面 上节我们通过简单的几组命令,已经完全的实现了文件的移动.删除.更名.以及复制,我们最常用的基本玩法,本节将带着大家学习压缩.解压的相关步骤. Linux 学习笔记 4 创建.复制.移动.文件 ...

  8. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  9. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

随机推荐

  1. NOIP水题测试(2017082501)

    日常水题测试又来了! 以后答案都以单题形式公布. 下面看今天的水题: 时间限制:5小时 题目一:无法形容的水 题目二:比上一题还水 题目三:一元三次方程求解 题目四:单词接龙 题目五:统计单词个数 题 ...

  2. 全球IT经理一致喜爱的ITSM系统、it服务台软件

  3. python对数据类型的相关操作

    一.int的相关操作 int只有一个相关操作,bit_length()   用于计算一个数字的二进制长度 二.bool的相关操作 1.把数字转换成bool,除了0,返回的都是True a = 10 p ...

  4. oracle listagg within group

    案例: 查看,每个人身上的标签. 1)表数据 2)SQL select name,listag(tag,',') within group(order by tag) tags from table_ ...

  5. Eclipse中配置约束

    一.本地配置schema约束(xsd文件): 1.比如配置spring的applicationContext.xml中的约束条件: 复制applicationContext.xml中如图: 2.win ...

  6. 2018.11.17 bzoj4259: 残缺的字符串(fft)

    传送门 fftfftfft套路题. 我们把aaa ~ zzz映射成111 ~ 262626,然后把∗*∗映射成000. 考虑对于两个长度都为nnn的字符串A,BA,BA,B. 我们定义一个差异函数di ...

  7. springboot Thymeleaf 整合

    Thymeleaf是一个Java模板引擎开发库,可以处理和生成HTML.XML.JavaScript.CSS和文本,在Web和非Web环境下都可以正常工作. Thymeleaf可以跟Spring bo ...

  8. java socket之多人聊天室Demo

    一.功能介绍 该功能实现了一个类似QQ的最简单多人聊天室,如下图所示. 二.目录结构 三.服务端 1)SocketServer类,该类是服务端的主类,主要负责创建聊天窗口,创建监听客户端的线程: pa ...

  9. s4-介质访问控制子层-1 MAC子层

    数据链路层被分成了两个子层:MAC和LLC MAC子层要解决什么问题? 介质访问控制(Madia Access Control) 数据通信方式 单播(unicast):One - to - One ...

  10. HTTP请求模型和头信息参考

    发送HTTP请求:一个请求由四个部分组成:请求行.请求头标.空行和请求数据 请求行 请求行由三个标记组成:请求方法.请求URI和HTTP版本,它们用空格分隔.例如:GET /index.html HT ...