linux编程软件

微信可以设置雪花昵称了,真漂亮!!!

接着上一篇博客,把Linux环境下常用的vim编辑器,gcc工具链,makefile和gdb等工具的使用理一理。

一、vim编辑器

1,工作模式

        vim是Linux常用文本编辑器。vim有两种基本工作模式:

        命令模式:输入的字符作为命令使用,不进入被编辑的文档中。

        编辑模式:输入的字符将修改文档的内容。

        在命令模式下,如果输入某些编辑命令(一般切换到插入位置在光标处的编辑模式键入i),则切换到编辑模式;编辑模式下,按Esc可以切换回命令模式。

 命令模式分为三种:普通模式,命令行模式和选择模式。

普通模式输入完毕就执行,不需要回车确定。普通模式下输入一个冒号则进入命令行模式。

命令行模式:输入命令需按回车确认才执行,执行完毕后返回普通模式。

(1)普通模式下命令分为移动光标类,滚动屏幕类、编辑类等。

(a)移动光标类:

(b)滚动屏幕类:ctrl + F 向下滚动一屏   ctrl + B 向上滚动一屏   Ctrl + U 向上滚动半屏   ctrl + D 向下滚动半屏

(c)编辑类:

(d)文件类:ZZ存盘退出

 在普通模式下输入小写字母v进入选择模式,输入大写字母V进入按行选择模式,按Ctrl+V组合键进入按列选择模式。

(2)命令行模式

:help  查看帮助首页     :0 移动到第一行    :¥移动到最后一行   :n  移动到第n行    :w保存文件  :q退出文件  :n 新建文件 :wq 保存并退出

二、gcc工具链

GNU/Linux系统上常用的编译工具是GCC。GCC实质上不是一个单独的程序,而是多个程序的集合,因此通常称为工具链。

  1、程序编译过程:

(a)预处理微信设置水滴昵称,个性中带点萌

在这一阶段,源码中所有的预处理语句得到处理,例如

#include语句所包含的文件内容替换掉语句本身

所有已定义的宏被展开

根据#ifdef #if等语句的条件是否成立取舍相应部分

gcc预处理阶段可以生成.i文件,通过选项-E可以使编辑器在预处理结束时停止编译。例如:

gcc -E -o  hello.i  hello.c

(2)编译

在这一阶段,编译器对源码进行语法分析,优化等操作,最后生成汇编代码。这是整个过程中最重要的一部。

可以通过选项-S使GCC在进行完编译后停止,生成.s的汇编程序。例如:

gcc -S -o hello.s hello.c   

(3)汇编

这一阶段使用汇编器对汇编代码进行处理,生成机器语言代码,保存为后缀为.o的目标文件中。

当程序由多个代码文件构成时,每个文件都要进行汇编工作,生成.o目标文件后,才能进行下一步链接工作。

目标文件已经是最终程序的某一部分了,只是在链接之前还不能执行。可以通过-c选项生成目标文件:

gcc -c -o hello.o hello.c    

(4)链接

经过汇编后的机器码不能直接运行,为使操作系统能正确加载可执行文件,文件中必须包含固定格式的信息头。还必须与系统提供的启动代码链接起来才能正常运行,这些工作都由链接器来完成。

gcc -o hello hello.c   

再见,优酷!再见,爱奇艺!

2、gcc的基本用法

gcc [-Wall] [-O1..3] [-o name] file

-Wall:打开所有警告项

-O 设置优化级别, O0表示关闭优化功能

-g 将调试信息编译到目标文件中

-o name:指定输出文件的名字是name

file:被编译(链接)的文件。

使用举例:

三、make和makefile

 一个软件中通常包含很多文件,每次都进行编译会很麻烦而且效率低下。

在Windows平台上的VC、VB都有工程概念,一旦建立一个工程,这些开发平台会自动地维护其中的各种文件,从而高效编译。

在Linux中,使用make完成这一功能。

1、makefile文件说明

使用make工具,首先要编写makefile文件,一个makefile文件包含5个方面:

