摘要: 每个程序都会接收到一张环境表。与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结束的C字符串的地址。全局变量environ则包含了该指针数组的地址:extern char **environ; 要在程序中使用全局变量environ时,需要用该语句作变量声明。extern指示environ在其他文件中已定义,要在本文件中使用。例如,如果该环境包含5个字符串,那么它看起来可能如图7-2所示。其中,每个字符串的结尾处都显示地有一个null字符。我们称environ为环境指针(environment pointer),指针数组为环境表,其中各指针指向的字符串为环境字符串。... 阅读全文
posted @ 2014-01-06 22:22 ITtecman 阅读(809) 评论(0) 推荐(0) 编辑
摘要: 当执行一个程序时,调用exec的进程可将命令行参数传递给该新进程。这是UNIX shell的一部分常规操作。 程序清单7-3 将所有命令行参数回送到标准输出 [root@localhost apue]# cat prog7-3.c#include "apue.h"intmain(int argc, char *argv[]){ int i; for(i=0; ... 阅读全文
posted @ 2014-01-06 22:08 ITtecman 阅读(621) 评论(0) 推荐(0) 编辑
摘要: 有8种方式使进程终止(termination),其中5种为正常终止,它们是:(1)从main返回。(2)调用exit。(3)调用_exit或_Exit。(4)最后一个线程从其启动例程返回。(5)最后一个线程调用pthread_exit。异常终止有3种方式,它们是:(6)调用abort。(7)接到一个信号并终止。(8)最后一个线程对取消请求作出响应。启动例程是这样编写的,使得从main返回后立即调用exit函数。(关于启动例程:http://learn.akae.cn/media/ch19s02.html)。如果将启动例程以C代码形式表示(实际上该例程常常用汇编语言编写),则它调用main函数的 阅读全文
posted @ 2014-01-06 21:45 ITtecman 阅读(881) 评论(0) 推荐(0) 编辑
摘要: C程序总是从main函数开始执行。main函数的原型是:int main( int argc, char *argv[] );其中,argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组。当内核执行C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址——这是由连接编辑器设置的,而连接编辑器则由C编译器(通常是cc)调用。启动例程从内核取得命令行参数和环境变量值,然后为按上述方式调用main函数做好安排。本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www 阅读全文
posted @ 2014-01-06 19:24 ITtecman 阅读(795) 评论(0) 推荐(0) 编辑
摘要: 由UNIX内核提供的基本时间服务是计算自国际标准时间公元1970年1月1日00:00:00以来经过的秒数。这种秒数是以数据类型time_t表示的。我们称它们为日历时间。日历时间包括时间和日期。UNIX在这方面与其他操作系统的区别是:(a)以国际标准时间而非本地时间计时;(b)可自动进行转换,例如变换到夏时制;(c)将时间和日期作为一个量值保存。time函数返回当前时间和日期:#include time_t time( time_t *calptr );返回值:若成功则返回时间值,若出错则返回-1时间值总是作为函数值返回。如果参数不为空,则时间值也存放在由calptr指向的单元内。在系统V派生的 阅读全文
posted @ 2014-01-06 18:21 ITtecman 阅读(694) 评论(0) 推荐(0) 编辑
摘要: POSIX.1定义了uname函数,它返回与当前主机和操作系统有关的信息。 #include int uname( struct utsname *name );返回值:若成功则返回非负值,若出错则返回-1通过该函数的参数向其传递一个utsname结构的地址,然后该函数填写此结构。POSIX.1只定义了该结构中至少需要提供的字段(它们都是字符数组),而每个数组的长度则由实现确定。某些实现在... 阅读全文
posted @ 2014-01-06 17:12 ITtecman 阅读(372) 评论(0) 推荐(0) 编辑
摘要: 大多数UNIX系统都提供下列两个数据文件:utmp文件,它记录当前登录进系统的各个用户;wtmp文件,它跟踪各个登录和注销事件。在V7中,每次写入这两个文件中的是包含下列结构的一条二进制记录: struct utmp { char ut_line[8]; /* tty line: "ttyh0", "ttyd0", "ttyp0", ... */ char ut_name... 阅读全文
posted @ 2014-01-06 16:48 ITtecman 阅读(392) 评论(0) 推荐(0) 编辑
摘要: 在日常操作中,UNIX系统还使用很多其他文件。例如,BSD网络软件有一个记录各网络服务器所提供服务的数据文件(/etc/services),有一个记录协议信息的数据文件(/etc/protocols),还有一个则是记录网络信息的数据文件(/etc/networks)。 一般情况下,对于每个数据文件至少有三个函数: (1)get函数:读下一个记录,如果需要,还可以打开该文件。这些函数通常返回指向... 阅读全文
posted @ 2014-01-06 16:37 ITtecman 阅读(439) 评论(0) 推荐(0) 编辑
摘要: 4.2BSD引入了附加组ID(supplementary group ID)的概念。我们不仅可以属于口令文件记录项中组ID所对应的组,也可属于多达16个另外的组。文件访问权限检查相应被修改为:不仅将进程的有效组ID与文件的组ID相比较,而且也将所有附加组ID与文件的组ID进行比较。 常量NGROUPS_MAX规定了附加组ID的数量,其常用值是16. 使用附加组ID的优点是不必再显式地经常更改组... 阅读全文
posted @ 2014-01-06 16:20 ITtecman 阅读(732) 评论(0) 推荐(0) 编辑
摘要: UNIX组文件(POSIX.1称其为组数据库)包含了表6-3中所示的字段。这些字段包含在中所定义的group结构中。 表6-3 /etc/group文件中的字段 字段gr_mem是一个指针数组,其中每个指针各指向一个属于该组的用户名。该数组以空指针结尾。 可以用下列... 阅读全文
posted @ 2014-01-06 15:53 ITtecman 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 加密口令是经单向加密算法处理过的用户口令副本。因为此算法是单向的,所以不能从加密口令猜测到原来的口令。 历史上使用的算法总是从64字符集中产生13个可打印字符。某些较新的系统使用MD5算法对口令加密,为每个加密口令产生31个字符。 给出一个加密口令,找不到一种算法可以将其逆转到普通文本口令(普通文本口令是在Password:提示符后键入的口令)。但是可以对口令进行猜测,将猜测的口令经单向算法变... 阅读全文
posted @ 2014-01-06 11:18 ITtecman 阅读(560) 评论(0) 推荐(0) 编辑
摘要: UNIX系统的口令文件(POSIX.1则将其称为用户数据库)包含了表6-1中所示的各字段,这些字段包含在中定义的passwd结构中。注意,POSIX.1只指定了passwd结构包含的10个字段中的5个。大多数平台至少支持其中7个字段。 表6-1 /etc/passwd文件中的字段由于历史原因,口令文件存储在/etc/passwd中,而且是一个ASCII文件。每一行包含6-1中所示的各字段,字段之间用冒号分隔。例如,在Linux上,该文件中可能有下列四行:root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x 阅读全文
posted @ 2014-01-06 10:57 ITtecman 阅读(552) 评论(0) 推荐(0) 编辑
摘要: 5.4 下面的代码在一些机器上运行正确,而在另外一些机器运行时出错,解释问题所在?#include int main( void ){ char c; while( ( c = getchar() ) != EOF ) putchar( c );}答:这是一个比较常见的错误。getc以及getchar的返回值是整型,而不是字符型。由于EOF经常定义为-1,那么如果系统使用的是有符号的字符类型,程序还可以正常工作。但如果使用的是无符号字符类型,那么返回的EOF被保存到字符c后将不再是-1,所以,程序会进入死循环。5.6 对标准I/O流如何使用fsync函数?答:... 阅读全文
posted @ 2014-01-06 09:17 ITtecman 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 标准I/O并不完善。标准I/O库的一个不足之处是效率不高,这与它需要复制的数据量有关。当使用每次一行函数fgets和fputs时,通常需要复制两次数据:一次是在内核和标准I/O缓冲之间(当调用read和write时),第二次是在标准I/O缓冲区和用户程序中的行缓冲区之间。替代版本fio:快速I/O库则避免了这一点,其方法是使读一行的函数返回指向该行的指针,而不是将该行复制到另一个缓冲区中。由于执行了这种更改,grep(1)实用程序的速度增加了两倍。替代版本sfio:这一软件包在速度上与fio相近,通常快于标准I/O库。sfio也提供了一些其他标准I/O库所没有的新特征:推广了I/O流,使其不仅 阅读全文
posted @ 2014-01-06 08:43 ITtecman 阅读(521) 评论(0) 推荐(0) 编辑
摘要: ISO C标准I/O库提供了两个函数以帮助创建临时文件。#include char *tmpnam( char *ptr );返回值:指向唯一路径名的指针FILE *tmpfile( void );返回值:若成功则返回文件指针,若出错则返回NULL若ptr是NULL,则所产生的路径名存放在一个静态区中,指向该静态区的指针作为函数值返回。下一次调用tmpnam时,会重写该静态区(这意味着,如果我们调用此函数多次,而且想保存路径名,则我们应该保存该路径名的副本,而不是指针的副本)。如若ptr不是NULL,则认为它指向长度至少是L_tmpnam个字符的数组(常量L_tmpnam定义在头文件中)。所产 阅读全文
posted @ 2014-01-06 08:24 ITtecman 阅读(655) 评论(0) 推荐(0) 编辑