1.3 图形用户界面 Windows 和Unix 图形模型差异极大,这点是Unix和Windows程序开发最大的差别。UNIX 使用X Window 系统GUI,而Windows 使用GDI。虽然在概念上类似,但是X API 和GDI API 之间没有简单的对应。在Windows下面可以通过MFC等类库很方便的开发出图形用户界面的程序,而Unix下相对来说就麻烦了些,缺少哪种所见即所得的好的开发工具。Unix下的GUI程序开发,是一个比较复杂的过程,这里就不在详细介绍。如果要进行Unix下面GUI程序的开发的话,可以单独去查找相关的文档。 1.4 并发处理 并发处理包括多进程和多线程的概念,Windows和Unix的并发处理差别也比较大,但是基本上都能找到一组对应的函数来实现类似的功能。 在Windows下,创建进程和线程可以通过调用Windows的API来完成,或者通过调用MFC提供的并发处理类库来实现。在Unix下面创建进程通常使用fork函数,这跟Windows下面的多进程概念有所不同,相当于在当前位置给当前进程创建一个副本;而Windows下的创建进程大都是创建一个新的进程。Unix下的多线程操作,通过一组线程函数来完成,通常我们使用POSIX 的PTHREAD线程库来创建线程,但是在不同的Unix分支系统中,都包含又自己的本地线程库。如在Solaris下面的本地线程库,是一组以thr_开头的函数,而POSIX的线程函数一般都已pthread_开头。虽然有两种不同的线程库空我们选择,但在某一个特定的系统下,他们的实现实质都是一样的,而且基本上都能够找到对应的函数。为了程序的可移植性,建议采用POSIX的线程库。这是大多数Unix系统都支持的线程库,但是不同系统下实现的功能可能有所差别,可能只是实现了这个函数库的一个子集。 在有些Unix系统下,没有实现线程库,如SCO Unix,系统只提供多进程的开发方式。但是,如果为了实现程序代码的统一性,我们可以采用第三方提供的线程库。这里有一个叫FSU-threads的线程库供我们选择。这个线程库中实现了POSIX中定义的线程函数,而且是开源的,可以支持SunOS 4.1.x, Solaris 2.x, SCO UNIX, FreeBSD, Linux等系统。除此之外,还有ZThreads线程库等。 在Windows的线程库中,实现了互斥(Mutex)、事件(Event)、信号量(Semaphore)等同步对象,用于实现线程之间的同步。在Unix下面,线程同步主要使用互斥(mutex)和条件变量(cond),其中条件变量可以实现事件和信号量的功能。另外, POSIX还定义了一套信号量函数,跟线程函数不同,是一组以sem_开头的函数(POSIX 1003.1b semaphores)。但是这套函数就不想POSIX线程函数支持的那么广泛了,比如在AIX上就不支持POSIX的信号量函数,不过AIX系统下有另一组函数来实现信号量的功能(SystemV semaphores)。在很多Unix系统中,同时支持POSIX的信号量和SystemV的信号量,在Solaris下面还有一套自己的本地函数来实现信号量。下面分别列出Unix系统中的用于并发处理的主要的函数。 进程 fork 创建进程 POSIX线程库 Solaris本地线程库 thr_create 创建一个新线程 POSIX信号量 sem_init 初始化一个信号量 System V信号量 semctl 对信号量进行一系列的控制 Solaris的本地信号量,更接近于操作系统中我们学到的PV操作的信号灯 sema_init 初始化一个信号灯(信号量) 为了方便使用,我在开发的过程中已经把上面常用的函数都封装成了类,兼容Windows和各种常见的Unix系统,而且网上还有很多这方面的代码资源可用。如果感兴趣的话可以向我索要。 1.5 网络通信 Windows下的Socket函数大体上和Unix下的Socket函数差不多,函数名称很参数用法都类似,只有一些细微的差别,某些参数的意义不同,而且对于Socket的属性控制也不太一样。Windows下面还对Socket函数进行了封装,有一系列相关类可用使用,简化网络编程的复杂性。Unix本身没有这些类库,但是我们也已经积累了很多这方面的经验和资源。我们有一组现成的类对Windows和Unix下的Socket函数进行了封装,上层只需要简单的调用即可,不用关心底层的差别。而且,这套类库也可以同时支持多种平台,可移植性非常好。 (iwgh) |