1、具体规则   2、隐含规则  3、定义变量    4、指令   5、注释 

2,makefile的规则:

诸如Autoconf和Automake的工具可以自动生成makefile文件。makefile的内容核心是一系列的规则。规则的基本格式是:

target:dependency

       (tab字符)command

(1)target(目标):通常是要产生的文件的名称

(2)dependency(依赖):指用来输入从而产生目标的文件。

(3)command(命令):是make执行的动作,一个规则可以有多条命令,每个命令一行。命令行首字符是TAB

3、makefile的实例:

(1)实例一:

objects = main.o mouse.o command.o display.o

CC = gcc

CFLAGS = -Wall -O2 -g               //相当于C中定义变量

game : $(objects)                         //定义game生成规则

             $(CC) -o edit $(objects)   

main.o : defs.h                             //定义main.o生成规则,包含隐含规则

mouse.o : defs.h command.h

command.o : defs.h command.h

display.o : defs.h buffer.h

.PHONY : clean

clean :                                          //定义clean的规则,无依赖

          $(RM) edit $(objects)  

  game的生成规则包含了规则的三个基本要素:目标、依赖、命令;main.o等规则没有命令,属于隐含规则(implicit rule)。clean规则没有依赖,不属于编译的内容,只是完成一个指定的动作。      

隐含规则能够告诉make使用传统的标准方法完成任务。例如,生成一个目标文件的方法是使用C编译器编译C语言源程序,这个步骤所用到的命令基本都是相同的。使用隐含规则就无须详细指定这些命令,而make能按照文件名的后缀的变化,决定所采用的规则。      

(2)实例二:

变量是makefile中定义的名字,用来代替一个文本中的字符串 ,该文本字符串称为该变量的值。Makefile中常见预定义变量有:

(a)CC  默认值cc(gcc)是C编译器的名称。

(b)CPP 默认是$(CC) -E 是C与预编译器的名称。

(c)CXX默认值是g++,是C++编译器的名称、

(d)RM 默认值 rm -f 是删除程序的名称。

(f)$@ 用在生成规则中,表示当前目标。

(g)$< 用在生成规则中,表示当前目标的第一个依赖目标。

(h)$^ 用在生成规则中,表示当前目标的所有依赖目标。

使用变量的方式:$(变量名)变量名只是字符时,()可省略

常用的变量赋值操作:

:= 直接赋值,信值覆盖原来的值。

?= 条件赋值,如果原来无值则赋值。否则保持原来的值。

+= 加法赋值,新值附加在原来值后面。

= 递归赋值,如果右侧包含其他变量,当这些变量的值变化时,被赋值变量的值也变化。

4,make的用法:

make 工具的基本用法如下:

make [-C dir] [-f file] [target]

-C dir:执行时进入dir目录,默认当前目录

-f file:使用file作为makefile

target:要完成的目标,目标在makefile中定义,默认是定义的第一个目标。

四、gdb调试工具

GDB是GNU的调试工具,它可以跟踪被调试的程序,进行设置断点、单步执行等操作。当程序暂停执行时,可以使用命令查看程序中的变量值、CPU的寄存器值、内存的值以及函数调用栈等信息。    

被调试的应用程序在编译时最好使用-g参数将调试信息编入目标文件中:

gcc -g app.c -o app

用以下命令启动对程序app的调试:

gdb app

如果程序app运行时需要参数,则用以下命令:

gdb --args app arg1 arg2  // arg1和arg2被视为app的参数,而不是gdb的参数   

启动后进入GDB交互界面,可以输入GDB的命令进行调试,常用命令如下(回车是重复上一条命令):

 

Shell进阶那一块看着有点复杂,不太容易搞定,需要再抽个时间仔细过一过了,今天就到这儿了,算是完成了今天的目标吧。总结一下今天:白天有点贪玩,浪费了一部分时间,以后尽量把娱乐时间安排在晚上9点以后。另一个方面是需要规划一下运动时间,今天只是在晚饭后在外面溜达了几圈,运动量太少了,需要加强!明天一天把C语言的所有语法过一遍,这些东西应该已经熟记于心了,再快速过一遍,查缺补漏,顺表敲一些常用的,简单的数据结构实例,为后天做准备。 ———————————————— 版权声明:本文为CSDN博主「iotflh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/iotflh/article/details/86499259

