@myecho
2016-05-19T10:45:48.000000Z
字数 1919
阅读 685
UNIX/Linux系统编程
在unix发展到第7版时延伸出了BSD和System V系列的操作系统。
其中BSD由伯克利大学相关的研究团队研发,而System V由AT&T中USG团队进行开发。
而Linux的产生是在GNU GPL的背景下产生的,是一种类Unix操作系统内核。
POSIX标准是指可移植操作系统。https://zh.wikipedia.org/zh-cn/POSIX
UNIX环境变量编程麻烦体现在于版本很多(如freebsd、mac-osx、linux等),并且不是所有版本实现都实现了POSIX标准。
UNIX环境变量编程实现了所有的版本的中的系统调用的API的介绍,大而全。
GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),一套编程语言编译器。
GNU C库(GNU C Library,又称为glibc)是一种按照LGPL许可协议发布的,公开源代码的,免费的,方便从网络下载的C的编译程序。glibc是linux下的c语言的函数库,osx下并不是如此实现的。http://blog.csdn.net/delphiwcdj/article/details/25541397
shell也有很多种,如sh\csh\ksh\bash等
/etc/passwd下存放每个用户的映射(映射为组ID\主目录\登录shell的组合)
/etc/group下存放每个组的映射(映射为组名、组ID、用户列表的组合)
超级用户 ID为0,登录名为root
进程分类:守护进程(syslogd\httpd等)、init进程、特权进程(由超级用户运行)等
进程终止通过(_exit()系统调用或者向进程传送信号等)
/proc下存放文件系统。
进程空间中环境变量也是存放在其中的。
内存映射mmap主要通过文件映射相同区域或者父进程与子进程的形式进行映射的。
对象库是指函数代码编译后置于文件之中。包含静态库和共享库,其中静态库是指,编译时由链接器处理、将对象库的副本拷贝到进程空间中去。而动态库则是由动态链接器负责,不使用副本拷贝,而是在某个位置插入指明动态库位置信息的语句。
处理来自系统调用的错误:
1. 大部分会通过返回-1来标识错误,并同时设置errno来标识错误类型(定义在errno.h中,均为正数),但是当程序成功时,并不会将errno重置为0,因此这种情况下不能够只检测errno来判断系统调用是否发生了错误
2. 少部分系统调用即使调用成功也会返回-1,如getpriority()。要判断这种错误发生,需要在调用前设置errno为0,并在调用后检测errno的值
有strerror()以及perror()两个函数来辅助打印错误
处理来自库函数的错误:
1. 某些与系统调用处理方式类似,如remove函数
2. 某些库函数出错后会返回-1之外的其他值,但仍然会设置errno来表明具体的出错情况,如fopen失败后会返回NULL指针
3. 还有些函数根本不设置errno,需要查看系统手册进行使用
编写可移植性应用程序时,有时会希望各个头文件只显露遵循特定标准的定义,要达到这一目的,在编译程序时需要定义下列一个或多个特性测试宏。
不同实现的系统变量如进程ID、用户ID、以及文件偏移量等,表示时均采用标准C语言类型,并利用typedef描述了相关的系统数据类型,如typedef int pid_t,方便程序在不同程序之间的移植。其中的大部分声明都位于中,少部分则定义于其他的头文件中。
单内核指的是内核运行于一个单独的地址空间上,内核之间的通信是微不足道的。Linux是单内核的,但是其借鉴了一些微内核的实现,如模块化的设计、抢占式内核、支持内核线程、以及动态装载内核模块的能力。
微内核并不作为一个单独的大过程来实现。其功能被划分成多个独立的过程,每个过程叫做一个服务器。服务器的独立有效的避免了一个服务器的失效祸及另外一个。只有强烈请求特权服务的服务器才运行在特权模式下,其他服务器都运行在用户空间。通过消息传递处理微内核通信。Windows NT(win7等)内核和Mach(Mac Osx)内核都是微内核的设计,但是最新版的内核中不让任何微内核服务器运行在用户空间,这违背了微内核设计的初衷。