
本书在第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中多进程编程的步骤。
本章主要介绍进程的控制开发,首先给出了进程的基本概念,Linux下进程的基本结构、模式与类型以及Linux进程管理。进程是Linux中程序运行和资源管理的最小单位,对进程的处理也是嵌入式Linux应用编程的基础,因此,读者一定要牢牢掌握。
信号是UNIX中所使用的进程通信的一种最古老的方法。它是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一进程,而无需知道该进程的状态。
在多任务操作系统环境下,多个进程会同时运行,并且一些进程之间可能存在一定的关联。多个进程可能为了完成同一个任务会相互协作,这样形成进程之间的同步关系。而且在不同进程之间,为了争夺有限的系统资源(硬件或软件资源)会进入竞争状态,这就是进程之间的互斥关系。
可以说,共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据的复制。为了在多个进程间交换信息,内核专门留出了一块内存区。这段内存区可以由需要访问的进程将其映射到自己的私有地址空间。因此,进程就可以直接读写这一内存区而不需要进行数据的复制,从而大大提高了效率。
顾名思义,消息队列就是一些消息的列表。用户可以从消息队列中添加消息和读取消息等。从这点上看,消息队列具有一定的FIFO特性,但是它可以实现消息的随机查询,比FIFO具有更大的优势。同时,这些消息又是存在于内核中的,由“队列ID”来标识。
通过编写有名管道多路通信实验,读者可进一步掌握管道的创建、读写等操作,同时,也复习使用select()函数实现管道的通信。
本章详细讲解了Linux中进程间通信的几种机制,包括管道通信、信号通信、消息队列、信号量以及共享内存机制等,并且讲解了进程间通信的演进。
前面已经提到,进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程在进行切换等操作时都需要有比较复杂的上下文切换等动作。为了进一步减少处理机的空转时间,支持多处理器以及减少上下文切换开销,进程在演化中出现了另一个概念——线程。
“生产者消费者”问题是一个著名的同时性编程问题的集合。通过学习经典的“生产者消费者”问题的实验,读者可以进一步熟悉Linux中的多线程编程,并且掌握用信号量处理线程间的同步和互斥问题。
本章首先介绍了线程的基本概念、线程的分类和特性以及线程的发展历程。
Qt/Embedded以原始Qt为基础,并做了许多出色的调整以适用于嵌入式环境。Qt/Embedded通过Qt API与Linux I/O设施直接交互,成为嵌入式Linux端口。同Qt/X11相比,Qt/Embedded很省内存,因为它不需要一个X服务器或是Xlib库,它在底层抛弃了X lib,采用framebuffer)作为底层图形接口
目前的桌面机操作系统大多有着美观、操作方便、功能齐全的GUI(图形用户界面),例如KDE或者GNOME。GUI(图形用户界面)是指计算机与其使用者之间的对话接口,可以说,GUI是当今计算机技术的重大成就。它的存在为使用者提供了友好便利的界面,并大大地方便了非专业用户的使用,使得人们从繁琐的命令中解脱出来,可以通过窗口、菜单方便地进行操作。
通过编写一个跳动的“Hello,World”字符串,进一步熟悉嵌入式Qt的开发过程。
这里要讲的线程相关操作都是用户空间中的线程的操作。在Linux中,一般pthread线程库是一套通用的线程库,是由POSIX提出的,因此具有很好的可移植性。