本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题。

系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作,进行进程间的通信等。

系统调用与C语言的函数调用类似。但是系统调用的过程比C语言函数调用复杂,开销也大得多。

Linux 的系统调用通过 int 0x80 实现,用系统调用号来区分入口函数。操作系统实现系统调用的基本过程是:
应用程序调用库函数(API);
API 将系统调用号存入 EAX,然后通过中断调用使系统进入内核态;
内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用);
系统调用完成相应功能,将返回值存入 EAX,返回到中断处理函数;
中断处理函数返回到 API 中;
API 将 EAX 返回给应用程序。

本章后续部分重点介绍了后面章节所要使用的头文件及其实现,主要如下:

ename.c.inc

error_functions.h

get_num.h

tlpi_hdr.h

其中ename.c.inc文件定义了一个字符串数组,用于对应错误码的名称。

error_functions.h文件声明了本书自定义的错误处理函数。

get_num.h文件声明了本书自定义的数值提取函数。

tlpi_hdr.h文件则包含了后续需用到的系统调用头文件。

由于存在3个头文件以及2个实现,每次编译时必须对实现也进行编译,为方便后续学习,采用将头文件复制到默认的编译器寻找目录下,并将实现打包成静态库,然后使用别名来默认链接静态库。

以Debian/Ubuntu为例,具体操作如下:

第一步:下载本书所给的源码文件

wget "http://man7.org/tlpi/code/download/tlpi-161214-dist.tar.gz"

或者点此下载

第二步:解压后,make编译

tar -zxvf tlpi-161214-dist.tar.gz
cd tlpi-dist/
make -j

第三步:拷贝头文件至系统目录

cd lib/
sudo cp tlpi_hdr.h /usr/local/include/
sudo cp get_num.h /usr/local/include/
sudo cp error_functions.h /usr/local/include/
sudo cp ename.c.inc /usr/local/include/

第四步:制作静态库文件

g++ -c get_num.c error_functions.c
ar -crv libtlpi.a get_num.o error_functions.o
sudo cp libtlpi.a /usr/local/lib

第五步:简化编译命令

alias gl++='new() { g++ $1 -ltlpi;}; new'

第五步需要在当前用户的主目录下的.bashrc文件中设置别名,由于alias不支持参数,因此需要使用函数来间接实现,并且接受一个参数$1以指定对某个源文件进行编译并链接之前的静态库libtlpi.a。配置完毕后重新读入.bashrc文件以生效。这里使用函数来接受一个参数存在一个缺点即只能使用一个命令行参数,多余参数将被忽略。

完成上面的步骤后,即可使用快捷命令来编译我们的程序了:

gl++ main.cpp

该命令将编译生成a.out文件。

如果不想使用第五步来简化,则每次编译手动来链接库,命令如下:

g++ main.cpp -o main -ltlpi

转载于:https://www.cnblogs.com/pluse/p/6296992.html

Linux/Unix系统编程手册 第三章:系统编程概念相关推荐

  1. IA-32系统编程指南 - 第三章 保护模式的内存管理【1】

    第三章 保护模式的内存管理[1] [作者:lion3875 原创文章 参考文献<Intel 64 and IA-32 system programming guide>] IA-32保护模 ...

  2. Unix网络编程卷一第三章笔记

    前言 这篇文章主要是Unix网络编程卷一第三章的个人笔记 1.POSIX 规范的三个字段 sin_family sin_addr sin_port 2.IPV4 套接字结构 五个套接字结构 IPV4( ...

  3. 【 linux系统入门管理篇-第三章权限管理】

    [ linux系统入门管理篇-第三章权限管理] 本章介绍 一.基本权限UGO 二.基本权限 ACL 三.特殊权限 本章介绍 本章讲述了,Linux系统CentOS7中关于权限的相关概念.以及用户和组的 ...

  4. 《Spark快速大数据分析》—— 第三章 RDD编程

    本文转自博客园xingoo的博客,原文链接:<Spark快速大数据分析>-- 第三章 RDD编程,如需转载请自行联系原博主.

  5. 第三章 系统指令与汇编程序设计 3.1 单片机指令系统

    第三章 系统指令与汇编程序设计 3.1 单片机指令系统 3.1.1 寻址空间及常用符号 3.1.2 寻址方式 3.1.3 数据传送与交换指令 3.1.4 算术运算指令 3.1.5 逻辑操作指令 3.1 ...

  6. Java7并发编程指南——第三章:线程同步辅助类

    Java7并发编程指南--第三章:线程同步辅助类 @(并发和IO流) Java7并发编程指南第三章线程同步辅助类 思维导图 项目代码 思维导图 项目代码 GitHub:Java7Concurrency ...

  7. ROS2机器人编程简述humble-第三章-COMPUTATION GRAPH .2

    ROS2机器人编程简述humble-第三章-PERCEPTION AND ACTUATION MODELS .1 避开障碍物计算图如何呢? 该应用程序的计算图非常简单:订阅激光主题的节点向机器人发布速 ...

  8. JAVA实现数据库编程第三章_[数据库]使用Java实现数据库编程—03 第三章 高级查询(一)...

    [数据库]使用Java实现数据库编程-03 第三章 高级查询(一) 0 2018-07-21 03:01:10 1.修改表:(1)修改表名语法: ALTER TABLE RENAME [ TO ] : ...

  9. JavaScript高级编程设计(第三版)——第三章:基本概念

    系列文章目录 第二章:在html中使用javaScript 第三章:基本概念 第四章:变量作用域和内存问题 目录 系列文章目录 前言 一.语法 1.标识符 2.关键字和保留字 二.数据类型 1.nul ...

最新文章

  1. error while loading shared libraries: ../../lib/libopencv_core.so
  2. 改变客户端访问时的方法名
  3. resourceAsStream
  4. linux下隐藏输入密码
  5. hive相关操作语句
  6. 【转】分享oldjun老大***网站的经验
  7. 小米 9 开源内核代码,上市即开源
  8. JavaScript学习10 JS数据类型、强制类型转换和对象属性
  9. 网络研讨会|为什么在开发流程中应用静态代码分析工具?
  10. ERD Commander 2005 使用教程
  11. IOS10 权限问题
  12. 制作简单的android小应用,安卓 Android之开发简单小应用(一)
  13. 计算机用户与权限如何设置密码,如何设置电脑用户权限_如何设置电脑使用时间...
  14. C++游戏编程教程(七)——改进飞机大战游戏
  15. 计算三大变化,带来了哪些红利?
  16. Hutool工具类之excel导入导出
  17. golang 字符串拼接性能比较
  18. C语言计算一个整数的位数
  19. 网络连接变成小地球,提示无法访问internet
  20. BigPipe理解及用法

热门文章

  1. 问题解决: 解释器错误: 没有那个文件或目录
  2. 逆元~(乘法逆元及其应用)
  3. C语言结构体里的成员数组和指针
  4. 工人物语5战役攻略_《工人物语7》入门详细图文攻略
  5. python空气质量分析报告_Python数据可视化:2018年北上广深空气质量分析
  6. 浏览器控制台执行代码_JavaScript 和 浏览器那些事
  7. #地形剖面图_高考地理笔记:经纬网、等值线、地形剖面图知识汇总
  8. 输出java_java基础----Java的格式化输出
  9. hdu3695(AC自动机)
  10. 2017年09月23日普级组 树塔狂想曲