[APUE]UNIX环境高级编程勘误表ver3

本文记录在阅读《UNIX环境高级编程》第三版过程中发现的错误,写这篇文章时阅读到第五章标准I/O库.

2014年6月第二版 2015年6月北京第4次印刷.

本书是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的更新版。在本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持了前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技术发展。书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、......

Makefile与C

本文记录学习Makefile的过程,从C工程编译入手,在看之前APUE TLPI等书时源代码中均采用了Makefile的形式,因此此篇文章记录学习过程,会长期更新,如果有任何错误与疑问欢迎指出。

在编译一个大型项目的时候,往往有很多目标文件、库文件、头文件以及最终的可执行文件。不同的文件之间存在依赖关系(dependency)。

在我们编译一个大型项目时,我们往往要很多次的调用编译器,来根据依赖关系,逐步编译整个项目。这样的方式是自下而上的,即先编译下游文件,再编译上游文件。

UNIX系统下的make工具用于自动记录和处理文件之间的依赖关系。我们不用输入大量的"gcc&quo......

实现cp命令

在看了《Linux/UNIX系统编程手册》和APUE前几章之后发现缺少相应的实践,如果只是单纯的了解API并没有太大意义,因此决定跟随《UNIX/Linux编程实践教程》将书中的例子调通与理解透。然后再去啃APUE,效果应该会好很多。

书中第二章给出了cp实现的,由于书写与2004年,代码看上去有些“另类”,对于编译过程中发现的问题进行修改。

/**************** copy command ******************/

/*

* cp命令的简单实现

* 实现思路:文件在磁盘上,源文件在左边,右边的是目标文件,进程在用户空间,缓冲区是进程内存的一部分,

* ......

实现who命令

在看了《Linux/UNIX系统编程手册》和APUE前几章之后发现缺少相应的实践,如果只是单纯的了解API并没有太大意义,因此决定跟随《UNIX/Linux编程实践教程》将书中的例子调通与理解透。然后再去啃APUE,效果应该会好很多。

书中第二章给出了who实现的,由于书写与2004年,代码看上去有些“另类”,对于编译过程中发现的问题进行修改,在讲解代码前先记录如下用法:

grep -r命令

-r, --recursive

Read all files under each directory, recursively, following symbolic links ......

实现more命令

在看了《Linux/UNIX系统编程手册》和APUE前几章之后发现缺少相应的实践,如果只是单纯的了解API并没有太大意义,因此决定跟随《UNIX/Linux编程实践教程》将书中的例子调通与理解透。然后再去啃APUE,效果应该会好很多。

书中第一章给出了more实现的第一版,由于书写与2004年,代码看上去有些“另类”,修改后如下:

编译方法是直接使用gcc more01.c,然后./a.out more.01.c /etc/passwd

或从标准输入中获取信息直接输入./a.out

下面代码有几点需要注意:

if ( (fp = fopen(* ++argv, "r&q......

替换空格

请实现一个函数,把字符串中的每个空格替换成”%20”。例如输入“We are happy.”, 则输出”We%20are%20happy.”。

在网络编程中,如果URL参数中含有特殊字符,如空格、'#'等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在'%'后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成"%20"。再比如'#'的ASCII码为35,即十六进制的0x23,它在URL中被替换为"%23......

二维数组中的查找

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

分析:

1

2

8

9

2

4

9

12

4

7

10

13

6

8

11

15

从二维数组最右上角的数值(9)开始比较,若目标比该数大,则目标肯定在该数的下方,反之,在该数的左方。根据此规则,寻找下一个比较的数值,重复以上规则,直到找到目标数,或者数组越界。

//

// main.c

// func

//

// Created by 52coder o......

shell脚本判断文件是否存在

有一个需求是判断某一个目录下文件是否存在,如果该文件不存在,则从当前目录拷贝文件到该目录。

由于没有学习写过shell脚本,晚上下班回来搜索后写出了如下的脚本,这里shell的if语法格式与C语言大致相同,语法格式:

if [ 条件 ]; then

条件成立

else

条件不成立

fi

fi是结束if语句。

version1.0

#!/bin/sh

myFile="/root/apue/example.xml "

# 这里的-f参数判断$myFile是否存在

if [ ! -f "$myFile" ]; then

cp......

[CSAPP]程序的机器级表示

计算机执行机器代码,用字节序列编码低级的操作,包括处理数据、管理内存、读写存储设备上的数据,以及利用网络通信。编译器基于编程语言的规则、目标机器的指令集和操作系统遵循的惯例,经过一系列的截断生成机器代码。

在阅读本章的时候一定要复习一遍关于gcc的知识,参考GCC编译链接多文件

特别是以下一些介绍,我认为有必要贴在本章学习总结前面。

选项 -E

gcc -E test.c -o test.i 将test.c预处理输出test.i文件。

选项 -S

gcc -S test.i 将预处理输出文件test.i汇编成test.s文件。

选项 -c

gcc -c test.s 将汇编......

[CSAPP]信息的表示和处理

第二章信息的表示和处理主要研究三种最重要的数字表示:

1)无符号(unsigned)编码基于传统的二进制表示法,表示大于或者等于零的数

2)补码(two's-complement)编码是表示有符号数的最常见的方式,有符号整数就是可以为正或负的数字

3)浮点数(flsoating-point)编码是表示实数的科学计数法的以2位基数的版本。

浮点运算是不可结合的,例如在多数机器上表达式(3.14+le20)-le20求得的值会是0.0,而3.14+(le20-le20)求得的值是3.14.

整数运算和浮点运算会有不同的数学属性是因为他们处理数字表示有限性的方式不同:整数的表示虽然......