- 作者: freejustin 2006年11月24日, 星期五 10:49 回复(1) | 引用(0) 加入博采
accept(接受socket连线) | |
相关函数
|
socket,bind,listen,connect |
表头文件
|
#include #include |
定义函数
|
int accept(int s,struct sockaddr * addr,int * addrlen); |
函数说明
|
accept()用来接受参数s的socket连线。参数s的socket必需先经bind()、listen()函数处理过,当有连线进来时accept()会返回一个新的socket处理代码,往后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用accept()来接受新的连线要求。连线成功时,参数addr所指的结构会被系统填入远程主机的地址数据,参数addrlen为scokaddr的结构长度。关于结构sockaddr的定义请参考bind()。 |
返回值
|
成功则返回新的socket处理代码,失败返回-1,错误原因存于errno中。 |
错误代码
|
EBADF 参数s 非合法socket处理代码。 EFAULT 参数addr指针指向无法存取的内存空间。 ENOTSOCK 参数s为一文件描述词,非socket。 EOPNOTSUPP 指定的socket并非SOCK_STREAM。 EPERM 防火墙拒绝此连线。 ENOBUFS 系统的缓冲内存不足。 ENOMEM 核心内存不足。 |
范例
|
参考listen()。 |
|
|
|
bind(对socket定位) |
相关函数
|
socket,accept,connect,listen |
表头文件
|
#include #include |
定义函数
|
int bind(int sockfd,struct sockaddr * my_addr,int addrlen); |
函数说明
|
bind()用来设置给参数sockfd的socket一个名称。此名称由参数my_addr指向一sockaddr结构,对于不同的socket domain定义了一个通用的数据结构 struct sockaddr { unsigned short int sa_family; char sa_data[14]; }; sa_family 为调用socket()时的domain参数,即AF_xxxx值。 sa_data 最多使用14个字符长度。 此sockaddr结构会因使用不同的socket domain而有不同结构定义,例如使用AF_INET domain,其socketaddr结构定义便为 struct socketaddr_in { unsigned short int sin_family; uint16_t sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; }; struct in_addr { uint32_t s_addr; }; sin_family 即为sa_family sin_port 为使用的port编号 sin_addr.s_addr 为IP 地址 sin_zero 未使用。 |
参数
|
addrlen为sockaddr的结构长度。 |
返回值
|
成功则返回0,失败返回-1,错误原因存于errno中。 |
错误代码
|
EBADF 参数sockfd 非合法socket处理代码。 EACCESS 权限不足 ENOTSOCK 参数sockfd为一文件描述词,非socket。 |
范例
|
参考listen() |
|
|
|
connect(建立socket连线) |
相关函数
|
socket,bind,listen |
表头文件
|
#include #include |
定义函数
|
int connect (int sockfd,struct sockaddr * serv_addr,int addrlen); |
函数说明
|
connect()用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址。结构sockaddr请参考bind()。参数addrlen为sockaddr的结构长度。 |
返回值
|
成功则返回0,失败返回-1,错误原因存于errno中。 |
错误代码
|
EBADF 参数sockfd 非合法socket处理代码 EFAULT 参数serv_addr指针指向无法存取的内存空间 ENOTSOCK 参数sockfd为一文件描述词,非socket。 EISCONN 参数sockfd的socket已是连线状态 ECONNREFUSED 连线要求被server端拒绝。 ETIMEDOUT 企图连线的操作超过限定时间仍未有响应。 ENETUNREACH 无法传送数据包至指定的主机。 EAFNOSUPPORT sockaddr结构的sa_family不正确。 EALREADY socket为不可阻断且先前的连线操作还未完成。 |
范例
|
/* 利用socket的TCP client 此程序会连线TCP server,并将键盘输入的字符串传送给server。 TCP server范例请参考listen()。 */ #include #include #include #include #include #include #include #define PORT 1234 #define SERVER_IP “127.0.0.1” main() { int s; struct sockaddr_in addr; char buffer[256]; if((s = socket(AF_INET,SOCK_STREAM,0))<0){ perror(“socket”); exit(1); } /* 填写sockaddr_in结构*/ bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port=htons(PORT); addr.sin_addr.s_addr = inet_addr(SERVER_IP); /* 尝试连线*/ if(connect(s,&addr,sizeof(addr))<0){ perror(“connect”); exit(1); } /* 接收由server端传来的信息*/ recv(s,buffer,sizeof(buffer),0); printf(“%s/n”,buffer); while(1){ bzero(buffer,sizeof(buffer)); /* 从标准输入设备取得字符串*/ read(STDIN_FILENO,buffer,sizeof(buffer)); /* 将字符串传给server端*/ if(send(s,buffer,sizeof(buffer),0)<0){ perror(“send”); exit(1); } } } |
执行
|
$ ./connect Welcome to server! hi I am client! /*键盘输入*/ /* |
|
|
|
endprotoent(结束网络协议数据的读取) |
相关函数
|
getprotoent,getprotobyname,getprotobynumber,setprotoent |
表头文件
|
#include |
定义函数
|
void endprotoent(void); |
函数说明
|
endprotoent()用来关闭由getprotoent()打开的文件。 |
返回值
|
|
范例
|
参考getprotoent() |
|
|
|
endservent(结束网络服务数据的读取) |
相关函数
|
getservent,getservbyname,getservbyport,setservent |
表头文件
|
#include |
定义函数
|
void endservent(void); |
函数说明
|
endservent()用来关闭由getservent()所打开的文件。 |
返回值
|
|
范例
|
参考getservent()。 |
|
|
|
getsockopt(取得socket状态) |
相关函数
|
setsockopt |
表头文件
|
#include #include |
定义函数
|
int getsockopt(int s,int level,int optname,void* optval,socklen_t* optlen); |
函数说明
|
getsockopt()会将参数s所指定的socket状态返回。参数optname代表欲取得何种选项状态,而参数optval则指向欲保存结果的内存地址,参数optlen则为该空间的大小。参数level、optname请参考setsockopt()。 |
返回值
|
成功则返回0,若有错误则返回-1,错误原因存于errno |
错误代码
|
EBADF 参数s 并非合法的socket处理代码 ENOTSOCK 参数s为一文件描述词,非socket ENOPROTOOPT 参数optname指定的选项不正确 EFAULT 参数optval指针指向无法存取的内存空间 |
范例
|
#include #include main() { int s,optval,optlen = sizeof(int); if((s = socket(AF_INET,SOCK_STREAM,0))<0) perror(“socket”); getsockopt(s,SOL_SOCKET,SO_TYPE,&optval,&optlen); printf(“optval = %d/n”,optval); close(s);} |
执行
|
optval = 1 /*SOCK_STREAM的定义正是此值*/ |
|
|
|
htonl(将32位主机字符顺序转换成网络字符顺序) |
相关函数
|
htons,ntohl,ntohs |
表头文件
|
#include |
定义函数
|
unsigned long int htonl(unsigned long int hostlong); |
函数说明
|
htonl()用来将参数指定的32位hostlong 转换成网络字符顺序。 |
返回值
|
返回对应的网络字符顺序。 |
范例
|
参考getservbyport()或connect()。 |
|
|
|
htons(将16位主机字符顺序转换成网络字符顺序) |
相关函数
|
htonl,ntohl,ntohs |
表头文件
|
#include |
定义函数
|
unsigned short int htons(unsigned short int hostshort); |
函数说明
|
htons()用来将参数指定的16位hostshort转换成网络字符顺序。 |
返回值
|
返回对应的网络字符顺序。 |
范例
|
参考connect()。 |
|
|
|
inet_addr(将网络地址转成二进制的数字) |
相关函数
|
inet_aton,inet_ntoa |
表头文件
|
#include #include #include |
定义函数
|
unsigned long int inet_addr(const char *cp); |
函数说明
|
inet_addr()用来将参数cp所指的网络地址字符串转换成网络所使用的二进制数字。网络地址字符串是以数字和点组成的字符串,例如:“163.13.132.68”。 |
返回值
|
成功则返回对应的网络二进制的数字,失败返回-1。 |
|
|
|
inet_aton(将网络地址转成网络二进制的数字) |
相关函数
|
inet_addr,inet_ntoa |
表头文件
|
#include #include #include |
定义函数
|
int inet_aton(const char * cp,struct in_addr *inp); |
函数说明
|
inet_aton()用来将参数cp所指的网络地址字符串转换成网络使用的二进制的数字,然后存于参数inp所指的in_addr结构中。 结构in_addr定义如下 struct in_addr { unsigned long int s_addr; }; |
返回值
|
成功则返回非0值,失败则返回0。 |
|
|
|
inet_ntoa(将网络二进制的数字转换成网络地址) |
相关函数
|
inet_addr,inet_aton |
表头文件
|
#include #include #include |
定义函数
|
char * inet_ntoa(struct in_addr in); |
函数说明
|
inet_ntoa()用来将参数in所指的网络二进制的数字转换成网络地址,然后将指向此网络地址字符串的指针返回。 |
返回值
|
成功则返回字符串指针,失败则返回NULL。 |
|
|
|
listen(等待连接) |
相关函数
|
socket,bind,accept,connect |
表头文件
|
#include |
定义函数
|
int listen(int s,int backlog); |
函数说明
|
listen()用来等待参数s 的socket连线。参数backlog指定同时能处理的最大连接要求,如果连接数目达此上限则client端将收到ECONNREFUSED的错误。Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()。通常listen()会在socket(),bind()之后调用,接着才调用accept()。 |
返回值
|
成功则返回0,失败返回-1,错误原因存于errno |
附加说明
|
listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型。如果socket为AF_INET则参数backlog 最大值可设至128。 |
错误代码
|
EBADF 参数sockfd非合法socket处理代码 EACCESS 权限不足 EOPNOTSUPP 指定的socket并未支援listen模式。 |
范例
|
#include #include #include #include #include #define PORT 1234 #define MAXSOCKFD 10 main() { int sockfd,newsockfd,is_connected[MAXSOCKFD],fd; struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr_in); fd_set readfds; char buffer[256]; char msg[ ] =”Welcome to server!”; if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){ perror(“socket”); exit(1); } bzero(&addr,sizeof(addr)); addr.sin_family =AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sockfd,&addr,sizeof(addr))<0){ perror(“connect”); exit(1); } if(listen(sockfd,3)<0){ perror(“listen”); exit(1); } for(fd=0;fd while(1){ FD_ZERO(&readfds); FD_SET(sockfd,&readfds); for(fd=0;fd if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))continue; for(fd=0;fd if(sockfd = =fd){ if((newsockfd = accept (sockfd,&addr,&addr_len))<0) perror(“accept”); write(newsockfd,msg,sizeof(msg)); is_connected[newsockfd] =1; printf(“cnnect from %s/n”,inet_ntoa(addr.sin_addr)); }else{ bzero(buffer,sizeof(buffer)); if(read(fd,buffer,sizeof(buffer))<=0){ printf(“connect closed./n”); is_connected[fd]=0; close(fd); }else printf(“%s”,buffer); } } } } |
执行
|
$ ./listen connect from 127.0.0.1 hi I am client connected closed. |
|
|
|
ntohl(将32位网络字符顺序转换成主机字符顺序) |
相关函数
|
htonl,htons,ntohs |
表头文件
|
#include |
定义函数
|
unsigned long int ntohl(unsigned long int netlong); |
函数说明
|
ntohl()用来将参数指定的32位netlong转换成主机字符顺序。 |
返回值
|
返回对应的主机字符顺序。 |
范例
|
参考getservent()。 |
|
|
|
ntohs(将16位网络字符顺序转换成主机字符顺序) |
相关函数
|
htonl,htons,ntohl |
表头文件
|
#include |
定义函数
|
unsigned short int ntohs(unsigned short int netshort); |
函数说明
|
ntohs()用来将参数指定的16位netshort转换成主机字符顺序。 |
返回值
|
返回对应的主机顺序。 |
范例
|
参考getservent()。 |
|
|
|
recv(经socket接收数据) |
相关函数
|
recvfrom,recvmsg,send,sendto,socket |
表头文件
|
#include #include |
定义函数
|
int recv(int s,void *buf,int len,unsigned int flags); |
函数说明
|
recv()用来接收远端主机经指定的socket传来的数据,并把数据存到由参数buf 指向的内存空间,参数len为可接收数据的最大长度。 |
参数
|
flags一般设0。其他数值定义如下: MSG_OOB 接收以out-of-band 送出的数据。 MSG_PEEK 返回来的数据并不会在系统内删除,如果再调用recv()会返回相同的数据内容。 MSG_WAITALL强迫接收到len大小的数据后才能返回,除非有错误或信号产生。 MSG_NOSIGNAL此操作不愿被SIGPIPE信号中断返回值成功则返回接收到的字符数,失败返回-1,错误原因存于errno中。 |
错误代码
|
EBADF 参数s非合法的socket处理代码 EFAULT 参数中有一指针指向无法存取的内存空间 ENOTSOCK 参数s为一文件描述词,非socket。 EINTR 被信号所中断 EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断 ENOBUFS 系统的缓冲内存不足。 ENOMEM 核心内存不足 EINVAL 传给系统调用的参数不正确。 |
范例
|
参考listen()。 |
|
|
|
recvfrom(经socket接收数据) |
相关函数
|
recv,recvmsg,send,sendto,socket |
表头文件
|
#include #include |
定义函数
|
int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen); |
函数说明
|
recv()用来接收远程主机经指定的socket 传来的数据,并把数据存到由参数buf 指向的内存空间,参数len 为可接收数据的最大长度。参数flags 一般设0,其他数值定义请参考recv()。参数from用来指定欲传送的网络地址,结构sockaddr 请参考bind()。参数fromlen为sockaddr的结构长度。 |
返回值
|
成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。 |
错误代码
|
EBADF 参数s非合法的socket处理代码 EFAULT 参数中有一指针指向无法存取的内存空间。 ENOTSOCK 参数s为一文件描述词,非socket。 EINTR 被信号所中断。 EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。 ENOBUFS 系统的缓冲内存不足 ENOMEM 核心内存不足 EINVAL 传给系统调用的参数不正确。 |
范例
|
/*利用socket的UDP client 此程序会连线UDP server,并将键盘输入的字符串传给server。 UDP server 范例请参考sendto()。 */ #include #include #include #include #include #include #include #define PORT 2345 #define SERVER_IP “127.0.0.1” main() { int s,len; struct sockaddr_in addr; int addr_len =sizeof(struct sockaddr_in); char buffer[256]; /* 建立socket*/ if((s = socket(AF_INET,SOCK_DGRAM,0))<0){ perror(“socket”); exit(1); } /* 填写sockaddr_in*/ bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = inet_addr(SERVER_IP); while(1){ bzero(buffer,sizeof(buffer)); /* 从标准输入设备取得字符串*/ len =read(STDIN_FILENO,buffer,sizeof(buffer)); /* 将字符串传送给server端*/ sendto(s,buffer,len,0,&addr,addr_len); /* 接收server端返回的字符串*/ len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len); printf(“receive: %s”,buffer); } } |
执行
|
(先执行udp server 再执行udp client) hello /*从键盘输入字符串*/ receive: hello /*server端返回来的字符串*/ |
|
|
|
recvmsg(经socket接收数据) |
相关函数
|
recv,recvfrom,send,sendto,sendmsg,socket |
表头文件
|
#include #include |
定义函数
|
int recvmsg(int s,struct msghdr *msg,unsigned int flags); |
函数说明
|
recvmsg()用来接收远程主机经指定的socket传来的数据。参数s为已建立好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据结构内容,参数flags一般设0,详细描述请参考send()。关于结构msghdr的定义请参考sendmsg()。 |
返回值
|
成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。 |
错误代码
|
EBADF 参数s非合法的socket处理代码。 EFAULT 参数中有一指针指向无法存取的内存空间 ENOTSOCK 参数s为一文件描述词,非socket。 EINTR 被信号所中断。 EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。 ENOBUFS 系统的缓冲内存不足 ENOMEM 核心内存不足 EINVAL 传给系统调用的参数不正确。 |
范例
|
参考recvfrom()。 |
|
|
|
send(经socket传送数据) |
相关函数
|
sendto,sendmsg,recv,recvfrom,socket |
表头文件
|
#include #include |
定义函数
|
int send(int s,const void * msg,int len,unsigned int falgs); |
函数说明
|
send()用来将数据由指定的socket 传给对方主机。参数s为已建立好连接的socket。参数msg指向欲连线的数据内容,参数len则为数据长度。参数flags一般设0,其他数值定义如下 MSG_OOB 传送的数据以out-of-band 送出。 MSG_DONTROUTE 取消路由表查询 MSG_DONTWAIT 设置为不可阻断运作 MSG_NOSIGNAL 此动作不愿被SIGPIPE 信号中断。 |
返回值
|
成功则返回实际传送出去的字符数,失败返回-1。错误原因存于errno |
错误代码
|
EBADF 参数s 非合法的socket处理代码。 EFAULT 参数中有一指针指向无法存取的内存空间 ENOTSOCK 参数s为一文件描述词,非socket。 EINTR 被信号所中断。 EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。 ENOBUFS 系统的缓冲内存不足 ENOMEM 核心内存不足 EINVAL 传给系统调用的参数不正确。 |
范例
|
参考connect() |
|
|
|
sendmsg(经socket传送数据) |
相关函数
|
send,sendto,recv,recvfrom,recvmsg,socket |
表头文件
|
#include #include |
定义函数
|
int sendmsg(int s,const strcut msghdr *msg,unsigned int flags); |
函数说明
|
sendmsg()用来将数据由指定的socket传给对方主机。参数s为已建立好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg 指向欲连线的数据结构内容,参数flags一般默认为0,详细描述请参考send()。 结构msghdr定义如下 struct msghdr { void *msg_name; /*Address to send to /receive from . */ socklen_t msg_namelen; /* Length of addres data */ strcut iovec * msg_iov; /* Vector of data to send/receive into */ size_t msg_iovlen; /* Number of elements in the vector */ void * msg_control; /* Ancillary dat */ size_t msg_controllen; /* Ancillary data buffer length */ int msg_flags; /* Flags on received message */ }; |
返回值
|
成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno |
错误代码
|
EBADF 参数s 非合法的socket处理代码。 EFAULT 参数中有一指针指向无法存取的内存空间 ENOTSOCK 参数s为一文件描述词,非socket。 EINTR 被信号所中断。 EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。 ENOBUFS 系统的缓冲内存不足 ENOMEM 核心内存不足 EINVAL 传给系统调用的参数不正确。 |
范例
|
参考sendto()。 |
|
|
|
sendto(经socket传送数据) |
相关函数
|
send , sendmsg,recv , recvfrom , socket |
表头文件
|
#include < sys/types.h > #include < sys/socket.h > |
定义函数
|
int sendto ( int s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ; |
函数说明
|
sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数tolen为sockaddr的结果长度。 |
返回值
|
成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。 |
错误代码
|
EBADF 参数s非法的socket处理代码。 EFAULT 参数中有一指针指向无法存取的内存空间。 WNOTSOCK canshu s为一文件描述词,非socket。 EINTR 被信号所中断。 EAGAIN 此动作会令进程阻断,但参数s的soket为补课阻断的。 ENOBUFS 系统的缓冲内存不足。 EINVAL 传给系统调用的参数不正确。 |
范例
|
#include < sys/types.h > #include < sys/socket.h > # include #include #define PORT 2345 /*使用的port*/ main(){ int sockfd,len; struct sockaddr_in addr; char buffer[256]; /*建立socket*/ if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){ perror (“socket”); exit(1); } /*填写sockaddr_in 结构*/ bzero ( &addr, sizeof(addr) ); addr.sin_family=AF_INET; addr.sin_port=htons(PORT); addr.sin_addr=hton1(INADDR_ANY) ; if (bind(sockfd, &addr, sizeof(addr))<0){ perror(“connect”); exit(1); } while(1){ bezro(buffer,sizeof(buffer)); len = recvfrom(socket,buffer,sizeof(buffer), 0 , &addr &addr_len); /*显示client端的网络地址*/ printf(“receive from %s/n “ , inet_ntoa( addr.sin_addr)); /*将字串返回给client端*/ sendto(sockfd,buffer,len,0,&addr,addr_len);” } } |
执行
|
请参考recvfrom() |
|
|
|
setprotoent(打开网络协议的数据文件) |
相关函数
|
getprotobyname, getprotobynumber, endprotoent |
表头文件
|
#include |
定义函数
|
void setprotoent (int stayopen); |
函数说明
|
setprotoent()用来打开/etc/protocols, 如果参数stayopen值为1,则接下来的getprotobyname()或getprotobynumber()将不会自动关闭此文件。 |
|
|
|
setservent(打开主机网络服务的数据文件) |
相关函数
|
getservent, getservbyname, getservbyport, endservent |
表头文件
|
#include < netdb.h > |
定义函数
|
void setservent (int stayopen); |
函数说明
|
setservent()用来打开/etc/services,如果参数stayopen值为1,则接下来的getservbyname()或getservbyport()将补回自动关闭文件。 |
|
|
|
setsockopt(设置socket状态) |
相关函数
|
getsockopt |
表头文件
|
#include #include |
定义函数
|
int setsockopt(int s,int level,int optname,const void * optval,,socklen_toptlen); |
函数说明
|
setsockopt()用来设置参数s所指定的socket状态。参数level代表欲设置的网络层,一般设成SOL_SOCKET以存取socket层。参数optname代表欲设置的选项,有下列几种数值: SO_DEBUG 打开或关闭排错模式 SO_REUSEADDR 允许在bind()过程中本地地址可重复使用 SO_TYPE 返回socket形态。 SO_ERROR 返回socket已发生的错误原因 SO_DONTROUTE 送出的数据包不要利用路由设备来传输。 SO_BROADCAST 使用广播方式传送 SO_SNDBUF 设置送出的暂存区大小 SO_RCVBUF 设置接收的暂存区大小 SO_KEEPALIVE 定期确定连线是否已终止。 SO_OOBINLINE 当接收到OOB 数据时会马上送至标准输入设备 SO_LINGER 确保数据安全且可靠的传送出去。 |
参数
|
optval代表欲设置的值,参数optlen则为optval的长度。 |
返回值
|
成功则返回0,若有错误则返回-1,错误原因存于errno。 |
附加说明
|
EBADF 参数s并非合法的socket处理代码 ENOTSOCK 参数s为一文件描述词,非socket ENOPROTOOPT 参数optname指定的选项不正确。 EFAULT 参数optval指针指向无法存取的内存空间。 |
范例
|
参考getsockopt()。 |
|
|
|
shutdown(终止socket通信) |
相关函数
|
socket,connect |
表头文件
|
#include |
定义函数
|
int shutdown(int s,int how); |
函数说明
|
shutdown()用来终止参数s所指定的socket连线。参数s是连线中的socket处理代码,参数how有下列几种情况: how=0 终止读取操作。 how=1 终止传送操作 how=2 终止读取及传送操作 |
返回值
|
成功则返回0,失败返回-1,错误原因存于errno。 |
错误代码
|
EBADF 参数s不是有效的socket处理代码 ENOTSOCK 参数s为一文件描述词,非socket ENOTCONN 参数s指定的socket并未连线 |
|
|
|
socket(建立一个socket通信) |
相关函数
|
accept,bind,connect,listen |
表头文件
|
#include #include |
定义函数
|
int socket(int domain,int type,int protocol); |
函数说明
|
socket()用来建立一个新的socket,也就是向系统注册,通知系统建立一通信端口。参数domain 指定使用何种的地址类型,完整的定义在/usr/include/bits/socket.h 内,底下是常见的协议: PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 进程通信协议 PF_INET?AF_INET Ipv4网络协议 PF_INET6/AF_INET6 Ipv6 网络协议 PF_IPX/AF_IPX IPX-Novell协议 PF_NETLINK/AF_NETLINK 核心用户接口装置 PF_X25/AF_X25 ITU-T X.25/ISO-8208 协议 PF_AX25/AF_AX25 业余无线AX.25协议 PF_ATMPVC/AF_ATMPVC 存取原始ATM PVCs PF_APPLETALK/AF_APPLETALK appletalk(DDP)协议 PF_PACKET/AF_PACKET 初级封包接口 |
参数
|
type有下列几种数值: SOCK_STREAM 提供双向连续且可信赖的数据流,即TCP。支持 OOB 机制,在所有数据传送前必须使用connect()来建立连线状态。 SOCK_DGRAM 使用不连续不可信赖的数据包连接 SOCK_SEQPACKET 提供连续可信赖的数据包连接 SOCK_RAW 提供原始网络协议存取 SOCK_RDM 提供可信赖的数据包连接 SOCK_PACKET 提供和网络驱动程序直接通信。 protocol用来指定socket所使用的传输协议编号,通常此参考不用管它,设为0即可。 |
返回值
|
成功则返回socket处理代码,失败返回-1。 |
错误代码
|
EPROTONOSUPPORT 参数domain指定的类型不支持参数type或protocol指定的协议 ENFILE 核心内存不足,无法建立新的socket结构 EMFILE 进程文件表溢出,无法再建立新的socket EACCESS 权限不足,无法建立type或protocol指定的协议 ENOBUFS/ENOMEM 内存不足 EINVAL 参数domain/type/protocol不合法 |
范例
|
参考connect()。 |
- 作者: freejustin 2006年11月20日, 星期一 16:28 回复(0) | 引用(0) 加入博采
absread()读磁盘绝对扇区函数
原形:int absread(int drive,int num,int sectnum,void *buf)
功能:从drive指定的驱动器磁盘上,sectnum指定的逻辑扇区号开始读取(通过DOS中断0x25读取)num个(最多64K个)扇区的内容,储存于buf所指的缓冲区中。
参数:drive=0对应A盘,drive=1对应B盘。
返回值:0:成功;-1:失败。
头文件:dos.h
abswrite()写磁盘绝对扇区函数
原形:int abswrite(int drive,int nsects,int lsect,void *buffer)
drive=0(A驱动器)、1(B驱动器)、
nsects=要写的扇区数(最多64K个);
lsect=起始逻辑扇区号;
buffer=要写入数据的内存起始地址。
功能:将指定内容写入(调用DOS中断0x26)磁盘上的指定扇区,即使写入的地方是磁盘的逻辑结构、文件、FAT表和目录结构所在的扇区,也照常进行。
返回值:0:成功;-1:失败。
头文件:dos.h
atof()将字符串转换成浮点数的函数
原形:double atof(const char *s)
功能:把s所指向的字符串转换成double类型。
s格式为:符号 数字.数字 E符号 数字
返回值:字符串的转换值。
头文件:math.h、stdlib.h
atoi()将字符串转换成整型数的函数
原形:int atoi(const char *s)
功能:把s所指向的字符串转换成int类型。
s格式为:符号 数字
返回值:字符串的转换值。若出错则返回0。
头文件:stdlib.h
atol()将字符串转换成长整型数的函数
原形:long atol(const char *s)
功能:把s所指向的字符串转换成long int类型。
s格式为:符号 数字
返回值:字符串的转换值。若出错则返回0。
头文件:stdlib.h
bcd()把一个数转换成对应的BCD码的函数
原形:bcd bcd(int x)
bcd bcd(double x)
bcd bcd(double x,int decimals)
注意:BCD码的精度可达17位。参数decimals是可选的,用来指定转换后小数点后的位数。
头文件:bcd.h
bdos()
原形∶int bdos(int fnum,unsigned dx,unsigned al)
其中fnum是系统调用号;dx是传给寄存器DX的值;al是传给寄存器AL的值;
功能∶DOS系统调用(INT21H)
返回值∶AX中的值
biosdisk()调用BIOS磁盘驱动程序函数
原形:char biosdisk(int cmd,int drive,int head,int track,int sector,int nsects,void *buffer)
功能:使用中断0x13,直接调用BIOS进行磁盘操作
参数:(1)cmd:
2-数据以每扇区512字节的格式读入buffer,起始扇区由head、track和sector定,扇区数由nsects定。
3-将buffer中的数据按每扇区512字节写入磁盘。
4-对扇区进行数据校验。
6-格式化一个磁盘并对化扇区设置化标志。
8-返回当前驱动器参数在buffer的前4个字节中。
10-长读,每扇区读入512字节加上额外的4个字节。
11-长写,每扇区写入512字节加上额外的4个字节。
(2)drive:0-第一个软驱;1-第二个软驱;0x80-第一个硬驱
(3)head:磁头
(4)track:磁道
(5)sector:扇区
(6)nsects:扇区数
(7)buffer:数据缓冲区,定义为unsigned char buffer[];
返回值:0x00-操作成功
0x01-错误命令
0x03-企图写具有写保护的磁盘
0x07-驱动器参数设置错误
0x10-磁盘读/CRC/ECC错误
头文件:bios.h
注:对于硬盘主引导记录扇区head=0,track=0,sector=1
biosprint()调用BIOS打印机I/O接口的函数
原形:int biosprint(int cmd,int abyte,int port)
功能:通过BIOS中断0x17在由参数port指定的打印机上完成各种打印机功能。
port=0(LPT1)
=1(LPT2);
cmd=0(打印字符abyte)
1(初始化打印机端口)
2(读打印机状态);
abyte=0-255;
返回值:打印机状态
位0(设备超时);位3(I/O出错);位4(打印机已选择);位5(没纸);位6(打印机确认);位7(不忙)
头文件:bios.h
calloc()分配内存函数
原形:void *calloc(size_t nitems,size_t size)
功能:在堆中分配一块内存,将该内存的内容全部清0。
返回值:返回指向新分配内存的指针。空间不够则返回NULL。
头文件:stdlib.h、calloc.h
ceil()
原形∶double ceil(double num)
功能∶求不小于num的最小双精度整数
头文件∶math.h
cgets()读字符串函数
原形:char *cgets(char *str)
功能:从控制台读入一个字符串,并将该字符串(和字符串长度)存入有str所指向的地址中。
注意:在调用cgets之前,必须将要读入的字符串最大长度存入str[0]中,返回时str[1]被设置为实际读入的字符数。实际字符串内容从str[2]开始,以空字符({post.content})结尾。
返回值:指向str[2]的指针。
头文件:conio.h
chdir()改变当前目录的函数
原形:int chdir(const char *path)
功能:把由path指定的目录改为当前目录。path参数中可以指定驱动器号,如“a:/ddd”, 但只是改变该驱动器上的当前目录,对当前活动驱动器上的当前目录无影响。
返回值:0(成功);-1(失败)
头文件:dir.h
_chmod()改变文件存取权限的函数
原形:int _chmod(const char *path,int func[,int attrib])
功能:读取(func=0时)或设置(func=1时)DOS文件属性。
attrib=FA_RDONLY 只读
attrib=FA_HIDDEN 隐藏文件
attrib=FA_SYSTEM 系统文件
attrib=FA_LABLE 卷标
attrib=FA_DIREC 目录
attrib=FA_ARCH 档案
返回值:失败时返回-1。成功时返回文件的属性字节,如果 返回值&FA_RDONLY 不等于0,则文件是只读文件;......
头文件:io.h、dos.h
chmod()改变文件存取权限的函数
原形:int chmod(const char *path,int amode)
功能:根据amode的值,设置由path所指文件的存取权限。
amode的值 存取权限
S_IWRITE 允许写
S_IREAD 允许读(只读)
S_IREAD|S_IWRITE 可读可写
返回值:0(成功);-1(失败)
头文件:io.h、sys/stat.h
clock()
原形∶long clock(void)
功能∶测得从程序开始到调用处处理机所用的时间
头文件∶time.h
close()关闭文件函数
原形:int close(int handle)
功能:关闭由文件句柄所指向的文件,句柄是调用_creat、creat、creatnew、creattemp、dup、dup2、_open或open时得到的。该函数并不在文件末尾写一个Ctrl-Z字符,如果想用该字符结束文件,必须显式地给出该字符。
返回值:0(成功);-1(失败)
头文件:io.h
closegraph()关闭图形函数
原形:void far closegraph(void)
功能:释放图形系统分配的所有内存,将屏幕恢复到调用initgraph之前的模式。
头文件:graphics.h
cos()
原形∶double cos(double arg)
功能∶计算arg(弧度)的余弦值
头文件∶math.h
ctrlbrk()设置ctrl-break处理程序的函数
原形:void ctrlbrk(int(*handle)(void))
功能:修改中断向量0x23,使用新的ctrl-break中断处理函数。
用法:ctrlbrk(函数名);
先定义函数:int 函数名(void){...}
头文件:dos.h
delay()暂停函数
原形:void delay(unsigned milliseconds)
功能:暂停当前所执行的程序milliseconds毫秒。
头文件:dos.h
disable()屏蔽中断的宏
原形:void disble(void)
功能:屏蔽中断,只允许从外部设备来的不可屏蔽中断(NMI)。
头文件:dos.h
enable()开硬件中断的宏
原形:void enable(void)
功能:开放中断,允许接受任何设备产生的中断。
头文件:dos.h
exec()加载并运行其它程序的函数族
execl(),execle(),execlp(),execlpe(),
execv(),execve(),execvp(),execvpe()
原形∶ int execl(char *path,char *arg0,*arg1,...,*argn,NULL)
int execle(char *path,char *arg0,*arg1,...,*argn,NULL,char **env)
int execlp(char *path,char *arg0,*arg1,...,*argn,NULL)
int execlpe(char *path,char *arg0,*arg1,...,*argn,NULL,char **env)
int execv(char *path,char *argv[])
int execve(char *path,char *argv[],char **env)
int execvp(char *path,char *argv[])
int execvpe(char *path,char *argv[],char **env)
其中,path是调用的子程序的文件名,在exec后面的后缀具有某种功能:
p表示函数能够在由DOS环境变量PATH的目录中搜索子进程文件,如果path中未指明文件所在目录,函数将首先在当前目录中找,然后在DOS环境变量指定的目录中找。
l表示参数指针(arg0,...,argn)按单独参数传送。当预先知道要传送的参数个数时,通常用带后缀l的函数。
v表示参数指针(arg0,...,argn)按指针数组传送。当要传送的参数可变时,使用带后缀v的函数。
e表示参数env可以传送到子进程,该函数可用来修改子进程的环境。若无e后缀,子进程将继承父进程的环境。
注意:arg0+...+argn,或arg[0]+...+arg[n]的总长度必需小于128字节。当调用exec函数时,原先已经打开的文件在子进程中仍然是打开的。
功能:加载并运行其它程序,调用时必须有足够的内存空间用于加载和执行子程序,子程序将覆盖父程序。
头文件:process.h
farcalloc()从远堆中分配内存的函数
原形:void far *farcalloc(unsigned long nunits,unsigned long unitsz)
功能:从远堆中为包含nunits个元素的数组分配内存,每一区unitsz字节长。
用法:fptr=farcalloc(数目,sizeof(char));
先定义:char far *fptr;
注意:所有可用RAM能被分配;大于64K的块能被分配;用远指针存取该块。微模式不能用。
返回值:返回指向新分配块的指针,若内存不够,则返回NULL。
头文件:alloc.h
farfree()从远堆中释放一块已分配内存的函数
原形:void farfree(void far *block)
头文件:alloc.h
farmalloc()从远堆中分配内存的函数
原形:void far *farmalloc(unsigned long nbytes)
使用方式:fptr=farmalloc(字节数);
先定义char far *fptr;
功能:从远堆中分配长nbytes字节的内存。
注意:所有可用RAM能被分配;大于64K的块能被分配;用远指针存取该块。微模式不能用。
返回值:返回指向新分配内存的指针,若内存不够,则返回NULL。
头文件:alloc.h
farrealloc()调整远堆中已分配块的函数
原形:void far *farrealloc(void far *oldblock,unsigned long nbytes)
返回值:返回调整后的新内存地址。若不能重新分配,则返回NULL。
头文件:alloc.h
fclose()关闭一个流函数
原形:int fclose(FILE *stream)
使用方式:fclose(文件指针名);其中文件指针名=fopen();
功能:关闭指定的流,关闭前清除所有与stream相联的缓冲区,释放系统分配的缓冲区,但由setbuf设置的缓冲区不能自动释放。
返回值:0(成功);EOF(失败)
头文件:stdio.h
fcloseall()关闭打开的流的函数
原形:int fcloseall(void)
功能:关闭所有打开的流,由stdin、stdout、stdprn、stderr和stdaux设置的流除外。
返回值:关闭流的总数。如果发现错误则返回EOF。
头文件:stdio.h
feof()检查文件是否结束的函数
原形∶int feof(FILE *fp)
返回值∶文件结束返回非0值,否则返回0。
头文件∶stdio.h
fgets()从流中读取一字符串的函数
原形:char *fgets(char s[],int n,FILE *stream)
使用格式:fgets(字符串指针,字符个数,文件指针)
功能:从输入流stream中读入字符存到s串中。当读了n-1个字符或遇到换行符时,函数停止读过程。fgets在s串尾保留换行字符。读入的最后一个字符后面加一个空字符。
返回值:成功时返回字符串参数s,出错或遇到文件结束时,返回NULL。
头文件:stdio.h
findfirst()函数和findnext()函数
调用方式:整形数=findfirst(文件名,&结构变量名,属性常数组合(如0x26));其中定义struct ffblk 结构变量名;
原形:int findfirst(path,buffer,attr)和int findnext(buffer)
char *path;//要检索的文件名
struct ffblk
{
char ff_reserved[21];
char ff_attrib;//被检索的文件属性
unsigned ff_ftime;//最后修改的时间
//(0-4位:秒数/2;5-10位:分数;11-15位:小时数)
unsigned ff_fdate;//最后修改的日期
//(0-4位:日;5-8位:月;9-15位:年减1980)
long ff_fsize;//文件大小
char ff_name[13];//组名
}*buffer;
int attr;//要检索的文件属性
功能:检索由path和attr指定的文件,把结果返回到buffer。findfirst返回关于第一个指定文件的信息,findnext继续检索。
返回值:0(检索成功),-1(没有找到指定的文件)
属性常数:
FA_NORMAL(0x00) 含意:Normal file, no attributes
FA_RDONLY(0x01) 含意:只读
FA_HIDDEN(0x02) 含意:隐含文件
FA_SYSTEM(0x04) 含意:系统文件
FA_LABEL(0x08) 含意:卷标
FA_DIREC(0x10) 含意:子目录
FA_ARCH(0x20) 含意:修改的文件Archive
头文件:dir.h(dos.h)
floodfill()填充区域的函数
原形:void far floodfill(int x,int y,int border)
功能:在图形设备上用颜色border围起来的区域将用当前填充颜色填充。(x,y)是待填充区域的起点,若起点在封闭区域内,则区域内被填充;若起点在封闭区域外,则区域外被填充。
头文件:graphics.h
floor()
原形∶double floor(double num)
功能∶求不大于num的最大双精度整数
头文件∶math.h
fnmerge()建立文件路径函数
原形:void fnmerge(char *path,const char *drive,const char *dir, const char *name,const char *ext)
功能:合成drive:/dir/name.ext,放在path
头文件:dir.h
fnsplit()分解完整的路径名函数
原形:int fnsplit(char *path,const char *drive,const char *dir,const char *name,const char *ext)
功能:把文件名路径path分成4个部分存放。
其中drive中有冒号;dir中有开始和结尾的反斜杠;ext包括开始圆点
返回值:如果有扩展名,则 返回值&EXTENSION!=0
如果有文件名,则 返回值&FILENAME!=0
如果有目录名,则 返回值&DIRECTORY!=0
如果有驱动器号,则返回值&DIRVE!=0
头文件:dir.h
fopen()打开一个流函数
原形:FILE *fopen(const char *filename,const char *mode)
功能:打开用filename指定的文件,并使其与一个流相联。
使用方式:文件指针名=fopen("文件名","处理方式")
"处理方式"取:
"rt" 打开一个文本文件,只能读。
"wt" 生成一个文本文件,只能写。若文件存在则被重写。
"at" 打开一个文本文件,只能在文件尾部添加。
"rb" 打开一个二进制文件,只能读。
"wb" 生成一个二进制文件,只能写。
"ab" 打开一个二进制文件,只能在文件尾部添加。
"rt+" 打开一个文本文件,可读可写。
"wt+" 生成一个文本文件,可读可写。
"at+" 打开一个文本文件,可读可添加。
"rb+" 打开一个二进制文件,可读可写。
"wb+" 生成一个二进制文件,可读可写。
"ab+" 打开一个二进制文件,可读可添加。
返回值:指明流的指针(成功时)或NULL(失败时)
注:需先定义 FILE *文件指针名;
"文件名"若用 argv[1]代替,则可使用命令行形式指定文件名
FP_OFF()获取远地址偏移量的宏
原形:unsigned FP_OFF(void far *p)
功能:取得和设置远指针*p的偏移量
返回值:偏移量
头文件:dos.h
fprintf()传送输出到一个流中的函数
原形:int fprintf(FILE *stream,const char *format[,argument,...])
功能:①向文件指针指向的文件输出ASCⅡ代码
②向显示器输出错误信息
使用形式:
①fprintf(文件指针,"输出格式",输出项系列);
②fprintf(stderr,"错误信息");
使用实例:fprintf(stream,"%d %c %f",i,c,f);
其中定义FILE *stream;
int i; char c; float f;
返回值:成功则返回输出的字节数,错误则返回EOF。
头文件:stdio.h
FP_SEG()获取远地址段值的宏
原形:unsigned FP_SEG(void far *p)
功能:取得和设置远指针*p段地址值
返回值:段地址值
头文件:dos.h
free()释放已分配内存的函数
原形:void free(void *block)
功能:释放由calloc、malloc、realloc函数调用所分配的内存。
头文件:stdlib.h、alloc.h
fscanf()格式化输入函数
原形:int fscanf(FILE *stream,const char *format[,address,...])
功能:从一个流中扫描输入字段,一次扫描一个字符,每个输入字段根据format所指格式指示符格式化后,把输入字段存在format后面由地址参数给出的位置上。
使用格式:fscanf(文件指针,"输入格式",输入项系列);
使用实例:fscanf(fp,"%d",&b);
从fp指向的文件中读取十进制整数 (ASCⅡ形式)赋予变量b
注:当文件指针是stdin时,与scanf功能完全相同
头文件:stdio.h
fseek()移动文件指针函数
原形:int fseek(FILE *stream,long offset,int whence)
作用:强制一个文件的位置指针指向某个特定的位置(甚至超出文件的尾部)。
使用格式:fseek(*文件指针,偏移(长整型),起点)
定义 FILE *文件指针名;
"起点"取值:
0或SEEK_SET(表示文件开头)
1或SEEK_CUR(表示当前位置)
2或SEEK_END(表示文件尾端)
返回值:0表示成功,非0值表示失败
头文件:stdio.h
fwrite()把参数写入流中的函数
原形:size_t fwrite(const void *ptr,size_t size,size_t n,FILE *stream)
功能:附加n个数据项(每个数据项长度为size个字节)到指定的输出文件后,数据从ptr处开始添加。ptr是指向任意对象的指针。
返回值:调用成功时返回实际写的数据项数,出错时返回一短整形数值。
头文件:stdio.h
例:fwrite(&s,sizeof(s),1,stream);
其中s是一结构变量,stream=fopen();
gcvt()把双精度数转化成字符串的函数
原形∶char*gcvt(value,ndigit,buf)
其中∶double value是待转化数
int ndigit是转化长度
char *buf保存转化后的地址
头文件∶stdlib.h
geninterrupt()执行中断函数
原形:void geninterrupt(int n)
调用方式:geninterrupt(软中断号)
功能:产生一个8086软中断
注:需先向寄存器传递入口信息(用伪变量)
例如 伪变量=要赋的值(入口信息);
调用geninterrupt()函数后得接受出口信息
例如 变量名=伪变量
伪变量∶Turbo C 允许使用伪变量直接访问相应的8086寄存器。伪变量的类型有两种。
① unsigned int : _AX、 _BX、 _CX、 _DX、 _CS、 _DS、 _SS、 _ES、_SP、 _BP、 _DI、 _SI
② unsigned char: _AL、 _AH、 _BL、 _BH、 _CL、 _CH、 _DL、 _DH
getc()从流中取字符的宏
原形:int getc(FILE *stream)
功能:返回输入流stream中一个字符,移动文件指针使之指向下一个字符。
使用格式:字符变量=getc(文件指针)
(正常情况下读取到代码值,读到文件尾或出错时返回EOF)
注:需定义 char 字符变量;FILE *文件指针;
头文件:stdio.h
getch()从键盘无回显地读取一字符的函数
功能:将键盘上输入的单个字符的值(ASCⅡ 码)立刻赋给字符型变量
调用方式:字符形变量=getch()
注:需先定义 char 字符形变量;
头文件:conio.h
getchar()从stdin流中读取一个字符的函数
功能:将键盘上输入的单个字符的值(ASCⅡ 码)回车后赋给字符型变量
调用方式:字符型变量=getchar()
注:需先定义 char 字符型变量;
头文件:stdio.h
getcurdir()读取指定驱动器的当前目录的函数
原形:int getcurdir(int drive,char directory)
drive=0(缺省);1(A驱动器);...
directory用来存放目录名,不包括驱动器名,不以反斜杠开始。
返回值:0(调用成功);1(出错)
头文件:dir.h
getcwd()读取当前目录的函数
原形:char *getcwd(char *buf,int buflen)
功能:读取当前目录的完整路径名(包括驱动器名),最长为buflen个字节,存放在buf中。如果buf为NULL,函数将分配一个buflen字节长的缓冲区,以后可将本函数的返回值作为free函数的参数来释放该缓冲区。
返回值:若buf非空,调用成功返回buf,出错返回NULL;若buf为NULL,返回指向已经分配的内存缓冲区地址。
头文件:dir.h
getdate()读取系统日期函数
原形:void getdate(pdate)
struct date
{
int da_year;
int da_day;
int da_mon;
};
struct date *pdate;
头文件:dos.h
getdfree()读取磁盘空闲空间的函数
原形:void getdfree(drive,dtable)
unsigned char drive;驱动器号(0-当前;1-A;2-B;...)
struct dfree
{
unsigned df_avail;//可使用的簇数
unsigned df_total;//每个驱动器的簇数
unsigned df_bsec;//每个扇区的字节数
unsigned df_sclus;//每个簇的扇区数(出错时返回0xffff)
}*dtable;
功能:把由drive指定的关于驱动器的信息返回到dtable
getdisk()读取当前磁盘驱动器号函数
原形:int getdisk(void)
功能:取得当前驱动器号(0=A;1=B;....)
头文件:dir.h
getenv()读取环境变量的当前值的函数
原形:char *getenv(const char *name)
用法:s=getenv("环境变量名");
需先定义char *s;
功能:返回一给定的环境变量值,环境变量名可大写或小写。如果指定的变量在环境中未定义,则返回一空串。
头文件:stdlib.h
getimage()将指定区域的位图象存入内存的函数
原形:void far getimage(int left,int top,int right,int bottom,void far *bitmap)
功能:将图像(矩形区域)从屏幕拷贝到内存,*bitmap指向内存中存放图像的区域。该区域的前两个字节用于存放矩形的高和宽。
头文件:graphics.h
getmaxx()返回屏幕上最大的X坐标值的函数
原形:int far getmaxx(void)
功能:返回当前图形驱动程序和图形模式下最大的X坐标值。
头文件:graphics.h
getmaxy()返回屏幕上最大的Y坐标值的函数
原形:int far getmaxy(void)
功能:返回当前图形驱动程序和图形模式下最大的Y坐标值。
头文件:graphics.h
getpixel()读取像素颜色的函数
原形:unsigned far getpixel(int x,int y)
头文件:graphics.h
getpsp()
原形∶unsigned getpsp(void)
功能∶使用DOS系统调用0x62,返回程序段前缀(PSP)的段地址
头文件∶dos.h
gets()从标准输入流stdio中读取一字符串的函数
功能:将键盘上输入的字符串立刻赋予字符串变量并显示出来
调用方式:gets(字符串变量名)
注:需定义 char *字符串变量名;
gettime()读取系统时间的函数
原形:void gettime(ptime)
struct time
{
unsigned char ti_min;
unsigned char ti_hour;
unsigned char ti_hund;//百分之一秒
unsigned char ti_sec;
};
struct time *ptime;
getvect()读取中断向量函数
原形:void interrupt(*getvect(int interruptno))
功能:读入由interruptno(0-255之间)所指定的中断向量值,并把该中断向量值作为中断函数的远指针返回。
返回值:指定中断向量的当前4字节值。
头文件:dos.h
使用实例:oldfunc=getvect(5);
先定义void interrupt(*oldfunc)();
用后恢复setvect(5,oldfunc);
getx()返回当前图形方式下位置的X坐标值的函数
原形:int far getx(void);
头文件:graphics.h
gety()返回当前图形方式下位置的Y坐标值的函数
原形:int far gety(void);
头文件:graphics.h
imagesize()返回保存图像缓冲区大小的函数
原形:unsigned far imagesize(int left,int top,int right,int bottom)
功能:确定保存图像所需的存储区大小。
返回值:返回存储区的大小(字节),若所需内存大于等于64K-1字节,则返回0xffff(-1)。
头文件:graphics.h
initgraph()显示模式控制函数(初始化图形系统函数)
功能:把图形适配器设置为一种图形模式,将选择的图形驱动程序(在BGI文件中)装入到内存。
调用方式:
void far initgraph(int far *driver,int far *mode,char far*path)
其中: *driver可以是数值(0-10),也可是符号值(DETECT、CGA、MCGA、EGA、EGA64、EGAMONO、RESERVED、HERCMONO、ATT400、VGA、 PC3270)。
*mode参数从图形系统为各种常用的图形适配器设置的图形模式中(CGAC0、…、IBM8514HI--见头文件graphics.h)选取。常用的有:VGAMED或1(640×350)(等效于BIOS的模式15)、EGAHI或1(640×350)等。
path指向的字符串为装入驱动程序的路径。如果缺省路径,驱动程序在当前目录。
结束方法:
①void far closegraph()函数用于当程序还要继续在字符模下运行时。它释放由图形函数所占用的内存,同时把屏幕模式恢复为调用initgraph()之前的模式。
②void far restorecrtmode()函数用于结束运行。将图形适配器设置到原来的模式。任何分配的内存都将自动释放。
头文件:graphics.h
inport()从端口中读入一个字的函数
原形:int inport(int portid)
调用方式:整型变量=inport(0x端口号);
功能:从指定端口地址读一个字。
头文件:dos.h
inportb()从端口读入一个字节的函数
原形:unsigned char inportb(int portid)
调用方式:字符变量=inportb(0x端口号);
功能:从指定端口地址读一个字节。
头文件:dos.h
int86()执行中断函数(调用8086软中断函数)
原形:int int86(int intno,union REGS *inregs,union REGS *outregs)
调用方式:int86(中断号,&输入指针名,&输出指针名)
返回值:中断处理结束时的AX寄存器的值,错误时outregs->x.cflag!=0
功能:函数int86() 用来执行指定的8086软中断。首先把输入指针所指的共用体中的内容拷贝到CPU 的寄存器中,随即产生对应的中断,返回后将CPU寄存器(AX)的内容拷贝到输出指针指向的共用体中。在使用int86() 函数进行BIOS接口的系统调用时,有的中断调用设有若干选择项,这些选择项可以根据调用时AH寄存器中的值来进行访问。
注:1.需先定义 union REGS 输入指针名,输出指针名;
2.向寄存器传递入口信息
输入指针名.x.寄存器名=要赋的值(入口信息);
3.调用int86后得接受出口信息
变量名=输出指针名.x.寄存器名
4.REGS的定义(在dos.h中):
struct WORDREGS{unsigned int ax, bx, cx, dx, si, di, cflag, flags;}
struct BYTEREGS{unsigned char al, ah, bl, bh, cl, ch, dl, dh;}
union REGS{struct WORDREGS x;struct BYTEREGS h;}
头文件:dos.h
int86x()执行中断函数 (通用8086软中断接口函数)
头文件:dos.h
原形:int int86x(int intno,union REGS *inregs,union REGS *outregs,struct SREGS * segregs)
调用方式:int86x(中断号,&输入指针名,&输出指针名,&段寄存器指针名);
注1:需先定义 union REGS 输入指针名,输出指针名;
union REGS 示意图
struct struct
WORDREGS BYTEREGS
┌ ┌───────┬──────┐──┬── ┐
│ │ │ al │ 1 byte │
│ │ ax ├──────┤──┴─ 2 bytes
│ │ │ ah │ │
│ ├───────┼──────┤───── ┘
│ │ │ bl │
│ │ bx ├──────┤
│ │ │ bh │
│ ├───────┼──────┤
│ │ │ cl │
│ │ cx ├──────┤
│ │ │ ch │
│ ├───────┼──────┤
│ │ │ dl │
│ │ dx ├──────┤
│ │ │ dh │
union regs├───────┼──────┤
│ │ │ │
│ │ si │ │
│ │ │ │
│ ├───────┤ │
│ │ │ │
│ │ di │ │
│ │ │ │
│ ├───────┤ │
│ │ │ │
│ │ cflag │ │
│ │ │ │
│ ├───────┤ │
│ │ │ │
│ │ flags │ │
│ │ │ │
└ └───────┴──────┘
│ x 两个结构变量 h │
└── 共享同一存储域 ──┘
其中字段flags对应于标志寄存器。字段cflag仅对应于进位标志位,函数在调用时不用该字段,只在返回时设置这个字段,因为许多BIOS服务都是通过进位标置为0还是1来表示成功还是失败。
注2:需先定义 struct SREGS 段寄存器指针名;
结构SREGS定义如下
struct SREGS {unsigned int es,cs,ss,ds}
函数只用了该结构中的段寄存器DS和ES。调用时根据它们的值设置DS和ES,同时把DS和ES原来的值保存在这个结构中,返回时再恢复DS和ES为原来的值,这就允许程序使用远指针或大数据编译模式。
该函数置全局变量_doserrno等于寄存器AX中的值,其返回值也等于AX中的值。
注3:向寄存器传递入口信息
输入指针名.x.寄存器名=要赋的值(入口信息);
注4:调用int86x后得接受出口信息
变量名=输出指针名.x.寄存器名
intdos()通用dos中断接口函数
原形:int intdos(inregs,outregs)
union REGS *inregs;//调用时的各寄存器的值
union REGS *outregs;//返回寄存器的值
功能:产生DOS软中断
注意:如果需要功能号,则装入AH;如果需要子功能号,则装入AL。
头文件:dos.h
intdosx()通用dos中断接口函数
原形:int intdosx(inregs,outregs,segregs)
union REGS *inregs;调用时的各寄存器的值
union REGS *outregs;返回寄存器的值
struct SREGS *seregs;调用时的段寄存器的值(还设置返回时的值)
功能:产生DOS软中断
头文件:dos.h
intr()执行8086软中断函数(改变软中断接口函数)
原形:void intr(int intno,struct REGPACK *preg)
调用方式:intr(中断号,&结构变量名)
注1:结构REGPACK定义如下
struct REGPACK
{
unsigned r_ax,r_bx,r_cx,r_dx;
unsigned r_bp,r_si,r_di,r_ds,r_es,r_flag;}
注2:使用时先定义一个结构变量
struct REGPACK 结构变量名;
注3:入口和出口用同一个结构变量来传递寄存器的值。
结构变量名.r_ax=要赋的值;
......
intr(中断号,&结构变量名);
某变量=结构变量名.r_ax;
头文件:dos.h
itoa()把整形数转换为字符串的函数
原形:char *itoa(int value,char *string,int radix)
功能:把value的值转换为以NULL结束的字符串,并把结果存在string中。radix是转换的基数值,在2到36之间。分配给string的空间必须可容纳返回的所有字节(最多17字节)。
返回值:指向string的指针
头文件:stdlib.h
kbhit()检查当前按下的键的函数
原形:int kbhit(void)
功能:检查按下的键是否有效,若有效则可用getch()或getche()读取。
返回值:如果按键有效,返回一非零值,否则返回0。
头文件:conio.h
keep()驻留并退出函数
原形:void keep(unsigned char status,unsigned size)
功能:用于安装一个TSR程序(使用DOS功能调用0x31)。出口状态设置为在status中的值,程序占用存储空间为size,并释放内存的其余部分。
头文件:dos.h
log()
原形∶double log(double num)
功能∶求num的自然对数值
头文件∶math.h
log10()
原形∶double log10(double num)
功能∶求num以10为底的对数值
头文件∶math.h
_lrotl()将一个无符号长整形数左循环移位的函数
原形:unsigned long _lrotl(unsigned long value,int count)
功能:将value向左循环移动count位。
返回值:将value向左循环移动count位后的值。
头文件:stdlib.h
_lrotr()将一个无符号长整形数右循环移位的函数
原形:unsigned long _lrotr(unsigned long value,int count)
功能:将value向右循环移动count位。
返回值:将value向右循环移动count位后的值。
头文件:stdlib.h
lseek()移动文件指针函数
原形:long lseek(int handle,long offset,int fromwhere)
handle=open()函数的返回值(文件句柄);
fromwhere=文件位置
(SEEK_SET(0)从文件头位置;SEEK_CUR(1)从当前文件指针位置;SEEK_END(2)从文件结尾位置)
功能:把文件指针移动到fromwhere所指的地址加上offset新位置的偏移上。
头文件:io.h
返回值:指针新位置的偏移量(相对于文件开始处),出错时返回-1L。
ltoa()把长整形数转换为字符串的函数
原形:char *ltoa(long value,char *string,int radix)
功能:把value的值转换为以NULL结束的字符串,并把结果存在string中。radix是转换的基数值,在2到36之间。分配给string的空间必须可容纳返回的所有字节(最多33字节)。
返回值:指向string的指针
头文件:stdlib.h
malloc()分配内存函数
原形:void *malloc(size_t size)
功能:从堆中分配大小为size字节的块。win32也适用。
返回值:返回新分配内存的地址,若无足够内存,返回NULL。
头文件:alloc.h、stdlib.h
mkdir()创建目录函数
原形:int mkdir(const char *path)
功能:按给定的路径建立一个新的目录
头文件:dir.h
返回值:0(成功);-1(失败)
mktemp()建立一个唯一的文件名的函数
原形:char *mktemp(char *template)
功能:使用一个唯一的文件名来替换字符串template,并返回template。
头文件:dir.h
MK_FP()设置一个远指针的宏
原形:void far *MK_FP(unsigned seg,unsigned ofs)
功能:通过段值(seg)和偏移量(ofs)建立一个远指针
返回值:远指针
头文件:dos.h
movedata()拷贝数据函数
原形:void movedata(unsigned srcseg,unsigned srcoff,unsigned dstseg,unsigned dstoff,size_t n)
功能:从原地址(srcseg:srcoff)拷贝n个字节的数据到目标地址(dstseg:dstoff)。
头文件:mem.h、string.h
_open()打开一个文件进行读写的函数
原形:int _open(path,oflags)
char *path;//已建立文件的路径名
int oflags;//方式
功能:打开由path指定的文件,返回文件的句柄
返回值:0(正常结束);-1(错误)
头文件:fcntl.h、io.h
open()打开文件进行读写的函数
原形:int open(const char *path,int access[,unsigned mode])
使用方法:文件句柄=open("文件名",打开模式|打开模式);
功能:打开path指定的文件,根据access指定的模式值读写。
access模式:
O_RDONLY 以只读方式打开
O_WRONLY 以只写方式打开
O_RDOWR 以读写方式打开
以上标志只能使用一个,以下可以用|组合使用
O_NDELAY
O_APPEND 若置位,每次写操作前都使文件指针指到文件末尾
O_CREAT 若文件不存在则创建
O_TRUNC 若文件已存在,则将文件长度截为0
O_EXCL 只和O_CREAT一起使用,若文件已经存在,返回错误代码
O_BINARY 以二进制方式打开
O_TEXT 以文本方式打开
如果使用了O_CREAT方式,则需要提供参数mode
(S_IWRITE可写;S_IREAD可读;S_IREAD|S_IWRITE可读写)
返回值:文件句柄(成功时);-1(失败时)。
成功时,文件指针指向文件头。
头文件:fcntl.h、io.h
outport()输出一个字到端口中的函数
原形:void outport(int portid,int value)
调用方式:outport(0x端口号,要输出的字);
功能:往指定端口地址输出一个字。
头文件:dos.h
outportb()输出一个字节到端口中的函数
原形:void outportb(int portid,unsigned char value)
调用方式:outportb(0x端口号,要输出的字节);
功能:往指定端口地址输出一个字节。
附:PC I/O地址分配
PC只用了10位地址线(A0-A9)进行译码,其寻址的范围为0H-3FFH,共有1024个I/O地址。这1024个地址中前半段(A9=0,范围为0H-1FFH)是属于主机板I/O译码,后半段(A9=1,范围为200H-3FFH)则是用来扩展插槽上的I/O译码用。
I/O端口功能表
———————————————————————————
I/O地址 功能、用途
———————————————————————————
0 DMA通道0,内存地址寄存器(DMA控制器1(8237))
1 DMA通道0, 传输计数寄存器
2 DMA通道1,内存地址寄存器
3 DMA通道1, 传输计数寄存器
4 DMA通道2,内存地址寄存器
5 DMA通道2, 传输计数寄存器
6 DMA通道3,内存地址寄存器
7 DMA通道3, 传输计数寄存器
8 DMA通道0-3的状态寄存器
AH DMA通道0-3的屏蔽寄存器
BH DMA通道0-3的方式寄存器
CH DMA清除字节指针
DH DMA主清除字节
EH DMA通道0-3的清屏蔽寄存器
FH DMA通道0-3的写屏蔽寄存器
19H DMA起始寄存器
20H-3FH 可编程中断控制器1(8259)使用
40H 可编程中断计时器(8253)使用,读/写计数器0
41H 可编程中断计时器寄存器
42H 可编程中断计时器杂项寄存器
43H 可编程中断计时器,控制字寄存器
44H 可编程中断计时器,杂项寄存器(AT)
47H 可编程中断计时器,计数器0的控制字寄存器
48H-5FH 可编程中断计时器使用
60H-61H 键盘输入数据缓冲区
61H AT:8042键盘控制寄存器/XT:8255输出寄存器
62H 8255输入寄存器
63H 8255命令方式寄存器
64H 8042键盘输入缓冲区/8042状态
65H-6FH 8255/8042专用
70H CMOS RAM地址寄存器
71H CMOS RAM数据寄存器
80H 生产测试端口
81H DMA通道2,页表地址寄存器
82H DMA通道3,页表地址寄存器
83H DMA通道1,页表地址寄存器
87H DMA通道0,页表地址寄存器
89H DMA通道6,页表地址寄存器
8AH DMA通道7,页表地址寄存器
8BH DMA通道5,页表地址寄存器
8FH DMA通道4,页表地址寄存器
93H-9FH DMA控制器专用
A0H NM1屏蔽寄存器/可编程中断控制器2
A1H 可编程中断控制器2屏蔽
C0H DMA通道0,内存地址寄存器(DMA控制器2(8237))
C2H DMA通道0, 传输计数寄存器
C4H DMA通道1,内存地址寄存器
C6H DMA通道1, 传输计数寄存器
C8H DMA通道2,内存地址寄存器
CAH DMA通道2, 传输计数寄存器
CCH DMA通道3,内存地址寄存器
CEH DMA通道3, 传输计数寄存器
D0H DMA状态寄存器
D2H DMA写请求寄存器
D4H DMA屏蔽寄存器
D6H DMA方式寄存器
D8H DMA清除字节指针
DAH DMA主清
DCH DMA清屏蔽寄存器
DEH DMA写屏蔽寄存器
DFH-EFH 保留
F0H-FFH 协处理器使用
100H-16FH保留
170H 1号硬盘数据寄存器
171H 1号硬盘错误寄存器
172H 1号硬盘数据扇区计数
173H 1号硬盘扇区数
174H 1号硬盘柱面(低字节)
175H 1号硬盘柱面(高字节)
176H 1号硬盘驱动器/磁头寄存器
177H 1号硬盘状态寄存器
1F0H 0号硬盘数据寄存器
1F1H 0号硬盘错误寄存器
1F2H 0号硬盘数据扇区计数
1F3H 0号硬盘扇区数
1F4H 0号硬盘柱面(低字节)
1F5H 0号硬盘柱面(高字节)
1F6H 0号硬盘驱动器/磁头寄存器
1F7H 0号硬盘状态寄存器
1F9H-1FFH保留
200H-20FH游戏控制端口
210H-21FH扩展单元
278H 3号并行口,数据端口
279H 3号并行口,状态端口
27AH 3号并行口,控制端口
2B0H-2DFH保留
2E0H EGA/VGA使用
2E1H GPIP(0号适配器)
2E2H 数据获取(0号适配器)
2E3H 数据获取(1号适配器)
2E4H-2F7H保留
2F8H 2号串行口,发送/保持寄存器(RS232接口卡2)
2F9H 2号串行口,中断有效寄存器
2FAH 2号串行口,中断ID寄存器
2FBH 2号串行口,线控制寄存器
2FCH 2号串行口,调制解调控制寄存器
2FDH 2号串行口,线状态寄存器
2FEH 2号串行口,调制解调状态寄存器
2FFH 保留
300H-31FH原形卡
320H 硬盘适配器寄存器
322H 硬盘适配器控制/状态寄存器
324H 硬盘适配器提示/中断状态寄存器
325H-347H保留
348H-357H DCA3278
366H-36FH PC网络
372H 软盘适配器数据输出/状态寄存器
375H-376H 软盘适配器数据寄存器
377H 软盘适配器数据输入寄存器
378H 2号并行口,数据端口
379H 2号并行口,状态端口
37AH 2号并行口,控制端口
380H-38FH SDLC及BSC通讯
390H-393H Cluster适配器0
3A0H-3AFH BSC通讯
3B0H-3B H MDA视频寄存器
3BCH 1号并行口,数据端口
3BDH 1号并行口,状态端口
3BEH 1号并行口,控制端口
3C0H-3CFH EGA/VGA视频寄存器
3D0H-3D7H CGA视频寄存器
3F0H-3F7H 软盘控制器寄存器
3F8H 1号串行口,发送/保持寄存器(RS232接口卡1)
3F9H 1号串行口,中断有效寄存器
3FAH 1号串行口,中断ID寄存器
3FBH 1号串行口,线控制寄存器
3FCH 1号串行口,调制解调控制寄存器
3FDH 1号串行口,线状态寄存器
3FEH 1号串行口,调制解调状态寄存器
3FFH 保留
—————————————————————————-
outtextxy()在指定位置显示一字符串的函数
原形:void far outtextxy(int x,int y,char far *textstring)
功能:按照当前对齐方式和当前字体、方向、大小在视区中给定位置显示一文本字符串。
注意:用textwidth和textheight函数决定字符串的尺寸大小。
头文件:graphics.h
peek()返回指定内存中字的函数
原形:int peek(int seg,unsigned offset)
功能:返回地址为seg:offset的字单元的值
头文件:dos.h
peekb()返回指定内存中字节的函数
原形:char peekb(int seg,unsigned offset)
功能:返回地址为seg:offset的字节单元的值
poke()在指定的内存中存储一个字的函数
原形:void poke(int seg,unsigned offset,int word)
功能:把word的16位值放到地址为seg:offset的字单元中
pokeb()在指定的内存中存储一个字节的函数
原形:void pokeb(int seg,unsigned offset,int byte)
功能:把byte的8位值放到地址为seg:offset的字节单元中
pow()
原形∶double pow(double b,double exp)
功能∶求以b为底的exp次幂的值
头文件∶math.h
printf()写格式化输出到stdout的函数
使用方式:例
①printf("%f",实型变量);
②printf("%f",(*函数指针名)(参数));
③printf("%c",字符变量);
④printf("%c",*字符串变量名即字符串地址);
只显示字符串的第一个字符。
⑤printf("%s",字符串数组名即字符串数组地址);
⑥printf("%-10s",字符串变量名);
显示字符串时限定十位(不足则补空格),并靠左端对齐。
⑦printf("%s",*二级指针变量);
⑧printf("字符串%05d/n",整型变量);
先显示字符串,然后显示整型变量的值(限五位,不足则补零),最后换行。
注:
1.① 需先定义 float 实型变量;
② 需先定义 float (*函数指针名)(); 并有相应的函数
③ 需先定义 char 字符变量='单个字符';
④⑥需先定义 char *字符串变量名; 并赋值
⑤ 需先定义 char 字符串数组名[]="字符串";
⑦ 需先定义 char **二级指针变量
2.其它转换字符(在%后)有
① o 整型数以无符号的八进制形式输出
② x 整型数和伪变量以无符号的十六进制形式输出
③ u 整型数以无符号的十进制形式输出
④ e 浮点数或双精度浮点数以指数形式输出
⑤ g 选用e或f格式中输出位数较短的形式
⑥ p 以无符号的十六进制形式输出变量的地址。若要输出函数的地址,远指针用Fp;近指针用Np。
putch()向屏幕输出字符的函数
使用方式:
① putch('转义字符');
② putch('单个字符');
③ putch(字符变量);
注:③需先定义 char 字符变量='单个字符';
头文件:conio.h
putchar()在stdout上输出字符的宏
原形:int putchar(int c)
返回值:成功返回字符c,失败返回EOF。
头文件:stdio.h
putenv()将字符串放入当前环境中的函数
原形:int putenv(const char *name)
用法例:putenv("PATH=C:/B/TC");
功能:把字符串name加到当前程序运行的环境中。当程序结束后,原环境将得到恢复。
返回值:0(成功);-1(失败)
头文件:stdlib.h
putimage()重新写屏函数(输出一个位图象到图形屏幕上的函数)
功能:将用getimage()函数储存在buf 所指向的内存区域的图形输出到屏幕上。
原形:
void far putimage(int left,int top,void far *buf,int op)
其中op的值决定了图形以何种方式写到屏幕上。
COPY_PUT 或0 原样复制
XOR_PUT 或1 与屏幕图形取“异或”后写入
OR_PUT 或2 与屏幕图形取“或”后写入
AND_PUT 或3 与屏幕图形取“与”后写入
NOT_PUT 或4 复制原图形的“逆”
使用不同的方式将图形写到屏幕上,可以实现图形变换。例如,采用异或方式在原始位置重写,那么,原图将消失。 如果再使用复制方式(COPY_PUT)在一个新的地方重现该图形,就产生了图形的移动。
头文件:graphics.h
putpixel()写像素点函数
原形:void far putpixel(int x,int y,int color)
头文件:graphics.h
puts()输出一字符串到stdout(标准输出)的函数
使用方式:
① puts("字符串");
② puts(字符串变量名即字符串变量的地址)
注:②需先定义 char *字符串变量名="字符串";
头文件:stdio.h
_read()读文件函数
原形:int _read(handle,buffer,count)
int handle;//文件句柄
void *buffer;//存放读出数据的缓冲区
unsigned count;//一次读出的字节数
功能:从由handle指定的文件中读取由count指定字节数的数据到buffer
返回值:0-0xfffe(实际读出的字节数);-1(错误)
头文件:io.h
read()读文件函数
原形:int read(int handle,void *buf,unsigned len)
功能:从与handle(从creat、open、dup或dup2调用中得到的句柄)相联的文件中读取len字节到由buf所指的缓冲区中。对于以文本方式打开的文件,read删除读入数据中的回车符。当读到Ctrl-Z字符时返回文件结束。对于磁盘文件,read从当前文件指针处开始读取数据。在读操作完成后,文件指针增量为读入的字节数。对于设备,直接从设备中读字节。
返回值:读入缓冲区的字节数,如果文件以文本方式打开,则不包括回车符和Ctrl-Z字符。
头文件:io.h
realloc()重新分配内存函数
原形:void *realloc(void *block,size_t size)
block指向用malloc、calloc或realloc已得到的内存。
size是重新分配的字节。
返回值:重分配的块地址。若不能重分配,则返回NULL。
头文件:stdlib.h
rectangle()画一个矩形的函数
原形:void far rectangle(int left,int top,int right,int bottom)
功能:用当前线性、宽度和画线颜色绘制一个矩形。
头文件:graphics.h
remove()删除一个文件的函数
原形:int remove(const char *filename)
返回值:0(成功);-1(失败)
头文件:stdio.h
rename()文件改名函数
原形:int rename(const char *oldname,const char *newname)
注意:如果newname中包含了一个驱动器指示符,它必须与oldname中给出的指示符相同。oldname和newname中的目录可以不同,因此rename函数把文件从一个目录移到另一个目录。不允许使用通配符。
返回值:0(成功);-1(失败)
restorecrtmode()恢复屏幕视频模式为调用initgraph前的设置的函数
原形:void far restorecrtmode(void)
头文件:graphics.h
rmdir()删除目录函数
原形:int rmdir(const char *path)
注意:删除的目录不能是当前目录,不是根目录,是空目录
返回值:0(成功);-1(操作出错)
头文件:dir.h
_rotl()将一个无符号整形数左循环移位的函数
原形:unsigned _rotl(unsigned value,int count)
功能:将value向左循环移动count位。
返回值:将value向左循环移动count位后的值。
头文件:stdlib.h
_rotr()将一个无符号整形数右循环移位的函数
原形:unsigned _rotr(unsigned value,int count)
功能:将value向右循环移动count位。
返回值:将value向右循环移动count位后的值。
头文件:stdlib.h
scanf()格式化输入函数
使用格式:scanf("输入格式",输入项系列)
① scanf("%f",&实型变量)
② scanf("%c",&字符变量)
③ scanf("%s",字符串变量)
④ scanf("%d",&整型变量)
注:需先定义以上各种变量如 char *字符串变量;
searchpath()按dos路径查找一个文件的函数
原形:char *searchpath(const char *file)
用法:p=searchpath("文件名"); 先定义char *p;
功能:搜索dos路径(环境变量中的path=....)来定位由file给出的文件。
返回值:指向完整路径名字符串的指针。定位失败返回NULL。
头文件:dir.h
segread()读段寄存器函数
原形:void segread(struct SREGS *segp)
作用:把当前寄存器的值保存到SREGS型机构变量segp中。
segs.cs=代码段寄存器的值;
segs.ds=数据段寄存器的值;
segs.es=附加段寄存器的值;
segs.ss=堆栈段寄存器的值;
setactivepage()设置图形输出活动页的函数
原形:void far setactivepage(int page)
功能:使page成为当前活动的图形页,其后所有的图形输出操作都在page图形页进行。活动图形页可以不是在屏幕上看到的页。
头文件:graphics.h
setcolor()设置当前要画的线颜色的函数
原形:void far setcolor(int color)
头文件:graphics.h
注意:颜色值(EGA/VGA)
0-BLACK; 1-BLUE; 2-GREEN;
3-CYAN; 4-RED; 5-MAGENTA;
6-BROWN; 7-LIGHTGRAY; 8-DARKGRAY;
9-LIGHTBLUE; 10-LIGHTGREEN;11-LIGHTCYAN;
12-LIGHTRED; 13-LIGHTMAGENTA;
14-YELLOW; 15-WHITE
setdisk()设置当前驱动器的函数
原形:int setdisk(int drive)
功能:把由drive指定的驱动器修改成当前驱动器,返回可使用的驱动器数。
头文件:dir.h
setgraphmode()将系统设置成图形模式并清屏的函数
原形:void far setgraphmode(int mode)
功能:选择一个不同于调用initgraph()函数时所设置的缺省的图形模式。
返回值:如果给了一个对当前驱动程序来说无效的模式,则返回-10。
头文件:graphics.h
setlinestyle()设置当前画线宽度和类型的函数
原形:
void far setlinestyle(int linestyle,unsigned upattern,int thickness)
其中:linestyle=0为实线;1为点线;2为中心线;3为破折线;4为用户定义。
thickness=1为一个像素宽;3为三个像素宽。
只有当linestyle=4时,upattern才起作用。
头文件:graphics.h
settextstyle()显示字符的当前设置函数
功能:设置当前输出英文字符的字体、大小和方向。
调用方式:
void far settextstyle(int font,int direction,int charsize)
其中①参数font确定所选定的字体形状,
DEFAULT_FONT 或0 是8×8位图字体
TRIPLEX_FONT 或1 是三重矢量字体
SMALL_FONT 或2 是小号矢量字体
SANS_SERIF_FONT或3 是无衬线矢量字体
GOTHIC_FONT 或4 是哥特矢量字体
②参数durection字符的显示方向,
HORIZ_DIR 或0 是水平方向
VERT_DIR 或1 是垂直方向
③参数charsize表示字符放大的倍数,其值为0到10。
setvect()设置中断向量函数
setvect(int 中断号,void interrupt(*中断函数名))
功能:把中断服务程序的地址装入中断向量表中。
调用方法:setvect(中断号,中断函数名即地址);
(1)得预先定义要代替原函数的新函数
void interrupt 中断函数名(void)
{......}
(2)得先保留原中断函数地址
void interrupt (*保留函数名)(void);
保留函数名=getvect(中断号);
(3)事后得将原中断函数地址装回向量表中
setvect(中断号,保留函数名);
setviewport()建立视口的函数
原形: void far setviewport(int left,int top,int right,int bottom,int clip)
功能:用左上角坐标left,top和右下角坐标right,bottom建立一个视口,如果clip为1,则超出视口的输出自动被剪裁掉;如果clip为0,则不被剪裁。
例:setviewport(0,0,100,100,1)建立对角线为0,0和100,100的视口,并带有剪裁功能。
注:要清除当前视口,用函数clearnviewport()。
setvisualpage()设置可见的图形页号的函数
原形:void far setvisualpage(int page)
功能:使得page成为可见的图形页。
头文件:graphics.h
sin()
原形∶double sin(double arg)
功能∶计算arg(弧度)的正弦值
头文件∶math.h
sprintf()格式化输出到数组的函数
原形∶int sprintf(buf,format,arg_list)
其中char *buf;
功能∶把arg_list参量的值按format的格式输出到buf中。
例∶sprintf(buffer,"相对扇区号∶%s(其中∶柱面号为%d/磁头号为%d/扇区号为%d)",string,cyls,head,sector);
其中char buffer[100];
char *string=" ";
int cyls,head,sector;
返回值∶实际写入数组的字符个数。
头文件∶stdio.h
strcat()
原形∶char *strcat(str1,str2)
功能∶把str2所指的字符串连接到str1所指的字符串后。
返回值∶指向str1的指针。
tan()
原形∶double tan(double arg)
功能∶计算arg(弧度)的正切值
头文件∶math.h
_write()写文件函数
原形:int _write(handle,buffer,count)
int handle;//文件的句柄
void *buffer;//存放数据的缓冲区
unsigned count;//写入的字节数
功能:从由buffer指定的缓冲区写入由count指定字节数的数据到由handle指定的文件。返回实际写入的字节数。
返回值:0-0xfffe(实际写入的字节数);-1(错误)
头文件:io.h
write()写文件函数
原形:int write(int handle,char *buf,unsigned len)
用法:write(文件句柄,缓冲区地址,缓冲区字节长度<最大65534>);
功能:将缓冲区的数据写入与handle相联的文件或设备中,handle是从creat、open、dup或dup2调用中得到的文件句柄。对于磁盘或磁盘文件,写操作从当前文件指针处开始,对于用O_APPEND选项打开的文件,写数据之前,文件指针指向EOF;对于设备,字节被直接传送到设备中;
返回值:实际写入的字节数(不包括回车符),出错时返回-1。
头文件:io.h
关于#Pragma
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为: #Pragma Para
其中Para 为参数,下面来看一些常用的参数。
(1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗
口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:
#Pragma message(“消息文本”)
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法
#ifdef _X86
#Pragma message(“_X86 macro activated!”)
#endif
当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_
X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了
。
(2)另一个使用得比较多的pragma参数是code_seg。格式如:
#pragma code_seg( ["section-name"[,"section-class"] ] )
它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。
(3)#pragma once (比较常用)
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
(4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。
(5)#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体
外观的定义。
(6)#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示4507和34号警告信息
#pragma warning(once:4385) // 4385号警告信息仅报告一次
#pragma warning(error:164) // 把164号警告信息作为一个错误。
同时这个pragma warning 也支持如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
这里n代表一个警告等级(1---4)。
#pragma warning( push )保存所有警告信息的现有的警告状态。
#pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告
等级设定为n。
#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的
一切改动取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
//.......
#pragma warning( pop )
在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。
(7)pragma comment(...)
该指令将一个注释记录放入一个对象文件或可执行文件中。
常用的lib关键字,可以帮我们连入一个库文件。
每个编译程序可以用#pragma指令激活或终止该编译程序支持的一些编译功能。例如,对循环优化功能:
#pragma loop_opt(on) // 激活
#pragma loop_opt(off) // 终止
有时,程序中会有些函数会使编译器发出你熟知而想忽略的警告,如“Parameter xxx is never used in function xxx”,可以这样:
#pragma warn —100 // Turn off the warning message for warning #100
int insert_record(REC *r)
{ /* function body */ }
#pragma warn +100 // Turn the warning message for warning #100 back on
函数会产生一条有唯一特征码100的警告信息,如此可暂时终止该警告。
每个编译器对#pragma的实现不同,在一个编译器中有效在别的编译器中几乎无效。可从编译器的文档中查看。
- 作者: freejustin 2006年11月15日, 星期三 16:30 回复(0) | 引用(0) 加入博采
一、sizeof的概念
sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。
二、sizeof的使用方法
1、用于数据类型
sizeof使用形式:sizeof(type)数据类型必须用括号括住。如sizeof(int)。
2、用于变量
sizeof使用形式:sizeof(var_name)或sizeof var_name变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。
三、sizeof的结果
sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
1、若操作数具有类型char、unsigned char或signed char,其结果等于1。
ANSI C正式规定字符类型为1字节。
2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10。
3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。
4、当操作数具有数组类型时,其结果是数组的总字节数。
5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。
让我们看如下结构:
struct {char b; double x;} a;
在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。
这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。
6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
四、sizeof与其他操作符的关系
sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。
五、sizeof的主要用途
1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:
void *malloc(size_t size),
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
2、sizeof的另一个的主要用途是计算数组中元素的个数。例如:
void * memset(void * s,int c,sizeof(s))。
六、建议
由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。
本文主要包括二个部分,第一部分重点介绍在VC中,怎么样采用sizeof来求结构的大小,以及容易出现的问题,并给出解决问题的方法,第二部分总结出VC中sizeof的主要用法。
1、 sizeof应用在结构上的情况
请看下面的结构:
struct MyStruct
{
double dda1;
char dda;
int type
};
对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?也许你会这样求:
sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13
但是当在VC中测试上面结构的大小时,你会发现sizeof(MyStruct)为16。你知道为什么在VC中会得出这样一个结果吗?
其实,这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vc6.0,32位系统)。
类型对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char 偏移量必须为sizeof(char)即1的倍数
int 偏移量必须为sizeof(int)即4的倍数
float 偏移量必须为sizeof(float)即4的倍数
double 偏移量必须为sizeof(double)即8的倍数
Short 偏移量必须为sizeof(short)即2的倍数
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
下面用前面的例子来说明VC到底怎么样来存放结构的。
struct MyStruct
{
double dda1;
char dda;
int type
};
为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;接下来为第三个成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。所以整个结构的大小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。
下面再举个例子,交换一下上面的MyStruct的成员变量的位置,使它变成下面的情况:
struct MyStruct
{
char dda;
double dda1;
int type
};
这个结构占用的空间为多大呢?在VC6.0环境下,可以得到sizeof(MyStruc)为24。结合上面提到的分配空间的一些原则,分析下VC怎么样为上面的结构分配空间的。(简单说明)
struct MyStruct
{
char dda;//偏移量为0,满足对齐方式,dda占用1个字节;
double dda1;//下一个可用的地址的偏移量为1,不是sizeof(double)=8
//的倍数,需要补足7个字节才能使偏移量变为8(满足对齐
//方式),因此VC自动填充7个字节,dda1存放在偏移量为8
//的地址上,它占用8个字节。
int type;//下一个可用的地址的偏移量为16,是sizeof(int)=4的倍
//数,满足int的对齐方式,所以不需要VC自动填充,type存
//放在偏移量为16的地址上,它占用4个字节。
};//所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构
//的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof
//(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为
//sizeof(double)=8的倍数。
所以该结构总的大小为:sizeof(MyStruc)为1+7+8+4+4=24。其中总的有7+4=11个字节是VC自动填充的,没有放任何有意义的东西。
VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。
VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;
否则必须为n的倍数。下面举例说明其用法。
#pragma pack(push) //保存对齐状态
#pragma pack(4)//设定为4字节对齐
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop)//恢复对齐状态
以上结构的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0,满足我们自己设定的对齐方式(4字节对齐),m1占用1个字节。接着开始为m4分配空间,这时其偏移量为1,需要补足3个字节,这样使偏移量满足为n=4的倍数(因为sizeof(double)大于n),m4占用8个字节。接着为m3分配空间,这时其偏移量为12,满足为4的倍数,m3占用4个字节。这时已经为所有成员变量分配了空间,共分配了16个字节,满足为n的倍数。如果把上面的#pragma pack(4)改为#pragma pack(16),那么我们可以得到结构的大小为24。(请读者自己分析)
2、 sizeof用法总结
在VC中,sizeof有着许多的用法,而且很容易引起一些错误。下面根据sizeof后面的参数对sizeof的用法做个总结。
A. 参数为数据类型或者为一般变量。例如sizeof(int),sizeof(long)等等。这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节,在32位系统中占4个字节。
B. 参数为数组或指针。下面举例说明.
int a[50]; //sizeof(a)=4*50=200; 求数组所占的空间大小
int *a=new int[50];// sizeof(a)=4; a为一个指针,sizeof(a)是求指针
//的大小,在32位系统中,当然是占4个字节。
C. 参数为结构或类。Sizeof应用在类和结构的处理情况是相同的。但有两点需要注意,
第一、结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与结构或者类的实例地址无关。
第二、没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存中都有唯一的地址。
下面举例说明,
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s为一个指针。
Class test1{ };//sizeof(test1)=1;
D. 参数为其他。下面举例说明。
int func(char s[5]);
{
cout<
//数的参数在传递的时候系统处理为一个指针,所
//以sizeof(s)实际上为求指针的大小。
return 1;
}
sizeof(func(“1234”))=4//因为func的返回类型为int,所以相当于
//求sizeof(int).
以上为sizeof的基本用法,在实际的使用中要注意分析VC的分配变量的分配策略,这样的话可以避免一些错误。
- 作者: freejustin 2006年11月15日, 星期三 16:28 回复(0) | 引用(0) 加入博采
来源:台湾《e天下杂志》 作者:蔡耀骏
这个夏天,科技再度回到热门话题焦点。其中最热门的关键词,就是Google。
如果没有Google,那斯达克(NASDAQ)没有让人再度血脉喷张的兴奋剂。Yahoo!、eBay、Amazon股价长期滞留在30~50美元,感受不到一点生气。然而,Google去年一挂牌,股价就从85美元,一路飙破300美元,上市一年就大涨3倍,市值估计超过800亿美元,超越全球媒体巨人时代华纳(Time Warner),直逼百年老牌可口可乐。
如果没有Google,可能不会看到Yahoo!今天紧张地重拾荒废已久的武功。根据媒体观察机构TNS Media Intelligence统计,Yahoo!今年前4个月砸下1,400万美元行销经费,想要再度擦亮搜寻服务的招牌。今年8月,Yahoo!对外宣称搜寻网页文件与影像总数超过200亿则,比Google多将近1倍。
如果没有Google,很难看到谁也无法撼动的微软帝国急得跳脚。今年7月,Google宣布延揽44岁的微软副总裁李开复担任Google中国区总裁,微软立即向美国法院控告Google和李开复违反竞业条款。李开复被称为是比尔盖兹的重要幕僚,也是微软有史以来位阶最高的华人,他转述盖兹对他的谈话:「我们必须提出告诉,才能阻止Google继续挖角。」最后美国法院裁定暂时禁止李开复到Google任职。
在意想不到的地方创新
Google,绝对是近年最能够挑动大家神经的科技公司。它源源不绝的创新力量,一次又一次让全世界一次次睁大眼睛注目着它。
Google让搜寻成为生活中最流行的答案,也让搜寻成为改变世界的超级力量。从学术论文到电视影片、地上的市街、天上的月球,Google无所不搜。如今,Google已经能搜寻81亿个网页,每个月还推出1~2项新搜寻服务。创新速度之快,连美国《商业周刊》(BusinessWeek)都将Google名列「全球最创新企业」前20名。
现在只要进入Google Earth,键入你家地址,就能马上「飞」到天上,从卫星空照图看到住家的3D影像。在Google之前,谁想象得到呢?
Google不仅在需要之处创新,也爱在大家意想不到的地方,极度创新,甚至挑战尺度极限。
在今年2月的法说会上,Google请出CFO。只是此CFO绝非一般法说会上惯见的财务长,而是Google专属的Chief Food Officer(主厨长),向到场法人畅谈Google闻名硅谷的员工餐厅菜色。
「Google不是家传统的公司,」今年32岁的Google创办人赖瑞o佩吉(Larry Page)指出,「我们也不打算变成那样9佩吉与他的创业伙伴布尔(Sergey Brin)就是要独树一格,让企业和学者丢开管理教科书,重新思考属于网络时代的经营哲学。
「Google就像是个新物种,也是新典范,」同样经历网络产业发展的新浪网华东区和台湾区总经理蒋显斌,一语点出Google让人爱、让人怕、让人妒嫉、又让人期待的混合魅力。「当网络科技发展10年,已成熟到变不出新花样时,Google的创新,让大家觉得网络世界好象又再年轻一次。」
直捣Google总部
顺着硅谷愈往南走,阳光愈烈,让位于硅谷南缘的山景城(Mountainview)格外亮眼。这也就是Google总部的所在地,硅谷新的朝圣点。
走进Google大厅,立刻感到熟悉。原来,Google把你我都用过、从全球各地发出的搜寻字符串,同步投影在入口墙上。每天在这个屏幕上会即出现超过5.5亿个、来自100种以上语言的搜寻字符串。
每位进入Google的访客,都要先在柜台计算机前自行登录姓名,等打印机印出访客证贴纸。接待小姐一面把印好的访客证交给访客,一面把访客用完的贴纸顺手一贴,「没几天就能贴成这样,」接待小姐把玩着手上将近排球大小的贴纸球,全是用一张张访客证贴纸贴出来的,证明了Google的超级人气。现在不管是求职的、谈生意的、就连过去认为网络广告微不足道的纽约麦迪逊大道的广告公司,都选择直达Google总部。
成立不过7年的Google,成为大家竞相拜访的的新目标,因为它重写了网络产业的游戏规则,开创了新的获利模式。
在美国,Google不仅已占有将近50%的搜寻引擎市场,在付费搜寻广告上的营收和获利更是每季屡创新高,雄踞所有搜寻网站之冠。
但是,Google的生意经却不同于一般入口网站强留使用者在自家网站上,而是导引更多流量到合作网站上。根据市调机构Neilsen/NetRating统计,平均每位网络使用者每个月平均会花近3个小时在Yahoo!网站上,但是停留在Google的时间,仅仅只有30分钟。
Google不仅组织全世界的信息,让信息人人可得,它的广告模式,也让广告人人负担得起。目前Google在全球就拥有超过15万个赞助广告商,其中有许多是中小企业。根据Google自家的数据指出,这些平凡无奇、还与搜寻结果分开表列的文字广告,点击率却是其它网站横幅广告的4~5倍。此外,使用者每点选一次广告,企业才需要付0.05美元给Google,对于广告经费有限的中小企业相对划算。
二手硬件组成超级计算机
事实上,Google并不是史上第一个搜寻引擎,也不是发明搜寻广告的公司。但是后发者照样可以是赢家,Google就是能够在既有基础上,创造出令人意想不到的成绩。
Google位在硅谷山景城总部的Googleplex,非常Google。几座建筑物间的大草坪上,撑着象征Google代表色的洋伞,中午时间,这些五彩伞下都是出来吃午餐的Google人,不知道的人还以为走进了园游会。
几年前,这里还是绘图芯片大厂视算科技(Silicon Graphics,SGI)的总部,巧合的是,从微软跳槽过来的李开复,之前也曾担任过SGI副总裁和总经理。
Google进驻后全面接收,但是融入自己的坚持--环保。办公室内所有的木质地板、门板刷上的油漆,都是环保无毒,方便员工随时分组工作的帐篷式办公室,也同样是用无毒环保材质。
一进入偌大的环保办公空间,出现着一个液晶屏幕,屏幕上的地球不断旋转、随时冒出光束。原来,只要世界哪个地方使用Google搜寻,就会在该地发出光束。每道光束后面,都倚赖着强大的技术和运算能力。但是你绝对想不到,如今能储存全世界80亿网页影像,和处理每天超过5.5亿次搜寻需求的运算主机,竟然是二手货。
在距离Google总部不到10分钟车程的「计算机历史博物馆」中,还保存着Google早期使用的伺服主机。这伺服主机不仅完全不华丽,根本就是四处搜来别人淘汰的硬件、再自己组装而成的克难主机,总共80块主机板加硬盘,就像乐高积木一样以每层4块堆成,每层底下就只有薄薄一块木板支撑着,有些甚至已经承受不住重量,呈现弯曲变形。
直到今日,Google还是用这种快要报废的二手硬件来组成上万台服务器,但是其串连起来的运算效能,却是世上最快计算机「地球仿真器」的3倍,同时也是全世界最大的超级计算机。
「宠爱」人才
Google知道强大的运算能力是技术关键,但是它更清楚,寿命有限的硬件并不重要,可随时汰换;人才,才是他们最大的资产。如今,Google拥有超过4,000名员工,每人平均贡献产值高达105万美元(约合新台币3,360万元)。
Google就像所有硅谷创业家传奇,一切由人开始,而且对于人才极尽服务、甚至宠爱之能。
走进Google,很难觉得是走进一家企业。不管是在哪一栋办公室,每走20步、每过个转角,就会看到食物。这里有20个零食间,24小时供应各式各样的糖果、饼干,还有在超市一瓶要价超过新台币100元的「Naked juice」100%纯果汁。而这一切,都免费。
Google也有硅谷最出名的五星级「免费吃到饱」餐厅。这个由Google前CFO(主厨长)查理-艾尔斯(Charlie Ayers)一手打造的Charlie's Cafe,里面就有85位厨师和助理,提供85%都是有机食材做成的有机饮食。
我们仰赖Google解答大小问题,Google则负责解决员工的一切困扰、辛苦,甚至是欲望,让他们竭尽创意,服务每个上网者的渴望。
Google有沙滩排球尝游泳池、健身房,还有全身按摩服务;他们提供托婴、牙医、甚至医师看诊;Google有洗衣间,欢迎员工把脏衣服带来洗;Google还摆有钢琴,任何人、任何时间都可以演出自己的另一面。
更重要的,Google给Google人现代企业中最难得的员工福利:时间、自由、与尊重。
创意之前,人人平等
Google一直坚持扁平组织型态。不管来头多大、多聪明,大部份工程师名片上的职称都只挂「工程师」,显示每个人在创意上的平等。「这种组织型态能让我们保持独特的企业文化,并吸引更多流着Google血液的天才,」佩吉说。
而且,Google很清楚这些天才爱怎么工作。
在Google工程师办公空间中,没有隔间屏风,取而代之的是一个个白壁红顶、看似现代蒙古包的帐篷。这种帐篷式办公室可以随拆随搭,正符合Google一直都以2~3位工程师随项目编组的小团队模式,开发新产品。「如果到史丹佛大学的计算机研究室,会发现一个办公室内只容纳2~4个人,跟我们很像,因为我们过去就是从那里出身,我们知道那是很有生产力的环境,」Google执行长施密特说。
Googlers除了能带宠物来上班,还享有20%的工作时间来养自己感兴趣的「宠物计画」(pet project),也就是工程师每周有一天,可以为自己最狂野的梦想付出。不少Google最受欢迎的产品,像是G-mail、Google News等,都是由宠物计画中诞生的创新。
现在,Google News已是全球排名第14的新闻网站,每天有超过700万人次在上面查询新闻信息,比CBS、BBC等专业新闻网站的浏览人次还要多。Google让工程师站在Google的大舞台上,看到自己的狂想,真的改变了世界,这才是创新者最大的成就与满足。
「Google有一种平等、自由的文化,每个人都能发出自己的声音,」意图跳槽Google的李开复说,他看到Google有在微软看不到的创新活力,「哪怕想法还没有成熟的商业模式,还是可以去尝试。」
在自信与谦卑之间
如果分析Google创新真正的不同,就是它对于技术的高度信心,与对于使用需求与创意有限的谦卑。
Google内部超过有1000位计算机博士(占全体员工的1/4),更到处可见史丹佛、柏克莱大学等名校毕业的MBA。但他们并没有把卓越极致摆在产品设计的第一位,而是让市场协助他们精进。
进入Google网站,会发现许多服务都还挂着beta版的字样。工程师只要完成产品原型,大家也觉得够有趣,很快就会把beta产品推上线,让全球一起试用,了解大家的反应与需求之后,再继续改进。
这种方式加快了Google推出新产品的速度与攻占的领域,从文字、影像、地图、语音、甚至月球,好象没有任何事物可以让Google减速。这让许多人眼睛一亮,但也开始让人感到恐惧。
Google从去年开始展开的Google Library数字图书馆计画,就让许多人认为始终坚持「不要为恶」(Don't be evil)的Google,开始露出不同的面貌。
2004年底,Google宣布与牛津和哈佛大学等五大图书馆合作,预计投入2亿美元,用10年的时间将45亿页的藏书全部数字化。然而,这个计画让欧洲19个国家图书馆发出连署反对,担心Google以美国图书为重点将让网络世界被英美文化所主宰。同时,美国当地出版社协会也担心,此项计画将侵犯到书籍的著作权。强大的反对声浪,让Google在日前不得不宣布暂停。
中午过后,Google的五星级餐厅打烊,但又看到工人搬进了音响、气球、电子琴,想见另一场party不远了。在创新的年代,大家还是希望,Google永远是今天创新无惧、活力无限的硅谷小镇男孩,不媚俗也不世俗,而且创新不老。
- 作者: freejustin 2006年11月15日, 星期三 08:23 回复(0) | 引用(0) 加入博采
野菜类:野蕨菜 银笋丝 山竹笋 金针菜 香椿 龙筋菜等
鱼 类:土家腊鱼 野生金鞭溪鱼 火炕鱼 土家柴火鱼 茅岩河鱼
药材类:天麻 何首乌等
野味类:野.猪 野兔 土家腊羊肉 天门牛肉 飞雕狸 竹根猪
小吃类:葛根条 猕猴桃 葛根糖 土家炒米 各种口味梅子 葛根片 芝麻棒糖等
糕点类:葛根糕 蕨根糕 莲子糕 猕猴桃糕 百合糕 湘连糕 板栗糕 桂花糕 各种组合糕等
葛粉类:野生葛粉 纯野葛粉
野生葛粉类:野生老野葛 降火纯葛粉 野生老柴葛 野生葛根王 葛王 中老年益寿葛粉 葛中王精粉 少儿营养葛粉 妇女养颜葛粉 纯葛 野生青葛王 女人葛根粉
蕨粉类:野生老蕨粉 纯野蕨粉降脂蕨根粉 蕨神 野蕨王 蕨晶首乌粉 野生苦荞粉
茶叶类:杜仲茶 茅岩莓茶 高山云雾茶 高山毛尖 兰贵人 人生乌龙茶 苦丁茶 苦瓜露等
礼品套装:野生葛根粉 野生蕨根粉 高山毛尖 兰贵人 人生乌龙茶
张家界四珍:葛 粉 蕨 粉 莓茶 岩 耳
张家界三宝(三绝):葛粉(野生) 蕨粉(野生) 岩耳
酒 类(竹筒酒):毕兹卡圣酒 纯米酒 张家界毛谷烧 葛根王酒 百根冰酒 湘酒王 惊梦王 灯笼果酒 鬼谷酒秦简酒 索溪 野百合 湘莲子 竹叶青 土家人 天子山 湘西红 土家醇
穿山甲---又名钻山甲,属家二级保护动物,因擅长钻山打洞而得名。它身长约50厘米左右,遍身是鳞甲披挂,舌长、爪利、腿小、眼小,以蚂蚁为食,其食蚂蚁的方法有三种,一把舌头伸到地上,让蚂蚁爬到舌头之上,然后吞食;二是把鳞甲张开,让蚂蚁爬到甲壳内,然后往水中一钻,蚂蚁浮出水面,之后添食一只不剩;三是打穴,捣毁蚁巢,连锅端起一齐吃下,所以它有“森林卫士”之美称。
娃娃鱼---娃娃鱼又名大倪,两栖,是国家二级保护动物,大的体长达1.8米,数十公斤以上,小的也有几公斤,其叫声酷似婴儿的声音。一般生活在具有凉性,阴暗,清澈的河水中,以鱼、虾、蟹、蛇、以及昆虫为食,但由于娃娃鱼新陈代谢缓慢,在无食物的情况下,就是一两年不吃食物也不会饿死。
黑熊---分布于天子山、宝峰山、杨家寨等深山老林。体毛坚硬而粗,富光泽,胸毛具白色月牙花斑。体高1.8米左右。体重达200公斤,富含脂肪。性喜深山密林之中,居洞穴。孤独、倔强、胆大,敢与虎斗。外看笨拙,但行动灵活。全掌着地行走,掌肉发达落地无声,会爬树,善游泳,可急流横渡。白天于地面或树上活动。以果实、青草和嫩芽为食;有时偷吃瓜果、蔬菜、玉米等,亦食蠕虫、甲虫、蚂蚁、鸟和鸟蛋;喜食蜂蜜,有时连蜂巢一并吞食,被蜂螫得嗷嗷大叫亦不改性。平时不主动伤人,但在交配期和产仔期异常凶猛。
银杏---银杏因其生长缓慢故又名公孙树,是裸子植物银杏科中的成员,在武陵源多分布于海拔1000米以下的地带,为数不多,但它能成大材,目前我国各地也已有培植,但数量不多,产量也很少,所以,银杏它是我国特有的珍贵大树种
相思鸟---相思鸟的体态轻盈,羽毛华丽,色彩斑斓,嘴角鲜红。爱在自然风光优美的地方生活,武陵源当然成了它们聚集的乐园。相思鸟最大的特点是忠一不二,它们成天出双入对,在林间飞舞,歌唱,有乐同享,有苦同受,假如一只受伤,另一只会悲痛万分,连歌也不唱,若是有一只被人逮走,另一只也会跟踪前往“自投罗网”甘心情愿的双双死在一起。所以相思鸟的这种习性一直被人们视作为爱情的象征。
张家界名茶---勤劳智慧的张家界人民,在认识自然、改造自然、利用自然、向大自然索取的长 期实践中,积累了丰富的茶业经验,创造了一糸列优质名茶。其中不少产品已驰名中外,成为中国乃至 世界名产,如“青岩茗翠”和“龙虾花茶”就早已香飘四海、誉满天下。其他如“云雾仙品”、“甑山银毫”、“五雷月眉”、“茅坪毛尖”、“西莲贡茶”等,也都很有名气,堪称上品。
青岩茗翠---是全国名茶之一,因产于风景明珠张家界国家森林公园的表岩而弛名中外, 故名青岩茗翠。一九八三年五月,青岩茗翠参加省“五名”评活动,被评为优质名茶,荣获金杯奖。一九 八八年十月,参加北京全国首届食品博览会评选,荣获国家银质奖。 青岩茗翠茶场,在海拔四百五十米和九百米之间,山峦重叠,常年多雾,气候温和,土质肥沃,适宜 茶叶生长。 从清明到谷雨开始采摘鲜叶,标准为一芽一叶或一芽二叶初展。制作工艺分杀青、初揉、复炒、初烘、 整形、摊晾、干燥等八道工序。其品质特点,外形条索紧结、肥硕、浑圆、较曲,银毫满披,色泽翠绿。 冲泡后液色嫩绿明澈,叶底鲜活匀整,清香馥郁持久,滋味鲜醇回甘。饮之香留舌底,回绕九肠。本品用 皮纸包好,放置专装茶叶的木箱内密封保存;或放在石灰缺勤 保存,确保色鲜味美。著名画家黄永玉曾赞誉为“桂林山水甲天下,张家界风景胜桂林,青岩茗翠飘 四海”。
龙虾花茶---产于张家界永定区境内的一碗水、三岔、黄坡等茶场,是全国名茶之一,其 形状类似龙虾花茶。 龙虾花茶生长在海拔四百五十米至一千米的山腰,四周群山环抱,云雾缭绕,土壤肥沃,具有生产 名茶的优越条件。 龙虾花茶非常讲究原料和制作工艺,在清明谷雨之间,采摘一芽一叶初展的完整芽叶,经过杀青、 揉捻、整形、提毫、烘焙、拣剔六道工序精制。造型独特,外形扁曲成龙虾状,银毫满枝,色泽翠绿。 冲泡后,茶条彼起此伏。似龙虾戏水。其内质芬芳馥郁,茶液碧绿明净,滋味甘爽醇美,叶底嫩绿光洁。 饮之芳香留舌,醒脑爽身。 龙虾花茶自一九八一年问世以来,连续多年被评为湘西自治州.湖南省优质产品之一,获省名优产品 证书。一九八四年被评为湖南省茶叶优质产品第一名。一九八五年参加全国名茶展评,评选为全国十六个 优质名茶之一,荣获农牧渔业部优质产品名茶金杯奖。一九八八年五月,在湖南省评选“五名”活动中, 荣获名茶金杯奖。一九八八年十月,在北京参加全国首届食品博览会评选,荣获国家银质奖。本品在包装 上采用银灰色硬壳盒小包装,图案设计古朴大方,别具一格,在全国包装评选取会上,荣获优质包装奖。 龙虾花茶畅销国内外,深受顾客欢迎。张家界市内各宾馆推为高级宴会名茶,著名作家沈从文曾题词 赞曰:“品尝龙虾茶,芳香冠天下。嘉宾感喜悦,人民乐作华。”一九八八年十月,北京市农林科学院院 长.高级农艺师董克勤来张对龙虾花茶给予了高度评价:“龙虾味芬芳,醇甘绕九肠;‘龙虾’胜‘龙井’, 后来者居上。”
茅坪毛尖---相传茅坪毛尖茶,始于明朝天启年间(公元一六二0年),武昌王五王子朱如烩, 避魏忠贤擅权煽乱之变,隐居湖南南岳拜南岳飞华寺天岳和尚为师,埋名削发为僧。后因时局动荡频繁, 辗转来到市茅坪上首,建庵居住今大悲庵,取法名为“恒性”,并于大悲庵两侧种植茶叶树,精心培育成 一片枝茂叶青的茶叶林,最后 细摘精制,生产出清香扑鼻,味醇色美,饮后醒脑爽性,润肺提神的上等茶叶,人称茅坪毛尖。一九八 二年五月,在名茶评审会上,湖南农学院著名的茶叶专家陆松侯教授在观看品尝了大庸茅坪毛尖之后评价说: “茅坪毛尖属毛峰型特优绿茶,条索苗秀,满披白毫,色泽翠绿润亮”。不久,茅坪毛尖打进了国际市场, 远销新家坡、西德等国家。
杜仲---属杜仲科落叶乔木,喜光,适应性强,皮为贵重药材。用它可强筋骨、补肝肾、益腰膝、除酸痛,还能降血压。《神农本草经》《本草纲目》都记载了杜仲的药效。在张家界市的慈利县拥有全国第二大的杜仲林生产基地,栽培面积八千多亩。采用杜仲为原料生产的杜仲茶、杜仲酒、等系列产品运销国内外深得人们所爱。
葛粉---是从藤本植物葛根中提取出来的一种纯天然营养佳品,它具有清热解毒、生津止渴、补肾健脾、益胃安神、清心明目、润肠道便及醒酒等功能。临床表明,对防止动脉硬化和降血压、抗老、治冠心病、健美皮肤、增加脑及冠状血管血流量、增强记忆力、提高儿童智商等有极其重要的作用。
中国鸽子花---书名珙桐,又名空桐。是我国特有的单科种的古老,孑遗的珍贵树种,属珙桐科珙桐属, 为落叶乔木,胸径一般为50厘米,高十五米至三十米。其木材为浅黄色,结构均匀,轻软,是制作仪器、乐器,家具的好材料。“物以稀为贵”。珙桐这一珍贵树种,在世界稀有,引起很多专家学者的重视。他们不畏艰险,远涉重洋,来我国实地考察,引进苗木,进行栽培并获得成功。一 九七五年,国家规定珙桐为国家一类保护树种。
龟纹彩石---在天子山顶一带,有种石头其纹路恰似乌龟纹,当地人称“龟岩”,这里的工匠们以它为原料进行手工雕琢.镂刻成石龟、石牛、石马、石龙、石香炉、石砚等工艺品,其形态之逼真、艺术之精湛、栩栩如生,深得游客的喜爱。现不仅在本地区销售,而且还远销日本、台湾、香港、以及东南亚一带国家。
土家织锦---土家族又名“西蓝卡谱”,是用一种古老的“木腰机”为机器,以棉纱为经、以五彩丝线或棉线为纬,完全用手工做成的工艺美术品。它色彩鲜明、跳跃、
对比强烈、线条对称。其品种有:壁挂、香袋、服饰、旅游袋 、沙发套、坐垫、室内装饰等多种,上面一般都表现的有山水、人物、树木、花卉、飞禽走兽等,形象十分逼真。
密桔---盛产于武陵源索溪两岸和武陵源邻近的九溪、江桠一带,成熟季节在9-10份,大的重达400克,含糖适中,清甜爽口。溇溪渡至索溪口,公路 两侧,连绵数十里,时断时续,散布着大片的桔林。春花秋实,给旅游者增添了不少游兴。武陵源区为满足游客的需要,近年来不断扩大种植,且精心管理,产量成倍增加,并不断改进保管方法,直到次年春夏,尚有源源不断的密桔上市。
岩耳--- 又名石耳,生长在张家界的绝壁之上,岩耳是岩石的苔衣,体呈叶状,背面大都为灰色或黄褐色,它营养丰富,并有消炎滋补的特殊功能,既是食品,又是药品,《本草纲目》记载:“石耳气味益精。” 岩耳为张家界山珍,它不仅是山民餐桌上的上等菜,而且是国宴的佳肴。由于岩耳得来不易,连那些长住名山宝刹的和尚,都把它当作佛家珍物,如果偶然得到岩耳,便“宝而藏之”,用来馈赠教友和亲朋。吃岩耳必须得法,先将干岩耳放在30-70℃的温水中浸泡七八个小时,等岩耳舒展以后,再用淘米水轻轻揉搓,将沙与灰尘洗净,再滤干食用。岩耳炖鸡汤,其味鲜美,但必须等鸡肉基本炖熟以后,再放入岩耳,切忌同鸡肉一起炒炖。岩耳炖排骨与猪蹄,也是上品,做法同上。您来到张家界欣赏风光秀丽的山水,一饱眼福;再喝上一碗好客的主人用白沙泉水熬制的香味浓郁的岩耳鸡汤,又可一享口福。
土家粘贴画---一种粘贴在三夹板上的画,其画做工之独特,艺术性之高,都堪一绝。作此画一不用纸、二不用油彩、三不用毛笔、也不用墨汁。原料却是沙石、树皮、芭茅杆、竹笋壳、或碎布片。用此材料作画所表现的武陵山水风光、湘西的古寨风情,栩栩如生 ,即有山水的效果,又有国画的神韵,因此它一被推出便引起轰动,受到国内外众人所注。如今此画已获国家专利。在99昆明世博园湖南馆就有张家界民间粘贴画大师李军深的作品,深得中外游人称赞
土家人主食以苞谷、大米、高梁、红薯、杂豆、洋芋为主。加工花样颇多,吃法也银讲究。菜肴讲究酸、辣、香味。这是土家饮食的又一大特点。"辣、酸、香三字,土家妇女做出了许多妙文章。腌制泡辣子,吃起来又辣又麻,别有滋味。酸辣子,既可油煎,又是上等佐料。糯米酸辣子、苞谷酸辣子,可算是土家族妇女的绝技。秋冬后,每家都要制作几坛各种辣品,以备冰封时节、农忙时节、蔬菜淡季吃。夏天,天气炎热,不宜吃荤腥,鱼、猪肉又易腐,拌上糯米粉子,腌制成酸鱼肉,既不油腻、腥臭。又防腐、上口,是招待宾客的佳品。合渣也是土家极喜欢的菜肴。 以黄豆粉掺青菜叶温火煮,味美易咽,营养丰富。豪饮品茗, 也是土家人的一大嗜好。饮洒煮洒,由来已久,古代巴入就已豪饮成习,这些传统土家人继承下来。土家酿洒工艺精道且种类繁多,如五谷杂粮洒,葛根洒、药材洒、可酿洒。饮洒亦有讲究,明清时期,土家族有特殊饮洒习俗,谓之"咂洒"。据传"咂洒"始于明代土兵按时奔赴 抗倭前线,将洒坛置于道旁,内插竹管,每过一人咂洒一口,以此传习成俗。
茶,是土家族生活必需品。孙云梦记九,永风俗:"人啜茗粥,著山屐。"茶,有凉水甜洒茶,凉水蜂蜜茶、糊米茶、姜汤茶、锅巴茶、绿茶、灯笼果茶、老叶茶、茶果茶,还有炒米茶、蛋茶等等。凡来人、来客、主妇必视其对象筛茶,层次级别颇有讲究。常客筛一般茶,贵客筛蛋茶、甜洒茶。夏天,天热口渴,山民用葫芦,竹筒提来沁凉清冽山泉,冲糯米、高梁甜洒,连洒糟一起喝。土家族喜养蜂,蜂蜜为居家珍藏,客来茶中加放蜂蜜,这是客人的口福。冬天,喜喝熬茶。茶用大瓦罐置火坑间熬煮,常年不离,是土家火坑中的"不倒翁"。熬茶多用老茶叶或茶果,汤色深红,香气扑鼻。糊米茶是将米炒成焦块,用布扎紧,放至开水中,待冷却后喝,有止渴解暑之功能。"住山靠山,靠山吃山。"这是土家族生活经验之谈。清代土家族诗人彭勇行曾作"竹枝词":三月出蕨初茁芽, 枞林九月菌生桠,秋岭红熟累累果,玉湎狸肥味更佳。
胡葱、椿芽、蕨笋、葛粉、枞菌、野木耳、炖肉煮汤鲜美至极。若用油烹炸,谓;菌油",香纯味鲜。武陵山里多野蜂,巢于树洞土窟之中。蜂卵化取卵蛹,油炸酥脆,堪称土菜一绝。过年馔肴,风味独特,尤其讲究腌制腊野味。山民将野猪、鹿子、白面包湎卤腌缸中半月,取出挂于火炕烟熏火烤,作成宴宾上等佳肴。"血豆腐"即将豆腐合猪血,猪肉及花椒、辣椒等佐料拌成泥状,捋成卵形,以竹筛置火炕上,烟熏烤成腊黄,吃起来耐嚼味香,堪称佐酒上品,亦为土家特色菜。
"合菜"俗称"团年菜"。是土家族过年家家必制的民族菜。相传明嘉靖年间,土司出兵抗倭,为不误军机,士兵煮合菜提前过年。其制作是将萝卜、豆腐、白菜、火葱、猪肉、红辣椒条等合成一鼎锅熬煮,即合菜"。除味道佳美,还别有深意。它象征五谷丰登,合家团聚,又反映土家人不忘先民的光荣传统。
"社饭"是土家人每年二月"社日"必食的"佳节饭"。其作法是先于节日前上山扯来野葱、社菜,洗净剁碎,放于锅中焙于。煮饭时,先将肥腊肉炒香,铲出待用。煮饭时以三分糯米和一分粘米混煮,粘米半熟后方下糯米,然后将米汤滗净,放进社菜、胡葱和腊肉,搅拌均匀,阴火焖熟。揭开锅盖,香气盈室,其味妙不可言。
"猪血稀饭":每年三月是"白蒂天王"的生日。土家人杀猪祭祀。庙祝时煮"猪血稀饭"祭于神前。凡祭祀之人,都要分吃猪血稀饭一碗。此外,过年杀年猪祭祖,也煮猪血稀饭。寨子里逢人都可舀一碗吃。有远道来客,更要请一碗"猪血稀饭",甚至有相强之意。
白族饮食与土家族有相通之处,仍以苞谷、大米、高梁、红薯、洋芋及杂豆为食。他们喜吃酸冷辣味食品,亦喜喝茶嗜酒。凡贵宾上门,必筛一碗"三蛋茶"并待之以酒。白族人民喜制包苞谷酒、高梁酒。待客时大碗喝酒'大块吃肉,很有股豪气。白族尤以待客大方而为人称道。
- 作者: freejustin 2006年10月16日, 星期一 17:17 回复(1) | 引用(0) 加入博采
typedef struct _STRUCT_A_ STRUCT_A;
typedef struct _STRUCT_B_
{
STRUCT_A *pSTRUCT_A;
} STRUCT_B;
typedef struct _STRUCT_C_
{
STRUCT_A *pSTRUCT_A;
STRUCT_B *pSTRUCT_B;
} STRUCT_C;
typedef struct _STRUCT_A_
{
STRUCT_C *pSTRUCT_C;
STRUCT_B *pSTRUCT_B;
} STRUCT_A;
- 作者: freejustin 2006年09月25日, 星期一 14:08 回复(0) | 引用(0) 加入博采
- 作者: freejustin 2006年09月15日, 星期五 08:54 回复(0) | 引用(0) 加入博采
- 作者: freejustin 2006年09月15日, 星期五 08:53 回复(0) | 引用(0) 加入博采
投递者是一位计算机应届研究生。一看之下,差点没吓死,简直就是一个超人啊:
专业知识和技能
软件工程
牢固掌握软件工程专业的主要专业课程,包括软件工程、面向对象的系统分析和设计、软件测试、软件过程管理等软件工程核心课程。
操作系统
具备对操作系统相关高级理论和实践的专业知识和深入理解,对各种UNIX、Linux、Windows、Mach、Mac OS、OS/2、VMS/OpenVMS、S360/370以及多种嵌入式和实时操作系统的体系结构、底层机制和核心技术有广泛深入的研究和透彻的理解。在超过7年以上的时间中一直密切关注操作系统领域的最新进展。对操作系统理论和技术的发展史、现状以及未来发展趋势有着广博的知识和深刻而独到的见解。牢固掌握操作系统开发相关的技术细节,具备开发实际操作系统的能力和经验。
系统管理
具备8年以上的Windows操作系统在单机和服务器环境的使用和管理经验、7年以上的UNIX类操作系统在单机和服务器环境的使用和管理经验、2年以上的Web服务器管理经验和1年以上的数据库系统管理经验。
网络技术
牢固掌握种种网络相关技术,对TCP/IP网络的理论、体系结构和实现有深入透彻的理解,对常用的RFC标准和实现有深入的理解。具有4年以上的UNIX、Linux、Windows等操作系统平台上的网络应用开发经验。
数据库技术
牢固掌握关系型数据库和面向对象数据库的相关理论,对Oracle、DB2、SQL Server等主流数据库管理系统的体系结构和实现机制有较深入的理解。熟练掌握标准SQL语言。熟悉ODBC、JDBC、OLE DB、DAO、ADO、ADO.NET以及基于XML的数据库访问等数据库访问机制。具有2年以上的使用C/C++、Java、Visual Basic、PERL、Python等语言或开发工具开发数据库应用的经验。
企业级技术
对企业级应用的思想和技术要点有深入的理解,熟悉各种中间件技术,熟练掌握J2EE、Microsoft .NET、CORBA等企业级的开发技术。有一定的企业级应用的开发经验。
软件工程
对传统的结构化软件工程、面向对象的软件工程、软件工程的形式化方法、净室软件工程、设计模式、Extreme Programming、软件配置管理等软件工程思想和理论有深入透彻的理解。牢固掌握现代软件工程的各种规范。熟悉UML。熟练掌握Rational Rose等系统分析和设计工具。熟练掌握CVS、RCS等软件配置管理工具。熟练掌握Bugzilla等错误跟踪工具。具有2年以上的软件工程实践经验。对软件工业的历史、现状及未来发展趋势有广博的知识和深刻而独到的见解。
软件过程管理
对软件过程管理思想和理论有深入透彻的理解。对能力成熟度模型(CMM)和理论、内容和实践方法有牢固的掌握和深入的理解。对技术人员管理的思想和理论有深入的理解和独到的见解。
计算机科学
对计算理论、可计算性和难解性理论、组合逻辑理论有深入的理解.对算法设计和分析的理论和方法有深入透彻的理解.牢固掌握布尔代数和计算机逻辑电路的相关理论知识.对计算代数和计算几何的理论有初步的了解.
对现代计算机体系结构,特别是各种规模的并行计算、分布式计算体系结构、网格计算,以及诸如超长指令字、数据流等下一代体系结构的理论和实现机制有深入透彻的理解。具有在RISC和超长指令字体系结构上的开发经验。
对形式语言的语法和各种语义理论、程序设计语言各种范型的理论和实现机制有深入透彻的理解。精通编译器相关的理论和技术。具有对数十种程序设计语言的不同程度的了解和开发经验。对程序设计语言的历史、现状和未来发展趋势有广博的知识和深刻而独到的见解。
数学
对逻辑主义、形式主义、直觉主义、数理逻辑、公理集合论等数学基础思想和理论有深入的理解。熟悉现代代数理论和方法。 对现代数论的理论和方法有较深入的理解。对几何、拓扑学、组合数学等数学分支的现代理论和方法有较深入的理解。
密码学
系统的理解和掌握古典密码学和现代密码学的理论和技术。对加密算法、安全协议和密码分析的理论和方法有深入的研究。对各种重要的现代加密算法和安全协议在多种环境下的设计和实现有丰富的经验。熟悉PKI体系结构。
办公自动化
精通Microsoft Office系统办公自动化软件的高级应用和配置管理。熟练掌握使用Visual Basic for Application、COM/OLE/ActiveX等技术对Microsoft Office系列进行进一步的开发。了解使用Lotus Script对Lotus Notes的进一步开发技术。
平面设计
精通Adobe Illustrator、MacroMedia FreeHand、CorelDRAW等主流矢量绘图工具,Adobe Photoshop、Jasc Paintshop Pro、GIMP等主流图像处理工具,MetaCreation/Corel Painter等主流位图创作工具,以及Adobe InDesign、QuarkXpress、TeX/LaTeX、方正、Adobe PageMaker、Corel Ventura等主流的专业/商业排版软件。对PostScript、PDF、SVG、各种字体技术等电子出版业的核心技术有极深入的研究和丰富的开发经验。对印刷出版业的各种业务流程、行业规范和专业技术有专业水平的了解和 丰富的经验。在专业平面设计、排版领域有三年以上的实践经验。
三维动画设计
熟练掌握Alias|Wavefront Maya,能够进行专业水平的三维动画设计和制作。
程序设计语言
精通以下高级程序设计语言:
ANSI C,ANSI C++, Objective C, Java, C#, ISO Basic, Visual Basic, Visual Basic.NET, ISO Pascal/ISO 扩展Pascal, Object Pascal, ADA 83/ADA 95, Smalltalk 80, Modula/Modula-2/Modula-3,Haskell, VBScript, JavaScript/JScript, PERL, Python, AWK
熟悉以下高级程序设计语言:
PHP, FORTRAN 77/FORTRAN 90, Common LISP, Scheme, ML, APL
精通以下体系结构上的机器语言/汇编语言:
Intel 8086/8088, IA32/MMX/MMX2/SSE/SSE2, AMD64, 3DNow!/Enhanced 3DNow!, MIX, MMIX
熟悉以下体系结构上的机器语言/汇编语言:
POWER, Power PC
了解以下体系结构上的机器语言/汇编语言:
IA64, MIPS, Alpha, Sparc, ARM, 680x0, Transputer, IBM 7094, IBM 360/370
开发工具
Microsoft Windows Platform Software Development Kits
Microsoft Windows Driver Development Kits
Microsoft Visual Studio
Microsoft Visual Studio.NET
Borland C++
Borland C++ Builder
Borland JBuilder
Borland Together
Borland Delphi
Borland Kylix
GNU Compiler Collection(GCC)
GNU Binutils
GNU Debugger
GNU Emacs
VIM
GTK+
Qt
Anjuta
Glade
KDeveloper
QT Designer
Rational Rose
CVS
RCS