GNU CC是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。gcc不仅功能强大,而且可以编译如C、C++、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且gcc是一个交叉平台编译器。
调试是所有程序员都会面临的问题。如何提高程序员的调试效率,更好、更快地定位程序中的问题从而加快程序开发的进度,是大家都很关注的问题。就如读者熟知的Windows下的一些调试工具,如Visual Studio自带的设置断点、单步跟踪等,都受到了广大用户的赞赏。
到此为止,读者已经了解了如何在Linux下使用编辑器编写代码,如何使用gcc把代码编译成可执行文件,还学习了如何使用gdb来调试程序,那么,所有的工作看似已经完成了,为什么还需要make这个工程管理器呢?
在上一小节,读者已经了解到了make项目管理器的强大功能。的确,makefile可以帮助make完成它的使命,但要承认的是,编写makefile确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此。那么,有没有一种轻松的手段生成makefile而同时又能让用户享受make的优越性呢?
通过指定指令的vi操作练习,使读者能够熟练使用vi中的常见操作,并且熟悉vi的3种模式,如果读者能够熟练掌握实验内容中所要求的内容,则表明对vi的操作已经很熟练了。
本章是Linux中进行C语言编程的基础,首先讲解了C语言编程的关键点,这里关键要了解编辑器、编译链接器、调试器及项目管理工具等概念。
串口是计算机一种常用的接口,常用的串口有RS-232-C接口。它是于1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通信的标准,它的全称是“数据终端设备(DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。
由于本章是讲解Linux编程开发的第1章,因此希望读者更加明确Linux系统调用和用户编程接口(API)的概念。在了解了这些之后,会对Linux以及Linux的应用编程有更深入的理解。
Google 正在开发新操作系统 Fuchsia,使用名叫 Zircon 的微内核。它是作为一个开源项目开发的,因此外界能跟踪它的开发进度。现在,Google 发布了一个叫“the-book”的文档页, 声明 Fuchsia 不是 Linux,而是一种模块化的,基于能力的操作系统(A modular, capability-based operating system),然后介绍了新操作系统的子系统和其它信息,包括 Zircon 内核、核心、框架、存储、显示、媒体、智能、用户界面、向后兼容等等。Fuchs
在Linux中对目录和设备的操作都等同于文件的操作,因此,大大简化了系统对不同设备的处理,提高了效率。Linux中的文件主要分为4种:普通文件、目录文件、链接文件和设备文件。
Fedora是基于RHEL,CentOS,Scientific Linux, 和Oracle Linux的社区版本。相比RHEL,Fedora打包了显著的更多的软件包。其中一个原因是,多样化的社区参与Fedora的建设;它不只是一家公司。在这个过程中,CentOS用于活动,演示和实验,因为它是对最终用户免费提供的,并具有比Fedora的一个更长的发布周期(通常每隔半年左右发布一个新版本)。
该漏洞在 CVSS 3.0 下的基本得分为 7.8,它能够让本地无权限的用户获取 root 权限,或者发动 DoS 让系统崩溃。4.10.1 以上的版本都存在这个问题,Linux 方面表示,该漏洞将影响 Linux 服务器,工作站以及虚拟机,但对大多数容器不造成影响。
本章前面几节所述的文件及I/O读写都是基于文件描述符的。这些都是基本的I/O控制,是不带缓存的。而本节所要讨论的I/O操作都是基于流缓冲的,它是符合ANSI C的标准I/O处理,这里有很多函数读者已经非常熟悉了(如printf()、scantf()函数等),因此本节中仅简要介绍最主要的函数。
通过编写文件读写及上锁的程序,进一步熟悉Linux中文件I/O相关的应用开发,并且熟练掌握open()、read()、write()、fcntl()等函数的使用。
本书在第2章中介绍“ps”的命令时提到过管道,当时指出了管道是Linux中一种很重要的通信方式,它是把一个程序的输出直接连接到另一个程序的输入,这里仍以第2章中的“ps –ef | grep ntp”为例,描述管道的通信过程,如图8.2所示
本章首先讲解了系统调用(System Call)、用户函数接口(API)和系统命令之间的联系和区别,这也是贯穿本书的一条主线,本书就是按照系统命令、用户函数接口(API)系统调用的顺序逐层深入讲解,希望读者能有一个较为深刻的认识。
进程的概念首先是在20世纪60年代初期由MIT的Multics系统和IBM的TSS/360系统引入的。在40多年的发展中,人们对进程有过各种各样的定义。现列举较为著名的几种。
在Linux中创建一个新进程的惟一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和读者以往遇到的函数有一些区别,因为它看起来执行一次却返回两个值。难道一个函数真的能返回两个值吗?希望读者能认真地学习这一部分的内容。
守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导载入时启动,在系统关闭时终止。
通过编写多进程程序,使读者熟练掌握fork()、exec()、wait()和waitpid()等函数的使用,进一步理解在Linux中多进程编程的步骤。