Linux环境编程导引
计算机系统硬件组成
总线
贯穿整个系统的一组电子管道称为总线, 分为:
片内总线
系统总线
数据总线DB
地址总线AB
控制总线CB
外部总线
I/O设备
I/O设备是系统与外界联系的通道
键盘鼠标是输入设备,显式器是输出设备,磁盘既是输入设备也是输出设备,输入输出是相对于内存来说的。
内存
内存是一个重要的部件,它是与CPU进行沟通的桥梁。它用来存放程序以及程序要处理的数据,磁盘中的程序要加载到内存才能运行。
处理器
中央处理器(CPU),简称处理器。
CPU主要有运算器、控制器、寄存器构成
取指: PC, IR
译码: 指令译码器, RISC, CISC
执行: ALU
写回: -> 内存
跳转: JMP
系统结构图
DMA传输
DMA (直接访问内存)传输将数据从一个地址空间复制到另外一个地址空间的一种技术。当 CPU 初始化这个传输动作时,传输动作本身是由 DMA 控制器 来实行和完成, 而CPU可以继续去完成其他的工作, CPU仅在传输动作的开始和结束的时候参与数据传输的控制。 典型的例子就是移动一个外存的区块到芯片内部的内存区。像是这样的操作并没有让处理器工作拖延,反而可以使CPU重新去处理其他的工作。在实现DMA传输时,是由DMA控制器直接掌管总线。
操作系统
什么是操作系统
操作系统是”有效地管理计算机系统中的资源,合理地管理计算机系统的工作流程,方便用户使用”的程序的集合。
操作系统三个基本抽象
操作系统拥有三个基本抽象概念: 进程、虚拟存储器和文件。
文件是对I/O设备的抽象表示,虚拟存储器是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。
进程
进程是操作系统对正在运行的程序的一种抽象。一个系统可以运行多个进程,而每个进程好像在独占使用硬件。
进程上下文切换
虚拟存储器
虚拟存储器为每个进程提供了一个大的、一致的、私有的地址空间;
它将内存看成是存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在主存与磁盘中来回交换数据。
为每个进程提供一致的地址空间,简化了存储管理,保护每个进程的地址空间不被其他进程破坏。
进程虚地址空间
文件
文件是一系列的字节序列,它向应用程序提供了一个统一的视角,来看待系统中各式各样的I/O设备。
虚拟文件系统VFS
虚拟文件系统是内核实现的一种架构,为用户空间提供统一的文件操作接口,即文件系统调用。它在内核内部为不同的真实文件系统提供一致的抽象接口。
用户通过系统调用与内核中的虚拟文件系统交互,进而操作实际的文件系统和设备。
系统编程 VS. 应用编程
系统编程
在操作系统之上利用系统调用、C库进行对系统资源进行访问。编写如apache 、gcc、gdb 等的服务应用.
系统资源包括:处理器,输入输出,进程管理,内存,设备,定时器,进程间通信,网络
应用编程
在更高层次的编程接口或者库之上构建应用程序。如android程序(android sdk)、iphone程序(iphone sdk)、QT程序设计(QT)、MFC程序设计(MFC)等。
系统调用在系统中所处的位置
所有操作系统都提供多种服务的入口点,由此程序向系统核请求服务。这些入口点被称之为系统调用(system call),
C库
这里我们所说的C库(libc),指的是标准C定义的C函数的集合。如标准输入输出函数、字符串处理函数、动态存储分配函数、日期时间函数、数学函数等。
GNU发布的libc称为glibc.
系统调用与C库关系
系统调用与C库从形式上来看都C函数;
但C库函数有些是调用系统调用来实现的,比如说malloc、free调用brk,printf调用write系统调用,而有些函数不需要任何系统调用,比如abs(fabs)、strcpy、atoi等,因为它并不是必需要使用内核服务;
因此系统调用通常提供的是最小界面,而C库函数通常提供更复杂的功能。
内核如何处理系统调用
内核通过软中断的方式实现系统调用, 每个系统调用被赋予一个系统调用号, 在i386平台上,执行一个系统调用需要通过 INT 0x80 指令来完成, 从用户态切换到核心态.
寄存器eax存放系统调用号, 寄存器ebx、ecx、edx、esi、edi存储系统调用参数,对于超过5个参数的系统调用,用一个寄存器(如ebx)指向用户空间的某个缓存, 该缓存存储所有系统调用的参数(可以多于5个)。
错误处理
在系统编程中通常通过函数返回值来表示错误(一般-1代表函数执行出错),并通过特殊变量errno来描述。
errno这个全局变量在 errno.h 头文件中声明如下:extern int errno;
错误处理函数:perror, strerror;
//示例
int main()
{
int ret = close(10);
/*
if (ret == -1)
{
perror("close error");
}
*/
if (ret == -1)
{
fprintf(stderr, "close error with message: %s, errno = %d\n",
strerror(errno), errno);
}
return 0;
}
|
常见错误代码 |
|
|
E2BIG |
参数列表太长 |
|
EACCESS |
权限不足 |
|
EAGAIN |
重试 |
|
EBADF |
错误的文件描述符 |
|
EBUSY |
设备或资源忙 |
|
ECHILD |
无子进程 |
|
EDOM |
数学参数不在函数域内 |
|
EEXIST |
文件已存在 |
|
EFAULT |
地址错误 |
|
EFBIG |
文件太大 |
|
EINTR |
系统调用被中断 |
//常见错误代码打印程序
int main()
{
for (int i = 0; i < 140; ++i)
{
errno = i;
cout << "errno " << i << ": " << strerror(errno) << endl;
}
return 0;
}
Linux环境编程导引的更多相关文章
- Linux环境编程相关的文章
Linux环境编程相关的文章 好几年没有接触Linux环境下编程了,好多东西都有点生疏了.趁着现在有空打算把相关的一些技能重拾一下,顺手写一些相关的文章加深印象. 因为不是写书,也受到许多外部因素限制 ...
- Linux 环境编程:dirfd参数 有关解析
背景 在Unix环境编程中,系统提供了很多以at结尾的函数,如openat.fstatat等,而这类函数通常有一个特点,就是形参列表中多了int dirfd 例如: int open(const ch ...
- Linux环境编程--waitpid与fork与execlp
waitpid waitpid(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t w ...
- Linux环境编程进程间通信机制理解
一.Linux系统调用主要函数 二.创建进程 1.创建子进程系统调用fork() 2.验证fork()创建子进程效果 3.系统调用fork()与挂起系统调用wait() 三.模拟进程管道通信 四.pi ...
- 笔记整理:计算CPU使用率 ----linux 环境编程 从应用到内核
linux 提供time命令统计进程在用户态和内核态消耗的CPU时间: [root@localhost ~]# time sleep real 0m2.001s user 0m0.001s sys 0 ...
- 【Linux环境编程】获取网卡的实时网速
在windows以下.我们能够看到360或者是qq安全卫士的"安全球".上面显示实时的网速情况.那么在linux里面怎样获取网卡的实时网速?事实上原理非常easy,读取须要获取网速 ...
- Linux环境编程之同步(二):条件变量
相互排斥锁用于上锁,条件变量则用于等待.条件变量是类型为pthread_cond_t的变量.一般使用例如以下函数: #include <pthread.h> int pthread_con ...
- Linux环境编程之同步(四):Posix信号量
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语.有三种类型:Posix有名信号量,使用Posix IPC名字标识.Posix基于内存的信号量,存放在共享内存区中:System ...
- Linux环境编程之同步(三):读写锁
概述 相互排斥锁把试图进入我们称之为临界区的全部其它线程都堵塞住.该临界区通常涉及对由这些线程共享一个或多个数据的訪问或更新.读写锁在获取读写锁用于读某个数据和获取读写锁用于写直接作差别. 读写锁的分 ...
随机推荐
- Gradle 1.12用户指南翻译——第五十三章. 签名插件
其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上的地址:https://gith ...
- 建立自己的git服务器
需求情景 就像金山快盘同步盘那样, 在开发环境windows 10和部署环境Ubuntu server 14.04之间建立同步关系.比如windows端多了一个a.txt文件,你推送后,Ubuntu端 ...
- 安卓热修复之AndFIX
我致力于最新的前沿安卓技术分析和使用教学,不打算将很多很深的东西,因为有多少人愿意沉下你的心境去学习难点?我一般只会简单提及.文字错漏在所难免还希望同学们喜欢 热修复介绍 热修复是什么? 如果你一个项 ...
- XCode使用技巧
XCode使用技巧 自动生成get.set方法 @property 用法 #import <Foundation/Foundation.h> @interface People : NSO ...
- [系统运维]Supervisord安装和启动程序
supervisord 是client/server 系统 把不是守护进程的进程变成守护进程 监控它自己启动的进程,类似于看门狗 可以作为开机启动的一种封装 可以精确控制进程的状态,而不是pidfil ...
- linux中probe函数传递参数的寻找(下)
点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...
- Android 网络图片加载之cude 框架
偶然发现了这个框架,阿里图片加载用的这个框架.非常简单操作步骤. 1.首先下载软件包,直接搜Cube ImageLoader 这个. 2.加入jar文件 3.使用前的配置: public class ...
- Java基本语法-----java关键字
1.1关键字的概述 Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. 1.2常见的关键字 备注: 不必死记硬背 ...
- COM原理与实现之二: 聚合
COM原理与实现之二: 聚合 C++没有同聚合等价的特性.聚合实际上是继承性的一种动态形式.而C++的继承总是静态的,是实现继承.COM是接口继承,通过聚合接口,可以做成动态配置. 研究COM,主要是 ...
- UNIX网络编程——select函数的并发限制和 poll 函数应用举例
一.用select实现的并发服务器,能达到的并发数,受两方面限制 1.一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n来调整或者使用setrlimit函数设置, ...