作为开发者,我们深有体会,不管是进行什么开发,为了部署开发环境,我们往往需要折腾很长时间、查阅很多资料才能完成,而且这次折腾完了,下次到了另一台新电脑上又得重新来过,整个部署过程记得还好,要是不记得又得重新开始,而且遇到Android这种GFW阻隔了开发资源下载链接的环境部署,又尤其浪费时间。所以这也是我写下这篇教程的初衷跟动力源泉,希望大家参考了这篇教程以后可以轻轻松松在Mac系统下将Android环境部署好。 阅读全文
在Linux下开发网络程序时,经常会遇到需要取本地网络接口名、IP、广播地址、子网掩码或者MAC地址等信息的需求,最常见的办法是配合宏SIOCGIFHWADDR、SIOCGIFADDR、SIOCGIFBRDADDR与SIOCGIFNETMASK作为参数调用函数ioctl分别获得MAC地址、IP地址、广播地址与子网掩码来实现。一次性获取此类信息的C语言代码实现如下。 阅读全文
一、Makefile的语法
一个基本的 makefile 主要由目标对象、依赖文件、变量和命令四部分组成,目标对象是 make 命令最终需要生成的文件,通常为目标文件或可执行程序;依赖文件是生成目标对象所依赖的文件,通常为目标文件或源代码文件;使用变量保存与引用一些常用值可以增强 makefile 文件的简洁性、灵活性跟可读性,一处定义,多处使用,通常还可以对其内容进行赋值或追加;目标对象通常对应着依赖文件而成为一条规则,如“hello.o:hello.c hello.h”,而对应这条规则,通常跟随着一些命令,这些命令的格式跟 Shell 终端的格式一致,如“rm -f *.o”或“$(CC) -c hello.c -o hello.o”,注意每条命令语句前面必须加上制表符 tab 键,否则 make 命令将提示错误,不论是规则语句还是命令语句,都可以引用变量,如“$(CC)”,make 命令在执行这些语句之前都会先将变量替换为它对应的值。 阅读全文
对于 Linux 跟 Unix 系统而言,make 是一个极其重要的编译命令,我们在开发项目或者安装应用软件时,经常要用到 make 或 make install,对于一个包含几十、几百甚至成千上万个源文件的项目,如果每次都要键入 gcc 或 g++ 等命令来进行编译的话,那对于程序员简直就是一场噩梦,而使用 make 和 makefile 工具便可以简洁明了地理顺各个源文件之间纷繁复杂的相互关系,将大型项目分解成多个更易于管理的模块,自动完成编译工作,并且可以只对程序员上次编译后修改过的部分进行编译。
因此,有效的利用 make 和 makefile 工具可以大大提高程序开发的效率。同时也极大地减轻了 Linux 下应用程序安装的难度。接下来,就让我们来详细了解一下 make 及其描述文件 makefile。 阅读全文
程序编写完毕以后,可能或多或少会存在一些问题,为了解决这些问题,我们就需要对程序进行调试。最基本最明了的调试办法通常是使用 printf 函数在关心的代码位置打印关心的信息,但是出于代码简洁性的考虑,我们只会在必要的位置加上 printf 打印语句,这样就可能忽略很多潜在的问题,为了找出这些潜在的问题,我们需要用到调试器。 阅读全文
简单的说,编译器就是一个可执行程序,它专门用于将程序员易于编写的高级语言 (如 C 语言) 翻译为机器可以识别的低级语言。编译器将源代码编译为可执行程序的大致工作流程为如下:源代码 (source code) → 预处理 (preprocessor) → 编译器 (compiler) → 汇编 (assembler) → 目标代码 (object code) → 链接 (linker) → 可执行程序 (executables) 。Linux 下可用的编译器有 GCC、EGCS 和 PGCC,其中最常用最受欢迎的编译器便是 GCC,所以这里以 GCC 为代表来学习和使用一下 Linux 下的编译器。 阅读全文
变量是 Shell 运行环境中不可或缺的一部分,一些跟 Shell 息息相关的配置或信息都以变量的形式保存在 Shell 运行环境中,比如我们通过 Shell 在不同目录之间来回切换,当前目录的绝对路径将被保存在一个 Shell 变量当中,执行 pwd 命令获取当前路径时,调用该变量的值将被调用。类似的变量还有很多,下面就让我们一起来详细了解一下。 阅读全文
我们在编写应用程序的过程中,通常会遇到这样的情况,因为某些原因,程序被系统多次或者反复调用,导致程序耗尽系统内存或者出现不可预知的错误,最终影响到程序原本的设计需求,这显然不是我们所希望看到的结果,但是如果在程序内部加上必要的判断,不管系统是否多次调用,都能防止同一时刻多个同样的程序同时运行。 阅读全文
TCP通信的两方,其中一方正常关闭(调用close函数或程序正常退出)正处于连接状态的TCP套接字,这时双方的TCP将完成协商关闭连接的四次握手,握手结束以后,另一方的应用层将检测到TCP连接对应的套接字可读,执行read函数的时候倘若返回0,则说明对方已经主动断开了TCP连接,这边只需要调用close函数关闭对应套接字,回收相关资源即可。整个过程就是正常网络连接断开的处理过程。 阅读全文
之前有一篇文章《Netlink实现Linux内核与用户空间通信》专门介绍了Netlink相比其他内核交互方式的优点以及Netlink的调用方法,并以NETLINK_KOBJECT_UEVENT(内核事件向用户态通知)为例演示了U盘热插拔信息的捕捉,衍生出另一篇文章《Linux下自动检测USB热插拔》,今天尝试用Netlink来捕捉一下网络接口信息,实现的主要功能是实时打印发生变化的网络接口的序列号、上下线状态和接口名称。 阅读全文