手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

unix环境高级编程--第1章 UNIX基础知识

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!



ssize[CD#*2]t read(int,void *,size[CD#*2]t);

ssize[CD#*2]t write(int,void *,size[CD#*2]t);

pid[CD#*2]t getpid(void);

最后一个的意思是:getpid没有参数(void),返回值的数据类型pid[CD#*2]t。提

供了这些

函数原型后,编辑程式在编译时就能够检查我们在调用函数时是否使用了正确的参

数。在程

序14中,假如我们带一个参数调用getpid(如同在getpid(1)中相同),则我们将

从ANSI C

编辑程式得到下列形式的出错信息:

line 8:too many arguments to function "getpid"

另外,因为编辑程式知道参数的数据类型,所以假如可能,他就会将参数强制转换

成所需的

数据类型。

类属指针

从上面所示的函数原型中我们能够注意到的另一个区别是:read和write的第二个

参数现在

是void *类型。任何较早的Unix系统都使用char *这种指针类型。作这种更改的原

因是:AN

SI C使用void *作为类属指针,以代替char *。

函数原型和类属指针相组合使我们消去了很多非ANSI C编辑程式需要的显式类型强

制转换。

例如,给出了write原型后,我们能够写成:

float data〔100〕;

write (fd,data,sizeof(data));

若使用非ANSI编程程式,或没有给出函数原型,则我们需写成:

write(fd,(void *)data,sizgof(data));

我们也将void *指针特征用于malloc函数(见78节)。malloc的原型现在是:

void * malloc(size[CD#*2]t);

这使得我们能够写下面的程式段:

int * ptr;

ptr=malloc (1000 * sizeof(int));

他无需将返回的指针强制转换成int *类型。

原始系统数据类型

前面所示的getpid函数的原型定义了其返回值为pid[CD#*2]t类型。这也是POSIX中

的新规定

。Unix的早期版本规定此函数返回一整型。和此类似,read和write返回类型为SS

IZE[CD#*2

]t的值,连同需要第3个参数的类型是SIZE[CD#*2]t。

以-t结尾的这些数据类型被称为原始系统数据类型。他们通常在头文档<sys/type

sh>中定

义(头文档<unistdh>应已包括该头文档)。他们通常以C typedef说明加以定义,

typedef



明在C语言中已超过15年了(所以这并不需要ANSI C),他们的目的是阻止程式(在用

专门的数

据类型(例如int,short或long)以允许对于一种特定系统的每个实现,选择所需要

的数据类

型。在需要存储进程ID处,我们将分配类型为pid[CD#*2]t的一个变量。(注意,我

们在程式

15中,已对名为pid的变量这样做了。)在各种不同的实现中,这种数据类型的定

义可能是

不同的,但是这种差别现在只出现在一个头文档中。我们所需做的只是在另一个系

统上重新

编辑应用程式。

17〓出错处理

当Unix函数出错时,往常返回一个负值,而且整型变量errno通常配置为具备特定

信息的一

个值。例如,open函数如成功执行则返回一个非负文档描述符。如若出错则返回-

1。在open

出错时,有大约15种不同的errno值(文档下存在,许可权问题等)。某些函数使用

不是返回

负值的另一种约定。例如,返回一个指向一个对象的指针的大多数函数,在出错时

,返回一

个null指针。

文档<errorh>中定义了变量errno,连同能够赋和他的各种常数。这些常数都以

E开头,另

外,Unix手册第二部分的第一页是intro(2),他通常列出了任何这些出错常数。例

如,若er

rno等于常数EACCES,这表示产生了许可权问题(例如,我们没有打开所需要文档的

许可权)

。POSIX定义errno为:

extern int errno;

POSIX1中errno的定义较C标准中的定义更为苛刻。C标准允许errno能够是个宏

,他扩认

成可修改的整型左值(lvalue)(例如一个函数,他返回一个指向出错数的指针)。



对于errno应当知道两个规则。第一个规则是:假如没有出错,则其值不会被一个

例程消除

。因此,仅当函数的返回值指明出错时,才检验其值。第二个规则是:任一函数都

不会将er

rno值配置为0,在<errnoh>中定义的任何常数都不具值0。

C标准定义了两个函数,他们帮助打印出错信息。

#include <stringh>

char *strerror(int [WTBX]errnum[WTBZ]);

返回:指向消息字符串的指针

此函数将errnum(他通常就是errno值)映射为一个出错信息字符串,并且返回此字

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!