以上就是良许教程网为各位朋友分享的Linux相关知识。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
linux内核编程 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 1.1.5 地址空间 9 1.1.6 时钟 9 1.2 软件基础 9 1.2.1 计算机语言 9 1.2.2 什么是操作系统 11 1.2.3 内核数据结构 13 第2章 内存管理 15 2.1 虚拟内存抽象模型 15 2.1.1 请求调页 17 2.1.2 交换 17 2.1.3 共享虚拟内存 18 2.1.4 物理寻址模式和虚拟寻址模式 18 2.1.5 访问控制 18 2.2 高速缓存 19 2.3 Linux页表 20 2.4 页分配和回收 21 2.4.1 页分配 22 2.4.2 页回收 22 2.5 内存映射 22 2.6 请求调页 23 2.7 Linux页缓存 24 2.8 页换出和淘汰 25 2.8.1 减少缓冲区和页缓存大小 25 2.8.2 换出System V共享内存页 26 2.8.3 换出和淘汰页 27 2.9 交换缓存 27 2.10 页换入 28 第3章 进程 29 3.1 Linux进程 29 3.2 标识符 31 3.3 调度 32 3.4 文件 34 3.5 虚拟内存 35 3.6 创建进程 36 3.7 时间和定时器 37 3.8 执行程序 38 3.8.1 ELF 39 3.8.2 脚本文件 40 第4章 进程间通信机制 41 4.1 信号机制 41 4.2 管道 42 4.3 套接字 44 4.3.1 System V的进程间通信机制 44 4.3.2 消息队列 44 4.3.3 信号量 45 4.3.4 共享存储区 47 第5章 PCI 49 5.1 PCI的地址空间 49 5.2 PCI配置头 50 5.3 PCI的I/O和存储地址空间 51 5.4 PCI-ISA桥 51 5.5 PCI-PCI 桥 51 5.5.1 PCI-PCI桥:PCI I/O和存储地址 空间的窗口 51 5.5.2 PCI-PCI桥:PCI配置周期和PCI 总线编号 52 5.6 Linux PCI初始化 53 5.6.1 Linux内核PCI数据结构 53 5.6.2 PCI设备驱动程序 53 5.6.3 PCI的BIOS函数 56 5.6.4 PCI修正过程 57 第6章 中断处理与设备驱动程序 60 6.1 中断与中断处理 60 6.1.1 可编程中断控制器 61 6.1.2 初始化中断处理数据结构 61 6.1.3 中断处理 62 6.2 设备驱动程序 63 6.2.1 测试与中断 64 6.2.2 直接存储器访问(DMA) 65 6.2.3 存储器 66 6.2.4 设备驱动程序与内核的接口 66 6.2.5 硬盘 69 6.2.6 网络设备 74 第7章 文件系统 77 7.1 第二个扩展文件系统EXT2 78 7.1.1 EXT2系统的inode节点 79 7.1.2 EXT2系统的超级块 80 7.1.3 EXT2系统的组描述符 80 7.1.4 EXT2系统的目录 81 7.1.5 在EXT2文件系统中查找文件 81 7.1.6 在EXT2文件系统中改变文件 的大小 82 7.2 虚拟文件系统 83 7.2.1 VFS文件系统的超级块 84 7.2.2 VFS文件系统的inode节点 84 7.2.3 注册文件系统 85 7.2.4 装配文件系统 85 7.2.5 在虚拟文件系统中查找文件 87 7.2.6 卸载文件系统 87 7.2.7 VFS文件系统的inode缓存 87 7.2.8 目录缓存 88 7.3 缓冲区缓存 88 7.3.1 bdflush内核守护进程 90 7.3.2 update进程 90 7.4 /proc文件系统 91 7.5 特殊设备文件 91 第8章 网络 92 8.1 TCP/IP网络概述 92 8.2 Linux中的TCP/IP网络层次结构 95 8.3 BSD套接字接口 96 8.4 INET的套接字层 97 8.4.1 创建BSD套接字 98 8.4.2 为INET BSD Socket绑定地址 99 8.4.3 建立INET BSD Socket连接 99 8.4.4 INET BSD Socket侦听 100 8.4.5 接受连接请求 100 8.5 IP层 100 8.5.1 套接字缓冲区 100 8.5.2 接收IP报文 101 8.5.3 发送IP报文 102 8.5.4 数据分片 102 8.6 地址解析协议 103 8.7 IP路由 104 第9章 内核机制与模块 107 9.1 内核机制 107 9.1.1 Bottom Half控制 107 9.1.2 任务队列 108 9.1.3 定时器 109 9.1.4 等待队列 110 9.1.5 自旋锁 110 9.1.6 信号量 110 9.2 模块 111 9.2.1 模块载入 112 9.2.2 模块卸载 113 第10章 处理器 115 10.1 X86 115 10.2 ARM 115 10.3 Alpha AXP处理器 115 第11章 Linux内核源代码 117 11.1 怎样得到Linux内核源码 117 11.2 内核源码的编排 117 11.3 从何处看起 118 第12章 Linux数据结构 120 附录A 有用的Web和FTP站点 138 附录B 词汇表 139 第二部分 Linux内核模块编程指南 致谢 前言 第1章 Hello, World 145 1.1 内核模块的Makefiles文件 146 1.2 多重文件内核模块 147 第2章 字符设备文件 149 第3章 /proc文件系统 158 第4章 把/proc用于输入 162 第5章 把设备文件用于输入 170 第6章 启动参数 182 第7章 系统调用 185 第8章 阻塞处理 190 第9章 替换printk 199 第10章 任务调度 202 第11章 中断处理程序 207 第12章 对称多处理 211 第13章 常见错误 212 附录A 2.0和2.2之间的差异 213 附录B 其他资源 214 附录C 给出你的评价 215 第三部分 Linux程序员指南 第1章 Linux操作系统 219 第2章 Linux内核 220 第3章 Linux libc包 221 第4章 系统调用 222 第5章 “瑞士军刀”:ioctl 223 第6章 Linux进程间通信 224 6.1 介绍 224 6.2 半双工Unix管道 224 6.2.1 基本概念 224 6.2.2 用C语言创建管道 225 6.2.3 简便方法 229 6.2.4 管道的原子操作 233 6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 基本概念 237 6.4.2 消息队列 239 6.4.3 信号量 251 6.4.4 semtool:交互式信号量操作 程序 260 6.4.5 共享内存 267 第7章 声音编程 274 7.1 内部扬声器编程 274 7.2 声卡编程 274 第8章 字符单元图形 276 8.1 libc中的I/O函数 277 8.1.1 格式化输出 277 8.1.2 格式化输入 278 8.2 termcap库 278 8.2.1 前言 278 8.2.2 获得终端描述 279 8.2.3 查看终端描述 279 8.2.4 termcap权能 280 8.3 Ncurses简介 280 8.4 初始化 282 8.5 窗口 283 8.6 输出 284 8.6.1 格式化输出 285 8.6.2 插入字符/行 286 8.6.3 删除字符/行 286 8.6.4 方框和直线 287 8.6.5 背景字符 287 8.7 输入 288 8.8 选项 289 8.8.1 输出选项 289 8.8.2 输入选项 290 8.8.3 终端属性 291 8.8.4 使用选项 291 8.9 更新终端 292 8.10 视频属性与颜色 293 8.11 光标和屏幕坐标 294 8.12 滚动 294 8.13 小键盘 295 8.14 软标签 295 8.15 杂项 295 8.16 低级访问 296 8.17 屏幕转储 296 8.18 Termcap模拟 296 8.19 Terminfo函数 296 8.20 调试函数 297 8.21 Terminfo权能 297 8.21.1 布尔型权能 297 8.21.2 数值型权能 298 8.21.3 字符串型权能 299 8.22 [N]Curses函数概述 306 第9章 I/O端口编程 307 9.1 鼠标编程 307 9.2 调制解调器编程 308 9.3 打印机编程 308 9.4 游戏杆编程 308 第10章 把应用程序移植到Linux上 309 10.1 介绍 309 10.2 信号处理 309 10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux信号选项 310 10.2.3 Linux下的信号 310 10.2.4 Linux支持的信号 311 10.3 终端I/O 311 10.4 进程信息和控制 311 10.4.1 kvm过程 312 10.4.2 ptrace和/proc文件系统 312 10.4.3 Linux下的进程控制 312 10.5 可移植条件编译 313 10.6 补充说明 314 附录 以字母顺序排列的系统调用 315 第四部分 Linux内核概念系统结构 摘要 323 前言 324 第1章 系统结构 325 1.1 系统概述 325 1.2 内核的目标 325 1.3 内核结构的概述 325 1.4 支持多个开发人员 327 1.5 系统数据结构 328 1.5.1 任务列表 328 1.5.2 内存映射 328 1.5.3 索引节点 328 1.5.4 数据连接 329 第2章 子系统的系统结构 330 2.1 进程调度程序系统结构 330 2.1.1 目标 330 2.1.2 模块 330 2.1.3 数据表达 331 2.1.4 依赖性、数据流和控制流 331 2.2 内存管理程序系统结构 331 2.2.1 目标 331 2.2.2 模块 331 2.2.3 数据表示 331 2.2.4 数据流、控制流和依赖性 332 2.3 虚拟文件系统系统结构 333 2.3.1 目标 333 2.3.2 模块 333 2.3.3 数据表示 333 2.3.4 数据流、控制流和依赖性 334 2.4 网络接口系统结构 334 2.4.1 目标 334 2.4.2 模块 334 2.4.3 数据表示 335 2.4.4 数据流、控制流和依赖性 335 2.5 进程间通信系统结构 335 第3章 结论 336 附录A 术语定义 337 附录B 参考文献 338 第五部分 Linux内核具体系统结构 摘要 341 第1章 前言 342 1.1 目标 342 1.2 Linux介绍 342 1.3 软件系统结构的背景知识 342 1.4 方法与途径 343 1.5 适用本书的读者 344 1.6 本部分的章节安排 344 第2章 系统结构 345 第3章 子系统结构 346 3.1 进程调度程序 346 3.1.1 目标 346 3.1.2 外部接口 346 3.1.3 子系统描述 346 3.1.4 数据结构 347 3.1.5 子系统结构 348 3.1.6 子系统依赖性 348 3.2 内存管理程序 348 3.2.1 目标 348 3.2.2 外部接口 349 3.2.3 子系统描述 349 3.2.4 数据结构 350 3.2.5 子系统结构 350 3.2.6 子系统依赖性 351 3.3 虚拟文件系统 352 3.3.1 目标 352 3.3.2 外部接口 352 3.3.3 子系统描述 353 3.3.4 设备驱动程序 353 3.3.5 逻辑文件系统 354 3.3.6 模块 354 3.3.7 数据结构 355 3.3.8 子系统结构 355 3.3.9 子系统依赖性 355 3.4 进程间通信 355 3.4.1 目标 355 3.4.2 外部接口 357 3.4.3 子系统描述 357 3.4.4 数据结构 358 3.4.5 子系统结构 359 3.4.6 子系统依赖性 359 3.5 网络接口 360 3.5.1 目标 360 3.5.2 外部接口 361 3.5.3 子系统描述 361 3.5.4 数据结构 362 3.5.5 子系统结构 363 3.5.6 子系统依赖性 363 第4章 结论 365 附录A 术语定义 366 附录B 参考文献 368 第六部分 附 录 附录A Linux文档工程拷贝许可证 372 附录B GNU通用公共许可证 374

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值