Linux编程与认证全解析
在Linux系统中进行编程,我们常常会遇到各种问题,比如程序中的bug,以及需要遵循的开源许可证规则。同时,对于想要在Linux领域深入发展的人来说,相关的认证考试也是提升自身竞争力的重要途径。下面我们将详细介绍Linux编程中的调试、许可证相关知识,以及Linux专业认证考试的内容。
一、使用gdb查找程序中的bug
为了理解如何使用gdb查找程序中的bug,我们来看一个具体的例子。下面是一个名为
dbgtst.c
的程序,它包含一个典型的bug:
#include <stdio.h>
static char buf[256];
void read_input(char *s);
int main(void)
{
char *input = NULL; /* Just a pointer, no storage for string */
read_input(input);
/* Process command. */
printf("You typed: %s\n", input);
/* ... */
return 0;
}
void read_input(char *s)
{
printf("Command: ");
gets(s);
}
这个程序的
main
函数调用
read_input
函数从用户那里获取一行输入。
read_input
函数期望一个字符数组来返回用户输入的内容。然而,在这个例子中,
main
函数使用一个未初始化的指针调用
read_input
,这就是这个简单程序中的bug。
我们可以使用
gcc
的
-g
选项来编译这个程序:
gcc -g -o dbgtst dbgtst.c
忽略关于
gets
函数危险的警告信息,我们利用这个函数的缺点来展示如何使用gdb追踪错误。
运行这个程序并在
Command:
提示下输入
test
,会发现程序显示
Segmentation fault
后崩溃:
./dbgtst
Command: test
Segmentation fault
对于这样的小程序,我们可以通过检查源代码找到问题所在。但在实际应用中,我们可能无法立即知道错误的原因,这时就需要使用gdb来查找问题的根源。
使用gdb定位bug的步骤如下:
1.
在gdb中加载程序
:例如,输入
gdb dbgtst
将名为
dbgtst
的程序加载到gdb中。
2.
在gdb中开始执行程序
:输入
run
命令,当程序提示输入时,输入一些文本。程序会像之前一样崩溃,以
dbgtst
程序为例:
(gdb) run
Starting program: /home/rich/dbgtst
Command: test
Program received signal SIGSEGV, Segmentation fault.
_IO_gets (buf=0x0) at iogets.c:53
53 iogets.c: No such file or directory.
(gdb)
-
使用
where命令确定程序崩溃的位置 :对于dbgtst程序,该命令会产生如下输出:
(gdb) where
#0 _IO_gets (buf=0x0) at iogets.c:53
#1 0x00005555555551da in read_input (s=0x0) at dbgtst.c:16
#2 0x0000555555555189 in main () at dbgtst.c:7
(gdb)
这个输出显示了函数调用的序列。最近的函数调用
#0
是对
gets
C库函数的调用。
gets
调用源自
read_input
函数(在
dbgtst.c
文件的第16行),而
read_input
函数又由
main
函数在
dbgtst.c
文件的第7行调用。
4.
使用
list
命令检查可疑源代码行
:在
dbgtst
程序中,我们可以从
dbgtst.c
文件的第16行开始:
(gdb) list dbgtst.c:16
11 return 0;
12 }
13 void read_input(char *s)
14 {
15 printf("Command: ");
16 gets(s);
17 }
18
(gdb)
查看这个列表后,我们可以发现问题可能出在
read_input
函数的调用方式上。然后,我们列出
dbgtst.c
文件中第7行附近的代码(
read_input
调用的起始位置):
(gdb) list dbgtst.c:7
2 static char buf[256];
3 void read_input(char *s);
4 int main(void)
5 {
6 char *input = NULL; /* Just a pointer, no storage for string */
7 read_input(input);
8 /* Process command. */
9 printf("You typed: %s\n", input);
10 /* ... */
11 return 0;
(gdb)
此时,我们可以将问题缩小到名为
input
的变量上。这个变量应该是一个数组,而不是一个
NULL
指针。
二、在gdb中修复bug
有时,我们可以直接在gdb中修复bug。对于前面的示例程序,在程序显示错误信息崩溃后,我们可以尝试进行修复。
dbgtst
程序中定义了一个额外的缓冲区
buf
:
static char buf[256];
我们可以通过将
input
变量设置为
buf
来修复未初始化指针的问题。以下是在gdb中修复问题的会话:
(gdb) file dbgtst
A program is being debugged already. Kill it? (y or n) y
Load new symbol table from "/home/rich/sw/dbgtst"? (y or n) y
Reading symbols from /home/rich/sw/dbgtst ... done.
(gdb) list
1 #include <stdio.h>
2 static char buf[256];
3 void read_input(char *s);
4 int main(void)
5 {
6 char *input = NULL; /* Just a pointer, no storage for string */
7 read_input(input);
8 /* Process command. */
9 printf("You typed: %s\n", input);
10 /* ... */
(gdb) break 7
Breakpoint 2 at 0x804842b: file dbgtst.c, line 7.
(gdb) run
Starting program: /home/rich/sw/dbgtst
Breakpoint 1, main () at dbgtst.c:7
7 read_input(input);
(gdb) set var input=buf
(gdb) cont
Continuing.
Command: test
You typed: test
Process exited normally.
(gdb)q
从上面的列表可以看出,如果程序在调用
read_input
函数之前停止,并将
input
变量设置为
buf
(一个有效的字符数组),程序的其余部分将正常运行。
在gdb中找到有效的修复方法后,我们可以对源文件进行必要的更改,使修复永久生效。
三、理解GNU许可证的影响
Linux的丰富资源并非免费可得,为了保护开发者和用户,Linux根据GNU GPL(通用公共许可证)进行分发,该许可证规定了源代码的分发方式。
GPL并不意味着不能为Linux编写商业软件并以二进制形式分发(无论是免费还是收费)。我们可以遵循所有规则,仍然以二进制形式销售Linux应用程序。
在为Linux编写应用程序时,可能会涉及多种许可证(如MIT和BSD),但我们需要特别关注两种许可证:
-
GNU通用公共许可证(GPL)
:它管理许多Linux程序,包括Linux内核和GCC。
-
GNU库通用公共许可证(LGPL)
:它涵盖许多Linux库。
1. GNU通用公共许可证(GPL)
GPL的文本位于Linux系统中名为
COPYING
的文件中。可以使用以下命令在Linux系统中查找该文件的副本:
find /usr -name "COPYING" -print
找到文件后,切换到该目录并输入
more COPYING
来阅读GPL。我们可以在
www.gnu.org/licenses/gpl-3.0.html
找到其他许可证示例。
GPL与软件是否收费或免费分发无关,其核心是确保所有用户都能免费使用软件。GPL要求软件以源代码形式分发,并规定任何用户都可以复制和将源代码形式的软件分发给其他人。此外,每个人都应被告知该软件没有任何保证。
GPL涵盖的软件不属于公共领域,始终受版权保护,GPL明确规定了软件复制和分发的限制。从用户的角度来看,这些限制实际上是好处,因为用户可以保证访问源代码。
如果我们的应用程序使用了GPL涵盖的任何软件的部分内容,我们的应用程序将被视为派生作品,这意味着我们的应用程序也受GPL的约束,并且必须分发应用程序的源代码。
虽然GPL涵盖Linux内核,但通过系统调用使用内核服务的应用程序不受GPL的约束,这些应用程序被视为对内核的正常使用。
如果计划以二进制形式分发应用程序(大多数商业软件都是这样分发的),必须确保应用程序不使用GPL涵盖的任何软件的部分内容。当应用程序调用库中的函数时,可能会最终使用其他软件的部分内容。然而,大多数库受另一种GNU许可证的约束,将在下一节介绍。
我们只需注意GPL涵盖的少数库和实用程序。GNU dbm(gdbm)数据库库是GPL涵盖的著名库之一,GNU bison解析器生成工具是另一个受GPL涵盖的实用程序。如果允许bison生成代码,该代码也受GPL的约束。
对于GNU dbm和GNU bison,有不受GPL约束的替代方案。对于数据库库,可以使用Berkeley数据库库
db
代替
gdbm
;对于解析器生成器,可以使用
yacc
代替
bison
。
2. GNU库通用公共许可证(LGPL)
LGPL的文本位于名为
COPYING.LIB
的文件中。如果安装了内核源代码,
COPYING.LIB
文件的副本将位于其中一个源代码目录中。可以在终端窗口中使用以下命令在Linux系统中查找
COPYING.LIB
文件的副本:
find /usr -name "COPYING*" -print
这个命令会列出系统中所有
COPYING
和
COPYING.LIB
文件的出现位置。
COPYING
文件包含GPL,而
COPYING.LIB
文件包含LGPL。
LGPL旨在允许在应用程序中使用库,即使不分发应用程序的源代码。然而,LGPL规定用户必须能够访问我们使用的库的源代码,并且用户可以使用这些库的修改版本。
LGPL涵盖大多数Linux库,包括C库(
libc.a
)。因此,当使用GCC编译器在Linux上构建应用程序时,应用程序会与LGPL涵盖的一个或多个库的代码进行链接。如果只想以二进制形式分发应用程序,需要注意LGPL。
满足LGPL要求的一种方法是提供应用程序的目标代码和一个
makefile
,该
makefile
可以将我们的目标文件与LGPL涵盖的任何更新的Linux库重新链接。
更好的满足LGPL的方法是使用动态链接,在这种情况下,应用程序和库是独立的实体,尽管应用程序在运行时调用库中的函数。使用动态链接,用户可以立即从库的任何更新中受益,而无需重新链接应用程序。
我们可以在
www.gnu.org/licenses/quick-guide-gplv3.html
找到最新版本的许可证GPLv3及其快速指南。
四、Linux专业认证考试概述
就像在教育机构可以获得不同层次的学位(副学士、学士、硕士和博士学位)一样,我们可以获得多个层次的Linux认证。Linux专业协会(LPI;
www.lpi.org
)是一个致力于Linux认证的非营利组织,它提供不同难度级别的认证,帮助雇主评估潜在Linux管理员的能力水平。
LPI提供三种不同类别的常见开源工具认证:
-
Linux Essentials
:展示安装和运行Linux系统的基础知识,面向学习Linux基础知识的学生。
-
Linux Professionals
:一系列考试,旨在测试专业Linux管理员不断提高的能力。
-
Open Technology
:两门考试,针对其他开源主题,如DevOps和BSD管理员。
1. Linux Essentials考试概述
Linux Essentials成就证书是由Linux专业协会(LPI)为吸引学术领域而创建的。参加基于学期的Linux课程的学生可能无法涵盖获得Linux Professionals认证所需的所有主题,但LPI仍然希望认可和认证他们的知识。这个项目是通过国际合作创建的,以课堂为重点。目前的版本是1.6,考试代码是010 - 160。
Linux Essentials是一个成就证书,旨在成为比Linux Professionals认证(LPIC)低得多的(子集)认证。虽然建议参加Linux Essentials考试,但它不是任何LPIC专业认证或其他认证的必需条件。
该考试有五个领域,称为主题,如下表所示:
| 主题 | 权重 |
| — | — |
| Linux社区与开源职业 | 7 |
| 在Linux系统中导航 | 9 |
| 命令行的力量 | 9 |
| Linux操作系统 | 8 |
| 安全与文件权限 | 7 |
权重可能会随时间进行调整。下面我们将详细介绍每个主题。
2. 参与Linux社区并在开源领域找到职业
这个主题的子主题、权重、描述和关键知识领域如下表所示:
| 子主题 | 权重 | 描述 | 关键领域 |
| — | — | — | — |
| Linux发展与流行操作系统 | 2 | 了解Linux开发和主要发行版 | 开源哲学、发行版和嵌入式系统(需了解的发行版包括Android、Debian、Ubuntu、CentOS、openSUSE和Red Hat) |
| 主要开源应用程序 | 2 | 了解主要应用程序及其用途和开发 | 桌面应用程序、服务器应用程序、开发语言以及包管理工具和存储库(主题包括OpenOffice.org、LibreOffice、Thunderbird、Firefox、GIMP、Apache HTTPD、NGINX、MySQL、NFS、Samba、C、Java、Perl、shell、Python、dpkg、apt - get、rpm和yum) |
| 理解开源软件和许可 | 1 | 开放社区和为商业许可开源软件 | 许可、自由软件基金会(FSF)和开源倡议组织(OSI)(主题包括GPL、BSD、知识共享、自由软件、FOSS、FLOSS和开源商业模式) |
| ICT技能和在Linux中工作 | 2 | 基本信息和通信技术(ICT)技能以及在Linux中工作 | 桌面技能、进入命令行、Linux的行业用途以及云计算和虚拟化(主题包括使用浏览器、隐私问题、配置选项、搜索网络和保存内容) |
在学习这个领域时,需要了解以下十大要点:
- Linux是迄今为止开发(并且仍在开发中)的最著名的开源软件示例。
- shell是位于用户和操作系统之间的命令解释器。虽然有许多可用的shell,但目前最常见的是bash shell。
- 有大量的应用程序和工具可用于各种Linux发行版,其中许多工具也是开源的。
- Apache软件基金会根据Apache许可证免费和开源软件(FOSS)分发开源软件。
- 自由软件基金会(FSF)支持自由(开源)软件运动,并根据GNU通用公共许可证支持copyleft。copyleft使得在对软件进行修改的同时,能够在产生的派生作品中保留相同的权利。
- 开源倡议组织(OSI)也支持开源软件运动,GNOME基金会、Ubuntu基金会和许多其他组织也是如此。
- OpenOffice.org曾经是一个流行的开源办公生产力软件套件,LibreOffice是OpenOffice的一个分支,在流行程度上已经超过了它。
- Samba使Linux系统能够与基于Windows的系统共享文件。
- Thunderbird是由Mozilla基金会创建的流行邮件和新闻客户端。
- 有许多适用于Linux的网页浏览器,其中最流行的之一是Mozilla Firefox。
3. 在Linux系统中导航
这个主题的子主题、权重、描述和关键知识领域如下表所示:
| 子主题 | 权重 | 描述 | 关键领域 |
| — | — | — | — |
| 命令行基础 | 3 | 使用Linux命令行 | 基本shell、命令行语法、变量、通配符和引号(主题包括bash、echo、history、PATH环境变量、export和type) |
| 使用命令行获取帮助 | 2 | 运行帮助命令并导航各种帮助系统,如man和info | 主题包括:man文件、info命令、
/usr/share/doc
和locate |
| 使用目录和列出文件 | 2 | 导航主目录和系统目录,并列出不同位置的文件 | 文件、目录、隐藏文件和目录、主目录以及绝对和相对路径(主题包括ls的常见选项、递归列表、cd、
.
和
..
、主目录和
~
) |
| 创建、移动和删除文件 | 2 | 在主目录下创建、移动和删除文件 | 文件和目录、大小写敏感性以及简单的通配符和引号(主题包括mv、cp、rm、touch、mkdir和rmdir) |
在学习这个领域时,需要了解以下十大要点:
- 正则表达式(通常称为通配符)可用于Linux中的shell来匹配通配符字符。在可能的通配符中,星号(
*
)匹配任意数量的字符,问号(
?
)只匹配一个字符。
- Linux是一个区分大小写的操作系统。
- 文件可以通过在名称前加一个句点(
.
)来隐藏。然而,在路径名中,一个句点(
.
)指定当前目录,两个句点(
..
)表示父目录。
- 绝对路径给出资源的完整路径,而相对路径给出从当前工作位置的方向。绝对路径的一个例子是
/tmp/eadulaney/file
,相对链接的一个例子是
../file
。
- 文件可以使用
cp
复制或使用
mv
移动,文件可以使用
rm
删除,目录(使用
mkdir
创建)可以使用
rmdir
删除。递归删除可以使用
rm -r
完成。
- 要更改目录,使用
cd
命令。当不带参数使用此命令时,它会将我们移动到主目录。要查看当前工作目录,使用
pwd
(当前工作目录)命令。
-
ls
命令有大量选项可用于列出文件,
-a
选项列出所有文件(包括隐藏文件)。
- 可以通过手册页(使用
man
命令访问)和
info
(显示存储在
/user/info
以下的帮助文件)获得帮助。
-
whatis
命令显示某个条目可用的手册页,
whereis
显示文件和所有相关文件的位置(包括任何手册页)。
- 许多标准实用程序允许我们在可执行文件的名称后面输入
--help
来仅获取语法方面的帮助。
五、Linux Professionals 考试概述
Linux Professionals 是一系列旨在测试专业 Linux 管理员不断提高的能力的考试。虽然前面提到的 Linux Essentials 不是其必需条件,但对于基础薄弱的考生来说,先通过 Linux Essentials 考试可以更好地为 Linux Professionals 考试做准备。
这一系列考试难度逐步递增,涵盖了 Linux 系统管理、网络配置、安全策略制定等多个方面的专业知识和技能。通过这些考试,能够证明考生在不同层次上具备专业的 Linux 管理能力,满足企业对不同水平 Linux 管理员的需求。
六、Open Technology 考试概述
Open Technology 包含两门考试,主要针对其他开源主题,如 DevOps 和 BSD 管理员。
DevOps 是一种将开发(Development)和运维(Operations)相结合的理念和实践,强调通过自动化工具和流程,实现软件的快速开发、部署和运维。在 Open Technology 考试中,关于 DevOps 的部分可能会涉及到持续集成(CI)、持续部署(CD)、容器化技术(如 Docker)、编排工具(如 Kubernetes)等方面的知识。
BSD 是一种类 Unix 操作系统,具有高度的稳定性和安全性,在服务器领域有广泛的应用。考试中关于 BSD 管理员的部分会考察考生对 BSD 系统的安装、配置、管理和维护等方面的能力。
七、其他 Linux 认证
除了 LPI 提供的认证之外,还有其他一些 Linux 认证可供选择,这些认证可以分为厂商中立认证和厂商特定认证。
1. 厂商中立认证
厂商中立认证不依赖于特定的 Linux 发行版或厂商,具有更广泛的适用性和认可度。这类认证通常关注 Linux 系统的通用知识和技能,能够证明考生在多个 Linux 发行版上的操作和管理能力。
例如,CompTIA Linux+ 认证就是一种厂商中立认证。该认证考试涵盖了系统管理、安全、脚本编写、容器化和自动化、故障排除等多个领域的知识和技能。以下是 CompTIA Linux+ 认证考试的主要内容:
| 领域 | 内容 |
| — | — |
| 系统管理 | 包括文件系统管理、用户和组管理、进程管理、服务管理等方面的知识和技能。例如,如何创建和管理用户账户,如何启动、停止和重启系统服务等。 |
| 安全 | 涉及网络安全、文件权限设置、加密技术、防火墙配置等内容。比如,如何使用 iptables 或 firewalld 配置防火墙规则,如何对敏感文件进行加密保护。 |
| 脚本编写、容器化和自动化 | 要求考生掌握脚本语言(如 Bash)的编写,了解容器化技术(如 Docker)和自动化工具(如 Ansible)的使用。例如,编写脚本实现自动化备份任务,使用 Docker 创建和管理容器。 |
| 故障排除 | 考察考生在面对系统故障时的诊断和解决能力,包括硬件故障、软件故障、网络故障等。例如,如何通过日志文件分析系统故障的原因,如何使用调试工具定位软件问题。 |
2. 厂商特定认证
厂商特定认证是由特定的 Linux 发行版厂商提供的,主要针对该厂商的产品和技术。这类认证能够证明考生在特定厂商的 Linux 发行版上具有深入的专业知识和技能。
例如,Red Hat 提供的 Red Hat Certified System Administrator (RHCSA) 和 Red Hat Certified Engineer (RHCE) 认证。这两个认证主要针对 Red Hat Enterprise Linux (RHEL) 系统,考试内容包括系统安装、配置、管理、网络服务搭建、安全策略制定等方面。通过这些认证,考生能够证明自己在 RHEL 系统上的专业能力,对于想要在使用 RHEL 系统的企业中工作的考生来说,具有很高的价值。
八、总结
在 Linux 编程和认证的领域中,我们首先学习了如何使用 gdb 来查找和修复程序中的 bug。通过具体的示例,我们了解了使用 gdb 定位和解决问题的详细步骤,这对于提高程序的稳定性和可靠性非常重要。
同时,我们也深入理解了 GNU 许可证的影响,包括 GPL 和 LGPL 许可证的特点和要求。在开发 Linux 应用程序时,必须遵守这些许可证的规定,以确保合法合规地使用和分发软件。
对于 Linux 认证,LPI 提供的 Linux Essentials、Linux Professionals 和 Open Technology 认证,以及其他厂商中立和厂商特定认证,为不同层次和需求的考生提供了多样化的选择。通过获得这些认证,考生可以提升自己在 Linux 领域的专业能力和竞争力,为自己的职业发展打下坚实的基础。
无论是想要成为一名专业的 Linux 程序员,还是希望在 Linux 系统管理和运维方面有所建树,掌握编程技巧和获得相关认证都是必不可少的步骤。希望大家在学习和实践的过程中,不断积累经验,提升自己的能力,在 Linux 领域取得更好的成绩。
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始学习 Linux]):::startend --> B{选择学习方向}:::decision
B -->|编程| C(学习 Linux 编程):::process
B -->|认证| D(选择认证类型):::process
C --> E(学习使用 gdb 调试):::process
C --> F(了解 GNU 许可证):::process
D --> G{厂商中立认证}:::decision
D --> H{厂商特定认证}:::decision
G --> I(CompTIA Linux+):::process
H --> J(Red Hat 认证):::process
E --> K(掌握定位和修复 bug 技巧):::process
F --> L(遵守许可证规定开发应用):::process
I --> M(通过考试提升竞争力):::process
J --> N(证明特定厂商系统能力):::process
K --> O([成为专业程序员]):::startend
L --> O
M --> P([获得广泛认可]):::startend
N --> P
以上流程图展示了学习 Linux 的不同路径和方向,从开始学习 Linux 到最终成为专业人员或获得认可的过程。无论是选择编程还是认证,都有相应的学习和发展步骤,最终都能为个人在 Linux 领域的职业发展带来积极的影响。
超级会员免费看
2338

被折叠的 条评论
为什么被折叠?



