Unix环境高级编程第二章摘记

概述
历史上由于版权等原因,上个世纪80年代出现了Unix的多个分支,后来为了有一个统一的标准,美国政府及其他很多团体做了大量标准化工作。

Unix标准化

ISO C
1990 年,国际标准化组织ISO和国际电工委员会IEC将ANSI C 1989作为了国际标准。现在C标准由 WG14这个小组来维护和开发。 标准化的内容不止C的语法和语义,还包括C标准库。标准的最近一次更新是在1999 年,改进了对数字处理应用的支持,引入了 restrict关键字,表示该指针引用的对象在函数内只能通过该指针来访问,可参考《用 C99 进行开放源代码的开发》 http://www.ibm.com/developerworks/cn/linux/l-c99/index.html

IEEE POSIX
Portable Operating System Interface for Unix ,是由IEEE发展起来的标准簇(a family of standards)。最初该标准只是局限于Unix系统和类Unix(Unix-like)系统,后来扩展到各式操作系统。凡是符合POSIX的OS必 须提供标准定义的服务。
标准在不断变化,由最初的1003.1在1990年发展成为POSIX.1;1993年发布1003.1的修正版, 1996年,标准更新成ISO/IEC 99451:1996,它包含了多线程编程接口;99年又加进了更多的实时接口(real-time interfaces);一年后,标准内容又有所增加。
POSIX.1中包含了ISO C的标准库函数。它的接口可分为必需的和可选的。
POSIX.1标准由Austin Group来维护。

单个UNIX规范( the Single UNIX Specification)
单个UNIX规范(SUS)是POSIX.1的超集,指定了一些额外的接口。系统接口的完全集合称作X/OPEN系统接口(XSI)。
Open Group拥有UNIX的商标,一个Unix系统必须实现单个UNIX规范中定义的接口。

联邦信息处理标准(Federal Information Processing Standard, FIPS

UNIX系统实现
Unix在Bell实验室外广泛发布起始于在PDP-11上的分时系统Unix Version6和Version7。Unix的三大分支:
a)Unix系统的商业版本(AT&T的System III和System V)
b)加州大学伯克利分校的4.xBSD实现
c)Unix系统的研究版本,由 Bell实验室的计算科学研究中心开发

UNIX System V Release 4(SVR4)
SVR4是AT&T的UNIX系统实验室的产品。

4.4BSD
起初的BSD系统利用了一些AT&T的源代码,由此引起了一些版权的问题,因此花了很长的时间用非AT&T的源代码代替了原来的实现。4.4BSD-Lite, release 2是加州大学伯克利分校CSRG发布的最终版本。

FreeBSD
基于4.4BSD-Lite的操作系统。其他基于BSD的免费操作系统还有NetBSD(强调不同硬件平台间的可移植性)和OpenBSD(类似于FreeBSD,但更强调安全性)。

Linux
在GNU GPL下自由可用的OS,内核由Linus Torvalds在1991年首先开发。

Mac OS X
Mac OS X的核心操作系统叫做Darwin,Darwin也是一个开源工程。Mac OS X基于Mach内核和FreeBSD开发的。

Solaris
Sun微系统公司开发的Unix系统。

其它的UNIX系统
AIX,IBM公司
HP-UX,HP公司
IRIX,Silicon Graphics
UnixWare,SCO

标准和实现间的关系
不同的实现对标准的兼容程度是不同的。

限制limits
各种实现定义了许多幻数(magic number)和常量,它们的存在给程序的移植带来了不便。标准化的努力使有方法可以确定这些幻数和 实现定义的限制(implementation-defined limits)(即在某个实现中定义的符号),从而极大的增强了软件的移植能力。
需要两种类型的限制:
a) 编译时限制Compile-time limits
b) 运行时限制Runtime limits
那些编译时限制可以直接定义在程序包含的头文件中,但运行时的限制需要进程调用一个函数来获得它们的值。
某些限制在一个给定的实现上是固定的(可以在头文件中静态地定义),而在其他实现上是可变的(需要运行时函数调用,三个conf函数: sysconf,pathconffpathconf)。

ISO C限制
由ISO C定义的限制都是编译时限制。limits.h,float.h,stdio.h中定义了各种限制,参考教程。

POSIX限制
定义了许多限制和常量,可分5类:
a)不变的最小值,参见教程图2.8
b)不变值 SSIZE_MAX
c)运行时可增加值 CHARCLASS_NAME_MAX, COLL_WEIGHTS_MAX, LINE_MAX, NGROUPS_MAX, 和 RE_DUP_MAX
d)运行时不变值,可能未定义 ARG_MAX, CHILD_MAX, HOST_NAME_MAX, LOGIN_NAME_MAX, OPEN_MAX, PAGESIZE, RE_DUP_MAX, STREAM_MAX, SYMLOOP_MAX, TTY_NAME_MAX, 和 TZNAME_MAX
e)路径名变量值,可能未定义 FILESIZEBITS, LINK_MAX, MAX_CANON, MAX_INPUT, NAME_MAX, PATH_MAX, PIPE_BUF, 和 SYMLINK_MAX

XSI限制
XSI为处理实现限制定义的常量包括:
a)不变的最小值,见教程图2.9
b)数字的限制:LONG_BIT 和 WORD_BIT
c)运行时不变值,可能未定义:ATEXIT_MAX, IOV_MAX, 和 PAGE_SIZE

sysconf, pathconf, 和 fpathconf 函数
通过头文件列出的最小值对一个实现来说是必须支持的,但要找出某个系统实际支持的限制,就需要在编译时和运行时确定。运行时限制可以通过调用下列三个函数来获得:
#include <unistd.h>
long sysconf(int name);
long pathconf(const char *pathname, int name);
long fpathconf(int filedes, int name);
三个函数返回: 如果正确,返回相关限制值, 错误则返回1
sysconf的name参数参考教程图2.10;pathconf 和 fpathconf的参数name参考图2.11

关于这三个函数的返回值:
a)如果参数名name不是一个正确的常量值,则返回1,且置errno为EINVAL;
b)一些参数可能会返回相关的可用值,也可能返回一个指示,它表示值未确定;
c)_SC_CLK_TCK做参数返回每秒的时钟嘀哒数,以用于times函数的返回值

对于pathconf的pathname参数和fpathconf的fields参数有一些限制,若不满足,结果将是未定义的。
a)_PC_MAX_CANON 和 _PC_MAX_INPUT 引用的必须是终端文件(terminate file)
b)_PC_LINK_MAX 的引用文件可以是一个文件,或者一个目录。当引用一个目录时,返回值是目录的最大链接计数,而非该目录下的文件名。
c)_PC_FILESIZEBITS 和 _PC_NAME_MAX的引用文件必须是目录。
d)_PC_PATH_MAX 的引用文件必须是目录。
e)_PC_PIPE_BUF 的引用文件必须是管道(pipe),命名管道(FIFO)或者目录
f)_PC_SYMLINK_MAX 的引用文件必须是目录。

awk工具的使用参考 http://man.lupaworld.com/content/manage/ringkee/awk.htm

未确定的运行时限制

可选项
在某个标准中的可选项会影响软件的移植,为此SUS定义了三种方法来处理:
a)编译时选项定义在<unistd.h>
b)与某个文件或目录无关联的运行时选项用sysconf函数来确定
c)与某个文件或目录相关联的运行时选项通过调用pathconf或fpathconf来确定

特征测试宏
头 文件中定义了许多的POSIX.1和XSI符号,而且绝大多数实现都在里面加入了它们自己的定义。通过定义常量_POSIX_C_SOURCE,可使我们 的程序在编译时只依赖于POSIX定义,而排出了任何实现定义限制。这样的常量_POSIX_C_SOURCE(还有_XOPEN_SOURCE)被称作 特征测试宏(feature test macros)。使用它们时,典型的定义是在编译命令中,如
cc -D_POSIX_C_SOURCE=200112 file.c
也可以在源文件的首行定义
#define _POSIX_C_SOURCE 200112
__STDC__也是一个特征测试宏,如果某个编译器符合ISO C标准,它将被自动定义。

原始系统数据类型Primitive System Data Types
头文件<sys/types.h>定义了一些与实现独立(implementation-dependent)的数据类型,用typedef定义,绝大多数以_t结尾,通常它们也在其他头文件中有所定义,它们被称作原始系统数据类型。增加了程序的可移植性。

标准间的冲突

小结
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值