C、C++函数和类库详解(VC++版)(未完成)
整理者:高压锅
QQ:280604597
1 函数库
1.1 函数模板(未完成)
函数名称 |
xxx |
头文件 |
#include <xxx.h> #include <xxx.h> |
函数功能 |
函数主要功能说明。 |
函数声明 |
类型 函数名 ( 类型 参数1, 类型 参数2, …… ); |
函数参数 |
参数1:[输入|输出|输入&输出],参数说明。 参数2:[输入|输出|输入&输出],参数说明。 …… |
返回值 |
返回值1:返回值说明。 返回值2:返回值说明。 …… |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知,表示此函数多线程调用是否会产生影响 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是 或 否 或 未知,表示此函数是否是单一操作,不是多个步骤的组合 |
其他说明 |
…… …… |
1.2 内存
1.2.1 realloc
函数名称 |
realloc |
头文件 |
#include <stdlib.h> |
函数功能 |
根据一块已分配的旧内存,分配一块新内存替换旧内存,或者直接分配一块新内存。 |
函数声明 |
void * realloc (void * ptr, size_t size); |
函数参数 |
ptr:旧内存的指针,如果为NULL,表示直接分配一块新内存。 size:新内存的新大小,单位字节,如果为0,表示释放旧内存。如果新内存比旧内存大,再把旧内存的数据全部拷贝过来,新内存的指针与旧内存可能一样,也可能不一样,扩大的部分里的数据是未被初始化过的。如果新内存比旧内存小,就会把旧内存截断作为新内存,新内存的指针与旧内存一样,被截断的数据会丢失。如果新内存和旧内存一样大,将不做任何改动。 |
返回值 |
NULL:失败,旧内存的大小、指针和数据都不会改变。 其他:新内存的指针。 |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
其他说明 |
如果内存不再使用时,记得调用free()释放内存,防止内存泄露。 分配的内存是全局的,在整个进程内有效。 旧内存必须是先前通过malloc (), calloc (), 或realloc ()分配的。 |
1.2.2 malloc
函数名称 |
malloc |
头文件 |
#include <stdlib.h> |
函数功能 |
分配一块新内存。 |
函数声明 |
void * malloc (size_t size); |
函数参数 |
size:新内存的大小,单位字节。 |
返回值 |
NULL:失败。 其他:新内存的指针。 |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
其他说明 |
如果内存不再使用时,记得调用free()释放内存,防止内存泄露。 分配的内存是全局的,在整个进程内有效。 新内存里的数据是未被初始化过的。 |
1.2.3 calloc
函数名称 |
calloc |
头文件 |
#include <stdlib.h> |
函数功能 |
分配一块nmemb个子块长度为size的内存,子块与子块之间是连续的,等同于malloc(nmemb*size)。 |
函数声明 |
void * calloc (size_t nmemb, size_t size); |
函数参数 |
nmemb:多少个子块。 size:每个子块长度,单位字节。 |
返回值 |
NULL:失败。 其他:内存的指针。 |
线程安全 |
是 |
信号打断 |
否 |
其他说明 |
如果内存不再使用时,记得调用free()释放内存,防止内存泄露。 分配的内存是全局的,在整个进程内有效。 内存里的数据是未被初始化过的。 |
1.2.4 _msize
函数名称 |
_msize |
头文件 |
#include <malloc.h> |
函数功能 |
用于获取alloc()相关函数分配的内存的实际可用的长度,单位字节,此长度等于分配内存时指定的长度。 |
函数声明 |
size_t _msize ( void * ptr ); |
函数参数 |
ptr:[输入],alloc()相关函数分配的内存的指针,必须是有效指针,否则段错误。 |
返回值 |
正整数:分配内存的长度,单位字节。 -1:失败。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知,表示此函数多线程调用是否会产生影响 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是 或 否 或 未知,表示此函数是否是单一操作,不是多个步骤的组合 |
其他说明 |
|
1.3 shell命令
1.3.1 _popen(未完成)
函数名称 |
_popen |
头文件 |
#include <stdio.h> |
函数功能 |
另启动一个进程执行shell命令,并建立一条管道,可以将shell命令进程的标准输入或输出重定向到这条管道上,调用进程就可以通过这条管道读取shell命令进程的标准输出,也可以输出数据到标准输入。 |
函数声明 |
FILE * _popen ( const char * command, const char * mode ); |
函数参数 |
command:[输入],存放shell命令字符串的指针。例如:"dir /a"。 type:[输入],重定向方式,"r"表示重定向标准输出,"w"表示重定向标准输入,"t"表示文本模式,"b"表示二进制模式。 |
返回值 |
NULL:失败,并设置errno。 其他:管道文件的文件描述符。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知 |
其他说明 |
返回的这个文件指针,在使用完后必须用pclose()函数关闭。 shell命令的进程不会随调用进程的退出而退出。 |
1.3.2 system(未完成)
函数名称 |
system |
头文件 |
#include <stdlib.h> |
函数功能 |
执行一个shell命令,调用/bin/sh -c "shell命令"来另启动一个进程执行,命令执行完后此函数才返回。执行命令期间,SIGCHLD信号被锁定,SIGINT和SIGQUIT信号被忽略。 |
函数声明 |
int system (const char * command); |
函数参数 |
command:[输入],要执行的shell命令的字符串。 |
返回值 |
返回值1:返回值说明。 返回值2:返回值说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
其他说明 |
此函数在使用/bin/sh启动执行shell命令时,会丢掉调用进程的setuid和setgid位。 |
1.3.3 sleep
函数名称 |
sleep |
头文件 |
#include <unistd.h> |
函数功能 |
使当前线程暂停运行一段时间。 |
函数声明 |
unsigned int sleep (unsigned int seconds); |
函数参数 |
seconds:[输入],要暂停运行多少秒。 |
返回值 |
0:当前线程已经停止运行了指定的时间。 其他:剩余的时间(指定的时间减去实际暂停时间)。 |
线程安全 |
是 |
信号打断 |
是 |
其他说明 |
有些操作系统内核是使用pause()函数和alarm()函数实现的sleep()函数,一旦进程收到SIGALRM信号,所有进程的sleep()函数都会被打断,所以不推荐使用此函数,推荐使用select()函数或者poll()函数等。 |
1.4 文件
1.4.1 打开或创建文件
1.4.1.1 open(未完成)
函数名称 |
open |
头文件 |
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> |
函数功能 |
打开指定的文件,同时还可以创建文件。 |
函数声明 |
int open (const char * pathname, int flags); |
函数参数 |
pathname:[输入],要打开的文件的路径,可以是相对或绝对的路径。 flags:[输入],打开文件时使用的模式和权限。可以是(用"|"选择多个): O_RDONLY:以只读方式打开文件。 O_WRONLY:以只写方式打开文件。 O_RDWR:以可读写方式打开文件。 以上三种标记只能使用一个,以下的标记没有限制。 O_CREAT:如果使用此标记,表示如果要打开的文件不存在则创建并打开该文件,如果要打开的文件存在,则直接打开;如果不使用此标记,表示如果要打开的文件不存在,则立即返回失败并设置ENOENT错误码,如果要打开的文件存在,则直接打开。 O_EXCL:如果使用此标记,并使用O_CREAT标记,表示如果要打开的文件不存在,则创建并打开该文件,如果要打开的文件存在,则立即返回失败并设置EEXIST错误码。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。如果使用此标记,必须同时使用O_CREAT标记。此标记一般用于检测文件是否是本进程创建的。 O_NOCTTY:如果使用此标记,表示如果要打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。 O_TRUNC:如果使用此标记,并使用可写方式打开,表示把要打开的文件的长度清为0,而原来存于该文件的数据也会消失。 O_APPEND:如果使用此标记,表示每次写文件时都会从文件末尾开始,在NFS文件系统上,如果多个进程同时追加写入同一个文件时,有可能会导致写入结果错乱,因为在此文件系统上的追加功能不是原子操作;如果不使用此标记,表示每次写文件时从文件指针开始。 O_NONBLOCK:如果使用此标记,表示以非阻塞方式操作打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。 O_NDELAY:同O_NONBLOCK。 O_SYNC:以同步的方式打开文件。 O_NOFOLLOW:如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。 O_DIRECTORY:如果参数pathname 所指的文件并非为一目录,则会令打开文件失败。 此为Linux2.2以后特有的旗标,以避免一些系统安全问题。参数mode 则有下列数种组合,只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,因此该文件权限应该为(mode-umaks)。 S_IRWXU:00700 权限,表示该文件所有者具有可读、可写及可执行的权限。 S_IRUSR:00400权限,表示该文件所有者具有可读取的权限。 S_IWUSR:00200 权限,表示该文件所有者具有可写入的权限。 S_IXUSR:00100 权限,表示该文件所有者具有可执行的权限。 S_IRWXG:00070权限,表示该文件所有组具有可读、可写及可执行的权限。 S_IRGRP:00040 权限,表示该文件所有组具有可读的权限。 S_IWGRP:00020权限,表示该文件所有组具有可写入的权限。 S_IXGRP:00010 权限,表示该文件所有组具有可执行的权限。 S_IRWXO:00007权限,表示其他用户具有可读、可写及可执行的权限。 S_IROTH:00004 权限,表示其他用户具有可读的权限 S_IWOTH:00002权限,表示其他用户具有可写入的权限。 S_IXOTH:00001 权限,表示其他用户具有可执行的权限。 |
返回值 |
-1:失败,并设置errno错误码变量。 其他:被打开文件的文件描述符。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
其他说明 |
文件使用完毕后,必须调用close()函数关闭文件描述符。 |
1.4.1.2 fopen(未完成)
函数名称 |
fopen |
头文件 |
#include <stdio.h> |
函数功能 |
用缓存模式打开文件,同时还可以创建文件,当输出数据到文件时,会先输出到缓存,然后再输出到文件,可以加速输出操作。 |
函数声明 |
FILE * fopen ( const char * filename, const char * mode ); |
函数参数 |
filename:[输入],要打开的文件的路径加文件名,相对路径和绝对路径都可以。 mode:[输入],用什么方式文件。 |
返回值 |
返回值1:返回值说明。 返回值2:返回值说明。 …… |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
原子操作 |
是 或 否 或 未知 |
其他说明 |
…… …… |
1.4.2 读取文件
1.4.2.1 fread(未完成)
函数名称 |
fread |
头文件 |
#include <xxx.h> #include <xxx.h> |
函数功能 |
函数主要功能说明。 |
函数声明 |
类型 函数名 (类型 参数1, 类型 参数2, ……); |
函数参数 |
参数1:[输入|输出|输入&输出],参数说明。 参数2:[输入|输出|输入&输出],参数说明。 …… |
返回值 |
返回值1:返回值说明。 返回值2:返回值说明。 …… |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
其他说明 |
…… …… |
1.4.3 写入文件
1.4.3.1 fprintf(未完成)
函数名称 |
xxx |
头文件 |
#include <xxx.h> #include <xxx.h> |
函数功能 |
函数主要功能说明。 |
函数声明 |
类型 函数名 (类型 参数1, 类型 参数2, ……); |
函数参数 |
参数1:[输入|输出|输入&输出],参数说明。 参数2:[输入|输出|输入&输出],参数说明。 …… |
返回值 |
返回值1:返回值说明。 返回值2:返回值说明。 …… |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
其他说明 |
"\n"会被自动转换为"\r\n"。 |
1.4.3.2 fputs(未完成)
函数名称 |
fputs |
头文件 |
#include <stdio.h> |
函数功能 |
将字符串输出到文件。 |
函数声明 |
int fputs ( const char * str, FILE * stream ); |
函数参数 |
str:[输入],要输出的字符串的指针。 stream:[输入],被输出的文件描述符。 |
返回值 |
大于等于0:输出了多少个字节。 -1:失败。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是 |
其他说明 |
如果只输出字符串,不格式化输出时,fputs()函数效率比fprintf()函数效率高很多。 |
1.4.3.3 vprintf(未完成)
函数名称 |
xxx |
头文件 |
#include <xxx.h> #include <xxx.h> |
函数功能 |
函数主要功能说明。 |
函数声明 |
类型 函数名 (类型 参数1, 类型 参数2, ……); |
函数参数 |
参数1:[输入|输出|输入&输出],参数说明。 参数2:[输入|输出|输入&输出],参数说明。 …… |
返回值 |
返回值1:返回值说明。 返回值2:返回值说明。 …… |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
其他说明 |
…… …… |
1.4.4 标准输入、输出和出错
1.4.4.1 ungetc
函数名称 |
ungetc |
头文件 |
#include <stdio.h> |
函数功能 |
把一个字符退回到标准输入流中的第一个字符,下一次将读出此字符,不会将此字符写到文件中和设备上,只将字符退回到标准I/O库的流缓存区中,此字符不能被正在调用的输入流函数读出。 |
函数声明 |
int ungetc (int c, FILE * stream); |
函数参数 |
c:要退回的字符,只能是ASCII码的字符,值为0-255。 stream:输入流文件指针stdin。 |
返回值 |
EOF:失败。 其他:退回的字符c参数。 |
错误码 |
|
线程安全 |
未知 |
信号打断 |
未知 |
其他说明 |
|
1.4.4.2 printf(未完成)
函数名称 |
xxx |
头文件 |
#include <xxx.h> #include <xxx.h> |
函数功能 |
函数主要功能说明。 |
函数声明 |
类型 函数名 (类型 参数1, 类型 参数2, ……); |
函数参数 |
参数1:[输入|输出|输入&输出],参数说明。 参数2:[输入|输出|输入&输出],参数说明。 …… |
返回值 |
返回值1:返回值说明。 返回值2:返回值说明。 …… |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
其他说明 |
…… …… |
1.4.5 监测文件
1.4.5.1 select(未完成)
函数名称 |
select |
头文件 |
#include <sys/select.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> |
函数功能 |
阻塞检查一个或多个文件描述符是否处于可读或可写或异常的状态。文件描述符可以是磁盘文件的、套接字的等。 |
函数声明 |
int select (int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout); |
函数参数 |
参数1:[输入|输出|输入&输出],参数说明。 参数2:[输入|输出|输入&输出],参数说明。 …… |
返回值 |
返回值1:返回值说明。 返回值2:返回值说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
其他说明 |
fd_set fdR; FD_ZERO(fd_set *fdset):清空fdset与所有文件句柄的联系。 FD_SET(int fd, fd_set *fdset):建立文件句柄fd与fdset的联系。 FD_CLR(int fd, fd_set *fdset):清除文件句柄fd与fdset的联系。 FD_ISSET(int fd, fd_set *fdset):检查fdset联系的文件句柄fd是否可读写,当>0表示可读写。 第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止; 第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值; 第三,timeout的值大于0,这就是等待的超时时间,即select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。 |
1.4.5.2 poll
函数名称 |
poll |
头文件 |
#include <poll.h> |
函数功能 |
阻塞检查一个或多个文件描述符是否处于可读或可写或异常的状态。文件描述符可以是磁盘文件的、套接字的等,不能用于消息队列标识符。 |
函数声明 |
int poll (struct pollfd * fds, nfds_t nfds, int timeout); |
函数参数 |
fds:[输入&输出],struct pollfd结构类型的数组,存放需要检查哪些文件描述符的哪些状态,并输出经过检查后,这些文件描述符目前处于哪些状态。 nfds:[输入],表示fds结构体数组中的元素的总个数,可以为1或者大于1。如果为0,表示不检查任何文件描述符,直接等待最大阻塞时间。 timeout:[输入],最大阻塞时间,单位毫秒,为0表示不阻塞立即返回,为-1表示无限制阻塞。最大阻塞时间内,如果有文件描述符处于要检查的状态,此函数会立即返回有多少文件描述符处于要检查的状态,如果最大阻塞时间已到,还是没有文件描述符处于要检查的状态,此函数也会立即返回0。 |
返回值 |
正整数:有多少文件描述符处于要检查的状态。 0:无文件描述符处于要检查的状态。 -1:失败,并设置errno错误码变量。 |
线程安全 |
是 |
信号打断 |
是 |
其他说明 |
有的操作系统里timeout参数可是使用INFTIM宏,这个宏其实就是-1。 |
1.4.6 删除文件
1.4.6.1 DeleteFile(未完成)
函数名称 |
DeleteFile |
头文件 |
#include < windows.h> |
函数功能 |
删除指定的文件。 |
函数声明 |
类型 函数名 ( 类型 参数1, 类型 参数2, …… ); |
函数参数 |
参数1:[输入|输出|输入&输出],参数说明。 参数2:[输入|输出|输入&输出],参数说明。 …… |
返回值 |
返回值1:返回值说明。 返回值2:返回值说明。 …… |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知,表示此函数多线程调用是否会产生影响 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是 或 否 或 未知,表示此函数是否是单一操作,不是多个步骤的组合 |
其他说明 |
…… …… |
1.4.7 路径字符串
1.4.7.1 路径截断与合并
1.4.7.1.1 PathFindFileName
函数名称 |
PathFindFileName |
头文件 |
#include <atlpath.h> |
函数功能 |
获取路径字符串里的文件名子串的起始指针。 |
函数声明 |
char * PathFindFileName ( const char * pPath ); |
函数参数 |
pPath:[输入],路径字符串。 |
返回值 |
文件名子串的起始指针 |
错误码 |
无 |
线程安全 |
是 |
信号打断 |
否 |
原子操作 |
是 |
其他说明 |
示例: 路径字符串:"c:\path\file" 文件名子串:"file"
路径字符串:"c:\path" 文件名子串:"path"
路径字符串:"c:\path\" 文件名子串:"path\"
路径字符串:"c:\" 文件名子串:"c:\"
路径字符串:"c:" 文件名子串:"c:"
路径字符串:"path" 文件名子串:"path"
路径字符串:"" 文件名子串:"" |
1.4.7.1.2 PathFindExtension
函数名称 |
PathFindExtension |
头文件 |
#include <atlpath.h> |
函数功能 |
获取路径字符串里的文件的扩展名子串的起始指针。如果扩展名出现空格,将返回失败。 |
函数声明 |
char * PathFindExtension ( const char * pPath ); |
函数参数 |
pPath:[输入],路径字符串的内存指针。 |
返回值 |
文件扩展名前的‘.‘字符指针:成功。 路径字符串的‘\0‘字符指针:失败。 |
错误码 |
无 |
线程安全 |
是 |
信号打断 |
否 |
原子操作 |
是 |
其他说明 |
一个正确的文件扩展名不能出现空格。
示例: 路径字符串:"abc.txt" 扩展名子串:".txt"
路径字符串:"abc.txt " 扩展名子串:""
路径字符串:"abc." 扩展名子串:"."
路径字符串:"abc" 扩展名子串:"" |
GetModuleFileName 得到模块路径名
PathRemoveArgs 去除路径的参数
PathRemoveBackslash 去除路径最后的反斜杠“\”
PathAddBackslash 在路径最后加上反斜杠“\”
PathRemoveBlanks 去除路径前后的空格
PathAddExtension 在文件路径后面加上扩展名
PathRemoveExtension 去除文件路径扩展名
PathRenameExtension 更改文件路径扩展名
PathRemoveFileSpec 去除文件名,得到目录
PathUnquoteSpaces 去除路径中的首尾空格
PathQuoteSpaces 判断路径中是否有空格,有的话,就是用“”引号把整个路径包含起来
PathAppend 将一个路径追加到另一个路径后面
PathCombine 合并两个路径
PathSkipRoot 去掉路径中的磁盘符或UNC部分。
PathStripPath 去掉路径中的目录部分,得到文件名。
PathStripToRoot 去掉路径的文件部分,得到根目录。
PathCompactPath 根据像素值生成符合长度的路径。
如原始路径: C:\path1\path2\sample.txt
根据120像素截断后为: C:\pat...\sample.txt
根据25像素截断后为: ...\sample.txt
PathCompactPathEx 根据字符个数来生成符合长度的路径。
PathSetDlgItemPath 将路径数据设置到对话框的子控件上。
PathUndecorate 去除路径中的修饰——具体还没看明白,MSDN的例子只是去掉了括号。
PathUnExpandEnvStrings 将路径中部分数据替换为系统环境变量格式
1.4.7.2 路径查找比较函数
PathFindOnPath 从路径中查找路径
PathFindExtension 查找路径的扩展名
PathFindFileName 获取路径的文件名
PathFindNextComponent 查找匹配路径(不太熟悉)
PathFindSuffixArray 查找给定的文件名是否有给定的后缀。
PathGetArgs 获取路径参数
PathGetCharType 获取路径字符类型
PathGetDriveNumber 根据逻辑盘符返回驱动器序号
1.4.7.3 路径转换函数
PathRelativePathTo 创建一个路径到另一个路径的相对路径。
PathResolve 将一个相对路径或绝对路径转换为一个合格的路径,这个理解起来比较拗口。
PathCanonicalize 规范化路径。将格式比较乱的路径整理成规范的路径格式。
PathBuildRoot 根据给定的磁盘序号创建根目录路径
CreateDirectory 创建目录
GetShortPathName 将长路径转为8.3格式的短路径格式
GetLongPathName 将短路径格式转为长路径。
PathGetShortPath 将长路径转为短路径格式(8.3格式)
PathCreateFromUrl 将URL路径转为MS-DOS格式
PathMakePretty 把路径全部转为小写,增加可读性。
PathMakeSystemFolder 给路径增加系统属性
PathUnmakeSystemFolder 去除路径中的系统属性。
PathMakeUniqueName 从模板创建统一的路径格式——没用过,不熟悉
PathProcessCommand 生成一个可执行的路径,比如有参数的,会自动将路径用“”包含。
这在ShellExecute中比较有用。
1.4.7.4 路径验证函数
PathCleanupSpec 去除路径中不合法的字符
PathCommonPrefix 比较并提取两个路径相同的前缀
PathFileExists 验证路径是否存在
PathMatchSpec 判断路径是否匹配制定的扩展名。
PathIsDirectory 判断路径是否是一个有效的目录
PathIsFileSpec 验证路径是否一个文件名(有可能是一个路径)
PathIsExe 验证路径是否是可执行文件。注意:不仅仅是.exe,还有.bat,.com,.src等
PathIsRoot 路径是否为根路径
PathIsRelative 判断路径是否是相对路径
PathIsContentType 检测文件是否为制定类型。
例如:PathIsContentType( “hello.txt” ,“text/plain” ) 返回TRUE
PathIsContentType( “hello.txt” ,“image/gif” ) 返回FALSE
PathIsHTMLFile 判断路径是否是html文件类型——根据系统注册类型判断。
PathIsLFNFileSpec 判断路径是否是长路径格式
PathIsNetworkPath 判断路径是否是一个网络路径。
PathIsPrefix 判断路径是否含有指定前缀
PathIsSameRoot 判断路径是否有相同根目录
PathIsSlow 判断路径是否是一个高度延迟的网络连接——我也不太明白是啥意思。
PathIsSystemFolder 判断路径是否有系统属性(属性可以自己设定)
PathIsUNC 路径是否是UNC格式(网络路径)
PathIsUNCServer 路径是否是UNC服务器
PathIsUNCServerShare 路径是否仅仅是UNC的共享路径格式
PathIsURL 路径是否是http格式。
PathYetAnotherMakeUniqueName 基于已存在的文件,自动创建一个唯一的文件名。比较有用,比如存在“新建文件”,此函数会创建文件名“新建文件(2)”。
1.5 文件内存映射
CreateFileMapping 创建文件内存映射句柄,使用前必须已经打开了该文件,不能映射长度为0的文件的,否则报1006错误。
MapViewOfFile 具体将文件中的哪一段映射到内存。
UnmapViewOfFile 释放映射的内存。
CloseHandle 关闭内存映射句柄。
1.6 文件系统
1.6.1 GetDiskFreeSpaceEx(未完成)
函数名称 |
GetDiskFreeSpaceEx |
头文件 |
#include <windows.h> |
函数功能 |
获取指定分区的可用剩余空间、可用总空间和分区总剩余空间。 |
函数声明 |
BOOL WINAPI GetDiskFreeSpaceEx( LPCTSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailable, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes ); |
函数参数 |
lpDirectoryName:[输入],分区上的一个目录字符串的指针,为NULL表示当前活动目录。目录字符串后面不能加文件名,否侧会失败。目录字符串只要在指定分区上即可,必须已经存在。程序对此分区必须具有FILE_LIST_DIRECTORY权限。例如:"C:"、"C:\"、"C:\windows"都表示C:盘,".\\"表示当前活动路径所在分区。 lpFreeBytesAvailable:[输入],存放可用剩余空间的结构体指针,单位字节,不需要就填NULL。可用剩余空间表示本程序可以用的剩余空间,如果启用了磁盘配额,此参数有可能小于分区总剩余空间。 lpTotalNumberOfBytes:[输入],存放可用总空间的结构体指针,不需要就填NULL。可用总空间表示本程序可以用的总空间,如果启用了磁盘配额,此参数有可能小于分区总空间。 lpTotalNumberOfFreeBytes:[输入],存放分区总剩余空间的结构体指针,不需要就填NULL。 |
返回值 |
非0:成功。 0:失败。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知,表示此函数多线程调用是否会产生影响 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是 或 否 或 未知,表示此函数是否是单一操作,不是多个步骤的组合 |
其他说明 |
|
1.7 时钟
1.7.1 gettimeofday
函数名称 |
gettimeofday |
头文件 |
#include <sys/time.h> |
函数功能 |
获取当前操作系统的时钟。 |
函数声明 |
int gettimeofday (struct timeval * tv, struct timezone * tz); |
函数参数 |
tv:[输出],存放1970年1月1日00:00:00到现在一共走了多少秒,精确到微秒,为NULL表示不关心。 tz:[输出],当地时区信息,为NULL表示不关心。 |
返回值 |
0:成功。 -1:失败,并设置errno错误码变量。 |
线程安全 |
是 |
信号打断 |
否 |
其他说明 |
|
1.7.2 settimeofday
函数名称 |
settimeofday |
头文件 |
#include <sys/time.h> |
函数功能 |
设置当前操作系统的时钟和时区。 |
函数声明 |
int settimeofday(const struct timeval * tv, const struct timezone * tz); |
函数参数 |
tv:[输入],将当前操作系统的时钟要设置的时间,从1970年1月1日00:00:00到要设置的时间一共走了多少秒,为NULL表示不设置。 tz:[输入],要设置当前操作系统的时区信息,为NULL表示不设置。 |
返回值 |
0:成功。 -1:失败,并设置errno错误码变量。 |
线程安全 |
是 |
信号打断 |
否 |
其他说明 |
调用此函数需要进程具有root权限。 |
1.7.3 localtime_s(未完成)
函数名称 |
localtime_s |
头文件 |
#include <time.h> |
函数功能 |
把本地时区从1970年1月1日00:00:00到现在所走的秒数转换到指定的日历结构体。 |
函数声明 |
struct tm * localtime_r ( struct tm * _Tm, const time_t * _Time ); |
函数参数 |
_Tm:[输出],日历结构体指针。 _Time:[输入],秒数变量指针,本地时区从1970年1月1日00:00:00到现在一共走了多少秒。 |
返回值 |
0:成功。 非0:失败。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是 |
其他说明 |
…… …… |
1.7.4 mktime(未完成)
函数名称 |
mktime |
头文件 |
#include <time.h> |
函数功能 |
把日历结构体转换为从1970年1月1日00:00:00到日历结构体描述的那一时刻所走的秒数。 |
函数声明 |
time_t mktime(struct tm * timeptr); |
函数参数 |
timeptr:[输入],日历结构体的指针。 |
返回值 |
所走的秒数。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
原子操作 |
是 或 否 或 未知 |
其他说明 |
…… …… |
1.8 进程
1.8.1 _getpid(未完成)
函数名称 |
_getpid |
头文件 |
#include < process.h> |
函数功能 |
获取本进程的PID号。 |
函数声明 |
int _getpid ( void ); |
函数参数 |
无 |
返回值 |
本进程的PID号 |
错误码 |
无 |
线程安全 |
是 |
信号打断 |
否 |
原子操作 |
是 |
其他说明 |
|
1.9 信号
1.9.1 signal (未完成)
函数名称 |
signal |
头文件 |
#include < signal.h> |
函数功能 |
设置指定信号的捕捉函数。 |
函数声明 |
sighandler_t signal ( int signum, sighandler_t handler ); |
函数参数 |
signum:[输入],要捕捉的信号,可以是(选一至一个): SIGINT:interrupt(Ctrl+C中断) SIGILL:illegal instruction - invalid function image(非法指令) SIGFPE:floating point exception(浮点异常) SIGSEGV:segment violation(段错误) SIGTERM:Software termination signal from kill(Kill发出的软件终止) SIGBREAK:Ctrl-Break sequence(Ctrl+Break中断) SIGABRT:abnormal termination triggered by abort call(Abort) handler:[输入],信号捕捉函数的指针,函数声明必须是void sighandler(int),也可以是(选一至一个): SIG_DEL:此信号交由系统缺省捕捉处理,本进程不再捕捉。 SIG_IGN:忽略掉该信号而不做任何处理。 |
返回值 |
0:成功。 SIG_ERR:失败。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
原子操作 |
是 或 否 或 未知 |
其他说明 |
…… …… |
1.10 套接字
1.10.1 accept
头文件 |
#include <sys/types.h> #include <sys/socket.h> |
函数名称 |
accept |
函数功能 |
函数主要功能说明。 |
函数声明 |
类型 函数名 (类型 参数1, 类型 参数2, ……); |
函数参数 |
参数1:[输入|输出|输入&输出],参数说明。 参数2:[输入|输出|输入&输出],参数说明。 …… |
返回值 |
返回值1:返回值说明。 返回值2:返回值说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否,有些操作系统内核会打断,有些又不会 |
注意事项 |
…… …… |
1.10.2 getaddrinfo(未完成)
头文件 :#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
函数名称:getaddrinfo
函数功能:根据指定的主机名和服务名获取地址信息。
函数声明:int getaddrinfo (const char * node,
const char * service,
const struct addrinfo * hints,
struct addrinfo ** res);
函数参数:参数1:参数说明。
参数2:参数说明。
……
返回值 :0:成功。
EAI_ADDRFAMILY:The specified network host does not have any network addresses in the requested address family.
EAI_AGAIN:The name server returned a temporary failure indication. Try again later.
EAI_BADFLAGS:ai_flags contains invalid flags.
EAI_FAIL:The name server returned a permanent failure indication.
EAI_FAMILY:The requested address family is not supported at all.
EAI_MEMORY:Out of memory.
EAI_NODATA:The specified network host exists, but does not have any network addresses defined.
EAI_NONAME:The node or service is not known; or both node and service are NULL; or AI_NUMERICSERV was specified in hints.ai_flags and service was not a numeric port-number string.
EAI_SERVICE:The requested service is not available for the requested socket type. It may be available through another socket type.
EAI_SOCKTYPE:The requested socket type is not supported at all.
EAI_SYSTEM:Other system error, check errno for details.
线程安全:是
信号打断:是 或 否 或 未知
注意事项:
……
……
1.10.3 getnameinfo(未完成)
头文件 :#include <sys/socket.h>
#include <netdb.h>
函数名称:getnameinfo
函数功能:函数主要功能说明。
函数声明:int getnameinfo (const struct sockaddr * sa,
socklen_t salen,
char *host,
size_t hostlen,
char *serv,
size_t servlen,
int flags);
函数参数:
返回值 :0:成功。
EAI_AGAIN:The name could not be resolved at this time. Try again later.
EAI_BADFLAGS:The flags argument has an invalid value.
EAI_FAIL:A nonrecoverable error occurred.
EAI_FAMILY:The address family was not recognized, or the address length was invalid for the specified family.
EAI_MEMORY:Out of memory.
EAI_NONAME:The name does not resolve for the supplied arguments. NI_NAMEREQD is set and the host‘s name cannot be located, or neither hostname nor service name were requested.
EAI_OVERFLOW:The buffer pointed to by host or serv was too small.
EAI_SYSTEM:A system error occurred. The error code can be found in errno.
线程安全:是
信号打断:是 或 否 或 未知
注意事项:
1.10.4 getifaddrs(未完成)
头文件 :#include <sys/types.h>
#include <ifaddrs.h>
函数名称:getifaddrs
函数功能:获取网络设备的IP地址。
函数声明:int getifaddrs (struct ifaddrs ** ifap);
函数参数:0:成功。
-1:失败,并设置errno错误码变量。
返回值 :返回值1:返回值说明。
返回值2:返回值说明。
……
线程安全:是 或 否 或 未知
信号打断:是 或 否 或 未知
注意事项:
struct ifaddrs
{
struct ifaddrs * ifa_next; //指向链表的下一个成员
char * ifa_name; //网络设备名字符串
unsigned int ifa_flags; //Flags from SIOCGIFFLAGS
struct sockaddr * ifa_addr; //Address of interface
struct sockaddr * ifa_netmask; //Netmask of interface
union
{
struct sockaddr * ifu_broadaddr; // Broadcast address of interface
struct sockaddr * ifu_dstaddr; // Point-to-point destination address
}ifa_ifu;
#define ifa_broadaddr ifa_ifu.ifu_broadaddr
#define ifa_dstaddr ifa_ifu.ifu_dstaddr
void * ifa_data; // Address-specific data
};
ifa_next指向链表的下一个成员;ifa_name是接口名称,以0结尾的字符串,比如eth0,lo;ifa_flags是接口的标识位(比如当IFF_BROADCAST或IFF_POINTOPOINT设置到此标识位时,影响联合体变量ifu_broadaddr存储广播地址或ifu_dstaddr记录点对点地址);ifa_netmask存储该接口的子网掩码;结构体变量存储广播地址或点对点地址(见括弧介绍ifa_flags);ifa_data存储了该接口协议族的特殊信息,它通常是NULL(一般不关注他)。
使用完后,必须使用freeifaddrs()函数释放内存。
1.11 多线程
1.11.1 CreateThread(未完成)
函数名称 |
CreateThread |
头文件 |
#include <windows.h> |
函数功能 |
为本进程创建一个新的线程,并返回线程的句柄。 |
函数声明 |
HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); |
函数参数 |
lpThreadAttributes:[输入],指向一个 SECURITY_ATTRIBUTES 结构的指针,该结构决定了线程的安全属性,一般置为 NULL。 dwStackSize:[输入],指定了线程的堆栈深度,一般都设置为0。 lpStartAddress:[输入],表示新线程开始执行的主函数指针。线程主函数的声明必须是DWORD WINAPI ThreadFunc (LPVOID lpThreadParameter),ThreadFunc 是线程主函数名,lpThreadParameter为参数名,线程主函数只能有一个参数。 lpParameter:[输入],指定传给线程主函数的参数,不传就为NULL。 dwCreationFlags:[输入],线程创建后是否立即执行线程主函数。如果此参数为0,表示立即执行;如果此参数为CREATE_SUSPENDED宏,则线程创建后,挂起状态,并不马上执行,以后可以调用ResumeThread()函数唤醒线程。 lpThreadId:[输出],存放新线程的ID的内存指针,不需要就为NULL。 |
返回值 |
非NULL:新线程的句柄。 NULL:失败。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是 |
其他说明 |
…… …… |
2、DWORD SuspendThread(HANDLE hThread);
该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。
3、DWORD ResumeThread(HANDLE hThread);
该函数用于结束线程的挂起状态,执行线程。 也就是恢复指定的线程
4、VOID ExitThread(DWORD dwExitCode);
该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。
5、BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。各参数含义如下:hThread:将被终结的线程的句柄;
dwExitCode:用于指定线程的退出码。
使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。
6、BOOL PostThreadMessage(DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam);
该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。也是上面所说的线程通信。
idThread:将接收消息的线程的ID;
Msg:指定用来发送的消息;
wParam:同消息有关的字参数;
lParam:同消息有关的长参数;
调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。
1.12 消息队列
1.12.1 msgget
函数名称 |
msgget |
头文件 |
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> |
函数功能 |
根据消息队列的关键字,创建一个新的消息队列标识符(msqid),或者获取一个已存在的消息队列标识符(msqid)。 |
函数声明 |
int msgget (key_t key, int msgflg); |
函数参数 |
key:[输入],消息队列的关键字,填入新的消息队列的关键字或者已存在的消息队列的关键字,操作系统就是根据消息队列的关键字来找对应的消息队列标识符。 msgflg:[输入],创建或获取消息队列时的标记。可以是(用"|"选择多个): IPC_CREAT:如果消息队列的关键字不存在,就创建一个新的消息队列标识符,如果已存在,就返回这个已存在的消息队列标识符。如果不使用此标记,如果消息队列的关键字不存在,就返回失败,如果已存在,就返回这个已存在的消息队列标识符。 IPC_EXCL:只能和IPC_CREAT同时使用(用"|"连接),如果消息队列的关键字不存在,就创建一个新的消息队列标识符,如果已存在,就返回失败。 IPC_PRIVATE:创建一个私有消息队列,理论上只可以为当前进程所访问,消息队列的关键字必须为0,否则会返回失败。无需指定IPC_CREAT标记,指定了也没有关系。 0666:权限位,操作此消息队列的权限,和文件系统的权限位意思一样。 |
返回值 |
-1:失败。 其他:消息队列标识符。 |
错误码 |
|
线程安全 |
是 |
信号打断 |
否 |
其他说明 |
如果获取一个已存在的消息队列标识符,但是没有操作此消息队列的权限,会返回失败。 |
1.12.2 msgsnd
函数名称 |
msgsnd |
头文件 |
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> |
函数功能 |
根据消息队列标识符(msqid),阻塞向消息队列里发送一条消息。 |
函数声明 |
int msgsnd (int msqid, const void * msgp, size_t msgsz, int msgflg); |
函数参数 |
msqid:[输入],消息队列标识符。如果此参数不是有效的消息队列标识符,则立即返回失败并设置EINVAL错误码。 msgp:[输入],消息缓存结构体指针,要发送的消息数据就放在此结构体的消息数据成员变量里,不能为NULL。如果此参数是无效的指针,则立即返回失败并设置EFAULT错误码或者段错误。 msgsz:[输入],消息缓存结构体的消息数据成员变量的长度,不包括消息类型成员变量,单位字节,必须大于等于0。如果为0,表示发送一条没有消息数据的消息。如果长度超过限制,则立即返回失败并设置EINVAL错误码。如果操作系统没有足够的内存存放这条消息,则立即返回失败并设置ENOMEM错误码。 msgflg:[输入],发送消息时的标记。可以是(用"|"选择多个): IPC_NOWAIT:如果使用此标记,且消息队列没有足够的内存容纳此条消息,则立即返回失败并设置EAGAIN错误码,如果不使用此标记,就会阻塞等待到有足够的内存容纳此条消息为止。 |
返回值 |
-1:失败。 0:成功。 |
错误码 |
EACCES:进程对此消息队列没有写权限。 EAGAIN:消息队列没有足够的内存存放这条消息,且使用了IPC_NOWAIT标识。 EFAULT:msgp参数是无效的指针。 EIDRM:此消息队列已经被删除。 EINTR:函数在阻塞发送消息时,进程突然收到信号。 EINVAL:msgqid参数不是有效的消息队列标识符,或者msgp消息缓存结构体的消息类型成员变量的值不是正数,或者msgsz参数小于0或超过限制。 ENOMEM:操作系统没有足够的内存存放这条消息。 |
线程安全 |
是 |
信号打断 |
是 |
其他说明 |
如果正在阻塞的时候消息队列被删除,则立即返回EIDRM错误。 如果正在阻塞的时候,进程收到信号,则立即返回EINTR错误。 如果进程对此消息队列没有写权限,会返回EACCES错误。 |
1.12.3 msgrcv
函数名称 |
msgrcv |
头文件 |
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> |
函数功能 |
根据消息队列标识符(msqid),阻塞从消息队列里接收一条最先放入消息队列的、且消息类型匹配的消息数据放入指定的消息缓存结构体里,接收后此条消息会从消息队列中删除。 |
函数声明 |
ssize_t msgrcv (int msqid, void * msgp, size_t msgsz, long msgtyp, int msgflg); |
函数参数 |
msqid:[输入],消息队列标识符。如果此参数不是有效的消息队列标识符,则立即返回失败并设置EINVAL错误码。 msgp:[输出],消息缓存结构体指针,接收到的消息数据会放在此结构体的消息数据成员变量里,不能为NULL。如果此参数是无效的指针,则立即返回失败并设置EFAULT错误码或者段错误。 msgsz:[输入],消息缓存结构体的消息数据成员变量的长度,表示最大能放多长的消息,单位字节,必须大于等于0。如果接收到的符合条件的消息数据长度超过msgsz参数,且未指定MSG_NOERROR标记,则立即返回E2BIG错误,且消息还留在消息队列中。如果此参数小于0,则立即返回EINVAL错误。 msgtyp:[输入],消息类型,要接收一条什么类型的消息,为0表示任意消息类型。 msgflg:[输入],接收消息时的标记。可以是(用"|"选择多个): IPC_NOWAIT:如果使用此标记,且消息队列为空,则立即返回失败并设置ENOMSG错误码。如果不使用此标记,那么函数会一直阻塞到可以从消息队列中接收到符合条件的消息才返回。 MSG_NOERROR:如果使用此标记,且接收到的消息数据的长度大于msgsz参数,则将只返回msgsz这么长的消息数据,剩下的尾部数据被丢弃了。如果不使用此标记,则立即返回失败并设置E2BIG错误码,而消息还留在消息队列中。 |
返回值 |
-1:失败,并设置errno错误码变量。 其他:接收的消息的长度,单位字节。 |
错误码 |
E2BIG:接收到的消息数据的长度大于msgsz参数,且未使用MSG_NOERROR标记。 EACCES:进程对此消息队列没有读权限。 EAGAIN:消息队列中没有符合条件的消息,且使用了IPC_NOWAIT标记。 EFAULT:msgp参数是无效的指针。 EIDRM:函数在阻塞接收消息时,消息队列突然被删除。 EINITR:函数在阻塞接收消息时,进程突然收到信号。 EINVAL:msgqid参数不是有效的消息队列标识符,或者msgsz参数小于0。 |
线程安全 |
是 |
信号打断 |
是 |
其他说明 |
|
1.12.4 msgctl(未完成)
函数名称 |
msgctl |
头文件 |
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> |
函数功能 |
对指定的消息队列进行查询、修改、删除等操作。 |
函数声明 |
int msgctl (int msqid, int cmd, struct msqid_ds * buf); |
函数参数 |
msqid:[输入],消息队列标识符。如果此参数不是有效的消息队列标识符,则立即返回EINVAL错误。 cmd:[输入],要执行什么操作。如果此参数不是有效的操作,则立即返回EINVAL错误。可以是(只能选一个): IPC_STAT:获取消息队列的struct msqid_ds结构体信息。如果进程对此消息队列没有读权限,会返回EACCES错误。 IPC_SET:立即删除此此消息队列,此消息队列的所有正在阻塞的操作立即返回EIDRM错误。 IPC_RMID: IPC_INFO: MSG_INFO: MSG_STAT: buf:[输入&输出],如果cmd参数是: IPC_STAT:[输出],则此参数是一个struct msqid_ds结构体类型变量的指针。如果此参数不是有效的一个struct msqid_ds结构体类型的变量,则立即返回EFAULT错误或者段错误。 IPC_SET:则此参数 IPC_RMID: IPC_INFO: MSG_INFO: MSG_STAT: |
返回值 |
返回值1:返回值说明。 返回值2:返回值说明。 …… |
线程安全 |
是 或 否 或 未知 |
信号打断 |
是 或 否 或 未知 |
其他说明 |
…… …… |
1.13 FTP文件传输协议
1.13.1 连接
1.13.1.1 InternetOpen (未完成)
函数名称 |
InternetOpen |
头文件 |
#include <windows.h> #include <wininet.h> #pragma comment(lib, "wininet.lib") |
函数功能 |
初始化WinINet,返回HINTERNET句柄,HINTERNET句柄用于创建对具体服务器的具体服务的连接。 |
函数声明 |
HINTERNET InternetOpen ( LPCSTR lpszAgent, DWORD dwAccessType, LPCSTR lpszProxy, LPCSTR lpszProxyBypass, DWORD dwFlags ); |
函数参数 |
lpszAgent:[输入],指向一个字符串,该字符串指定应用程序或实体调用WinInet函数的名称。此名称用作HTTP协议用户代理,可以为NULL。 dwAccessType:[输入],连接服务器使用的方式,可以是(选一至一个): INTERNET_OPEN_TYPE_DIRECT:解析所有本地主机,可以理解为直连。 INTERNET_OPEN_TYPE_PRECONFIG:返回注册表中代理或直接的配置。 INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY:返回注册表中代理或直接的配置,并防止对Microsoft Jscript 或 INS文件的使用。 INTERNET_OPEN_TYPE_PROXY:为代理传递请求,除非代理提供了旁路列表且解析的名字可以绕过代理;此时,函数使用INTERNET_OPEN_TYPE_DIRECT。 lpszProxy:[输入],指定了当dwAccessType类型为INTERNET_OPEN_TYPE_PROXY时,此参数表示代理服务器的名字。不要使用一个空的字符串,因为,该函数将使用它作为代理的名字。WinINet函数仅能识别OERN类型的代理和TIS网关。如果有安装IE,这些函数也同样支持SOCKS代理。FTP请求可由CERN类型代理或转换为HTTP请求,或使用InternetOpenUrl函数实现。如果dwAccessType参数未被设置为INTERNET_OPEN_TYPE_PROXY,此参数无意义,直接填NULL。 lpszProxyBypass:[输入],指向一个字符串,它指定一个可选的主机名列表或IP地址,列表可包括未知元素。如果dwAccessType类型未被设置为INTERNET_OPEN_TYPE_PROXY,此参数无意义,直接填NULL。 dwFlags:[输入],其他功能标记,可以是(选零至多个): INTERNET_FLAG_ASYNC:仅能用于作用在该函数返回的句柄的子句柄上的异步请求。 INTERNET_FLAG_FROM_CACHE:不做网络请求。所有的实体都由缓存返回。如果请求条目不在缓存中,一个适当的错误将返回。 INTERNET_FLAG_OFFLINE:与INTERNET_FLAG_FROM_CACHE一样。 |
返回值 |
NULL:失败。 其他:HINTERNET句柄。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知 |
原子操作 |
是 |
其他说明 |
使用完此函数返回的HINTERNET句柄后,需要调用InternetCloseHandle()函数释放句柄资源。 |
1.13.1.2 InternetConnect (未完成)
函数名称 |
InternetConnect |
头文件 |
#include <windows.h> #include <wininet.h> #pragma comment(lib, "wininet.lib") |
函数功能 |
使用InternetOpen()函数获得的HINTERNET句柄和指定的协议来连接指定的服务器,返回HINTERNET句柄用于和服务器之间的操作。 |
函数声明 |
HINTERNET InternetConnect ( HINTERNET hInternet, LPCSTR lpszServerName, INTERNET_PORT nServerPort, LPCSTR lpszUserName, LPCSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext ); |
函数参数 |
hInternet:[输入],调用InternetOpen()函数获得的HINTERNET句柄。 lpszServerName:[输入],要连接的服务器的IP地址或者域名。 nServerPort:[输入],要连接的服务器的端口号,可以*指定,也可以是(选一至一个): INTERNET_DEFAULT_FTP_PORT:使用默认的FTP文件传输协议服务器端口21。 INTERNET_DEFAULT_GOPHER_PORT:使用默认的Gopher信息查找系统服务器端口70。注意:仅适用于Windows XP和Windows Server 2003 R2及更早的操作系统。 INTERNET_DEFAULT_HTTP_PORT:使用默认的HTTP超文本传输协议服务器端口80。 INTERNET_DEFAULT_HTTPS_PORT:使用默认的HTTPS安全超文本传输协议服务器端口443。 INTERNET_DEFAULT_SOCKS_PORT:使用默认的SOCKS防火墙安全会话转换协议服务器端口1080。 INTERNET_INVALID_PORT_NUMBER:使用dwService参数指定的服务器使用的默认端口。 lpszUserName:[输入],连接服务器使用的用户名字符串。如果为NULL,则使用默认的匿名用户。 lpszPassword:[输入],连接服务器使用的用户名对应的密码字符串。如果lpszUserName参数和此参数都为NULL,则使用默认的匿名用户的密码。如果lpszUserName参数不为NULL,但此参数为NULL,则使用空密码。 dwService:[输入],使用什么协议连接服务器,可以是(选一至一个): INTERNET_SERVICE_FTP:FTP文件传输协议。 INTERNET_SERVICE_GOPHER:Gopher信息查找系统。注意:仅适用于Windows XP和Windows Server 2003 R2及更早的操作系统。 INTERNET_SERVICE_HTTP:HTTP超文本传输协议。 dwFlags:[输入],其他功能标记。可以是(选零至多个): INTERNET_FLAG_PASSIVE:如果使用FTP文件传输协议协议,且使用此标记,表示使用被动模式连接。如果使用FTP文件传输协议协议,但不使用此标记,表示使用主动模式连接。如果不是使用FTP文件传输协议协议,此标记无意义。 INTERNET_FLAG_EXISTING_CONNECT:尝试如果存在与发出请求所需的相同属性使用现有InternetConnect对象。这仅仅是使用FTP操作时非常有用,因为FTP是,通常在同一会话中执行多个操作的唯一协议。缓存的WinINet一个连接句柄句柄InternetOpen生成的每个HINTERNET 。在InternetOpenUrl中和InternetConnect函数使用这个标志用于HTTP和FTP连接。 dwContext:[输入],Pointer to a variable that contains an application-defined value that is used to identify the application context for the returned handle in callbacks.可以为NULL。 |
返回值 |
NULL:失败。 其他:HINTERNET句柄。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知 |
原子操作 |
是 |
其他说明 |
使用完此函数返回的HINTERNET句柄后,需要调用InternetCloseHandle()函数断开连接,并释放句柄资源。 |
1.13.2 断开
1.13.2.1 InternetCloseHandle(未完成)
函数名称 |
InternetCloseHandle |
头文件 |
#include <windows.h> #include <wininet.h> #pragma comment(lib, "wininet.lib") |
函数功能 |
断开与服务器的连接,并释放HINTERNE句柄资源。 |
函数声明 |
BOOL InternetCloseHandle ( HINTERNET hInternet ); |
函数参数 |
hInternet:[输入],调用InternetOpen()函数或InternetConnect()函数获得的HINTERNET句柄。 |
返回值 |
0:失败。 1:成功。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知 |
原子操作 |
是 |
其他说明 |
|
1.13.3 目录操作
FtpCreateDirectory在FTP服务器上建立目录, 需要InternetConnect返回的会话句柄
FtpRemoveDirectory在FTP服务器上删除目录, 需要InternetConnect返回的会话句柄
FtpGetCurrentDirectory获取当前在FTP服务器上的工作目录, 需要InternetConnect返回的会话句柄
FtpSetCurrentDirectory设置在FTP服务器上的工作目录, 需要InternetConnect返回的会话句柄
1.13.4 文件操作
FtpFindFirstFile在FTP服务器上查找符合条件的文件或目录, 需要InternetConnect返回的会话句柄
InternetFindNextFile在FTP服务器上继续查找下一个符合条件的文件或目录,需要FtpFindFirstFile返回的会话句柄
FtpPutFile上传一个文件到FTP服务器上, 需要InternetConnect返回的会话句柄
FtpGetFile从FTP服务器上下载一个文件, 需要InternetConnect返回的会话句柄,有可能出现函数卡住不返回的情况
FtpGetFileEx
FtpDeleteFile在FTP服务器上删除一个文件, 需要InternetConnect返回的会话句柄
FtpRenameFile在FTP服务器上更改一个文件的名字, 需要InternetConnect返回的会话句柄
FtpOpenFile在FTP服务器上打开一个文件, 需要InternetConnect返回的会话句柄
InternetReadFile直接在FTP服务器上读取文件, 需要FtpOpenFile返回的会话句柄
InternetWriteFile直接在FTP服务器上写入文件, 需要FtpOpenFile返回的会话句柄
1.14 INI配置文件
1.14.1 WritePrivateProfileString(未完成)
函数名称 |
WritePrivateProfileString |
头文件 |
#include <Windows.h> |
函数功能 |
向指定的INI配置文件的指定章节下的指定节点写入指定的字符串值,本系列函数支持多线程可以同时读写入同一个INI配置文件。 |
函数声明 |
BOOL WritePrivateProfileString ( LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpString, LPCSTR lpFileName ); |
函数参数 |
lpAppName:[输入],存放章节名称字符串的内存指针,如果指定的章节不存在,会自动在INI配置文件末尾添加。 lpKeyName:[输入],存放节点名称字符串的内存指针。如果指定的节点不存在,会自动在章节末尾添加。如果此参数为NULL,则会删除指定的章节和章节下的所有节点。 lpString:[输入],存放值的字符串的指针。如果指定的节点已存在,会自动替换以前的值。如果此参数为NULL,则会删除指定的章节下的指定的节点。 lpFileName:[输入],存放INI配置文件的路径字符串的内存指针,可以是相对或绝对路径,包括文件名,如果INI配置文件不存在,会自动创建。 |
返回值 |
非0:成功。 0:失败。 详情调用GetLastError()查看。 |
错误码 |
调用GetLastError()查看。 |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知 |
原子操作 |
是,只在调用本系列函数时。 |
其他说明 |
|
1.14.2 WritePrivateProfileSection(未完成)
函数名称 |
WritePrivateProfileSection |
头文件 |
#include <Windows.h> |
函数功能 |
向指定的INI配置文件的指定章节下替换所有节点为指定的节点,本系列函数支持多线程可以同时读写入同一个INI配置文件。 |
函数声明 |
BOOL WritePrivateProfileSection ( LPCSTR lpAppName, LPCSTR lpString, LPCSTR lpFileName ); |
函数参数 |
lpAppName:[输入],存放章节名称字符串的内存指针,如果指定的章节不存在,会自动在INI配置文件末尾添加。 lpString:[输入],存放多个节点名称字符串的内存指针,节点之间用‘\0‘字符分隔,最后一个节点用‘\0\0‘结束,例如:"key1=value1\0key2=value2\0\0"。 lpFileName:[输入],存放INI配置文件的路径字符串的内存指针,可以是相对或绝对路径,包括文件名,如果INI配置文件不存在,会自动创建。 |
返回值 |
非0:成功。 0:失败。 详情调用GetLastError()查看。 |
错误码 |
调用GetLastError()查看。 |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是,只在调用本系列函数时。 |
其他说明 |
|
1.14.3 WritePrivateProfileStruct(未完成)
函数名称 |
WritePrivateProfileStruct |
头文件 |
#include <Windows.h> |
函数功能 |
向指定的INI配置文件的指定章节下的指定节点写入指定的结构体值,用本函数写入的结构体值只能用GetPrivateProfileStruct()函数读取出来,本系列函数支持多线程可以同时读写入同一个INI配置文件。 |
函数声明 |
BOOL WritePrivateProfileStruct ( LPCSTR lpszSection, LPCSTR lpszKey, LPVOID lpStruct, UINT uSizeStruct, LPCSTR szFile ); |
函数参数 |
lpszSection:[输入],存放章节名称字符串的内存指针,如果指定的章节不存在,会自动在INI配置文件末尾添加。 lpszKey:[输入],存放节点名称字符串的内存指针。如果指定的节点不存在,会自动在章节末尾添加。如果此参数为NULL,则会删除指定的章节和章节下的所有节点。不能为""空字符串,否则会段错误。 lpStruct:[输入],存放结构体值的内存指针。如果指定的节点已存在,会自动替换以前的值。如果此参数为NULL,则会删除指定的章节下的指定的节点。 uSizeStruct:[输入],存放结构体值的内存的长度。 szFile:[输入],存放INI配置文件的路径字符串的内存指针,可以是相对或绝对路径,包括文件名。 |
返回值 |
非0:成功。 0:失败。 详情调用GetLastError()查看。 |
错误码 |
调用GetLastError()查看。 |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是,只在调用本系列函数时。 |
其他说明 |
|
1.14.4 GetPrivateProfileSectionNames(未完成)
函数名称 |
GetPrivateProfileSectionNames |
头文件 |
#include <Windows.h> |
函数功能 |
从指定的INI配置文件的指定章节下的读取所有的节点名称字符串,本系列函数支持多线程可以同时读写入同一个INI配置文件。 |
函数声明 |
DWORD GetPrivateProfileSectionNames ( LPSTR lpszReturnBuffer, DWORD nSize, LPCSTR lpFileName ); |
函数参数 |
lpszReturnBuffer:[输出],存放所有的节点名称字符串的内存指针,节点之间用‘\0‘字符分隔,最后一个节点用‘\0\0‘结束,例如:"key1\0key2\0\0"。 nSize:[输入],存放所有的节点名称字符串的内存的长度。 lpFileName:[输入],存放INI配置文件的路径字符串的内存指针,可以是相对或绝对路径,包括文件名。 |
返回值 |
所有的节点名称字符串的长度,不包括结束符‘\0’。 |
错误码 |
无。 |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是,只在调用本系列函数时。 |
其他说明 |
|
1.14.5 GetPrivateProfileString(未完成)
函数名称 |
GetPrivateProfileString |
头文件 |
#include <Windows.h> |
函数功能 |
从指定的INI配置文件的指定章节下的指定节点读取字符串值到指定的内存,本系列函数支持多线程可以同时读写入同一个INI配置文件。 |
函数声明 |
DWORD GetPrivateProfileString ( LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName ); |
函数参数 |
lpAppName:[输入],存放指定的章节名称字符串的内存指针。 lpKeyName:[输入],存放指定的节点名称字符串的内存指针。 lpDefault:[输入],存放缺省值的内存指针。如果指定的INI配置文件或指定的章节或指定的节点未找到,那么就强制用缺省值代替。 lpReturnedString:[输出],存放指定节点的字符串值的内存指针。 nSize:[输入],存放指定节点的字符串值的内存长度。 lpFileName:[输入],存放INI配置文件的路径字符串的内存指针,可以是相对或绝对路径,包括文件名。 |
返回值 |
字符串值的长度,不包括结束符‘\0’。 |
错误码 |
无。 |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是,只在调用本系列函数时。 |
其他说明 |
|
1.14.6 GetPrivateProfileInt(未完成)
函数名称 |
GetPrivateProfileInt |
头文件 |
#include <Windows.h> |
函数功能 |
从指定的INI配置文件的指定章节下的指定节点读取非负整数值到指定的内存,本系列函数支持多线程可以同时读写入同一个INI配置文件。 |
函数声明 |
UINT GetPrivateProfileInt ( LPCSTR lpAppName, LPCSTR lpKeyName, INT nDefault, LPCSTR lpFileName ); |
函数参数 |
lpAppName:[输入],存放指定的章节名称字符串的内存指针。 lpKeyName:[输入],存放指定的节点名称字符串的内存指针。 nDefault:[输入],存放缺省值的内存指针。如果指定的INI配置文件或指定的章节或指定的节点未找到,那么就强制用缺省值代替。 lpFileName:[输入],存放INI配置文件的路径字符串的内存指针,可以是相对或绝对路径,包括文件名。 |
返回值 |
读取到的非负整数值 |
错误码 |
无。 |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是,只在调用本系列函数时。 |
其他说明 |
|
1.14.7 GetPrivateProfileStruct(未完成)
函数名称 |
GetPrivateProfileStruct |
头文件 |
#include <Windows.h> |
函数功能 |
从指定的INI配置文件的指定章节下的指定节点读取结构体值到指定的内存,结构体值必须是调用WritePrivateProfileStruct()函数写入的,本系列函数支持多线程可以同时读写入同一个INI配置文件。 |
函数声明 |
BOOL GetPrivateProfileStruct ( LPCSTR lpszSection, LPCSTR lpszKey, LPVOID lpStruct, UINT uSizeStruct, LPCSTR szFile ); |
函数参数 |
lpszSection:[输入],存放指定的章节名称字符串的内存指针。 lpszKey:[输入],存放指定的节点名称字符串的内存指针。 lpStruct:[输出],存放结构体值的内存指针。 uSizeStruct:[输入],存放结构体值的内存的长度。 szFile:[输入],存放INI配置文件的路径字符串的内存指针,可以是相对或绝对路径,包括文件名。 |
返回值 |
非0:成功。 0:失败。 详情调用GetLastError()查看。 |
错误码 |
调用GetLastError()查看。 |
线程安全 |
是 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是,只在调用本系列函数时。 |
其他说明 |
|
1.15 错误码
1.15.1 GetLastError
函数名称 |
GetLastError |
头文件 |
#include < windows.h> |
函数功能 |
获取本线程最近一次的错误码,多线程互不影响。 |
函数声明 |
DWORD GetLastError ( void ); |
函数参数 |
无 |
返回值 |
本线程最近一次的错误码 |
错误码 |
无 |
线程安全 |
是 |
信号打断 |
否 |
原子操作 |
是 |
其他说明 |
可以使用FormatMessage()把错误码转换为错误信息字符串。 |
1.15.2 FormatMessage(未完成)
函数名称 |
FormatMessage |
头文件 |
#include <windows.h> |
函数功能 |
根据GetLastError()函数返回的错误码,获取此错误码对应的错误信息字符串存放在指定内存。 |
函数声明 |
DWORD FormatMessage ( DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, DWORD nSize, va_list * Arguments ); |
函数参数 |
dwFlags:[输入],可以是(选一至多个): FORMAT_MESSAGE_FROM_SYSTEM:在系统的id映射表中查找错误信息字符串。 FORMAT_MESSAGE_FROM_HMODULE:在其他资源模块中查找错误信息字符串。此标记不能和FORMAT_MESSAGE_FROM_STRING标记同时使用。 FORMAT_MESSAGE_FROM_STRING:消息ID是个字串,不是个DWORD。此标记不能和FORMAT_MESSAGE_FROM_HMODULE标记同时使用。 FORMAT_MESSAGE_ALLOCATE_BUFFER:要此函数会自动分配内存来存放错误信息字符串,而不是自己指定。 lpSource:[输入],如果dwFlags指定了FORMAT_MESSAGE_FROM_HMODULE,此参数表示模块的HANDLE;如果dwFlags指定了FORMAT_MESSAGE_FROM_STRING,此参数表示id字串;其他此参数无意义,必须为NULL。 dwMessageId:[输入],GetLastError()函数返回的错误码。如果指定FORMAT_MESSAGE_FROM_STRING,此参数无意义,必须为NULL。 dwLanguageId:[输入],错误信息字符串所用的语言,为0表示系统自动选择。 lpBuffer:[输入],存放错误信息字符串的内存指针,但是如果dwFlags指定了FORMAT_MESSAGE_ALLOCATE_BUFFER,系统会调用LocalAlloc()函数自动分配内存,此参数就为存放该内存指针的变量的指针,用户需要记住调用LocalFree()函数释放该内存。 nSize:[输入],存放错误信息字符串的内存长度,但是如果dwFlags指定了FORMAT_MESSAGE_ALLOCATE_BUFFER,此参数就为系统自动分配的内存的最小长度。 Arguments:[输入],无意义,必须为NULL。 |
返回值 |
非0:存放在内存的错误信息字符串的长度。 0:失败。 |
错误码 |
EXXXX:错误码说明。 EXXXX:错误码说明。 …… |
线程安全 |
是 或 否 或 未知,表示此函数多线程调用是否会产生影响 |
信号打断 |
是 或 否 或 未知,表示此函数在调用期间是否会被信号打断 |
原子操作 |
是 或 否 或 未知,表示此函数是否是单一操作,不是多个步骤的组合 |
其他说明 |
…… …… |
2 结构体库
2.1 结构体模板(未完成)
结构体名称 |
xxx |
头文件 |
#include <xxx.h> #include <xxx.h> |
结构体说明 |
结构体主要用途说明。 |
结构体声明 |
struct xxx { 类型 成员变量1; 类型 成员变量2; …… }; |
成员变量 |
成员变量1:成员变量说明。 成员变量2:成员变量说明。 …… |
其他说明 |
…… …… |
2.2 套接字
2.2.1 sockaddr
头文件 :#include <linux/socket.h>
结构体名称:sockaddr
结构体说明:结构体主要使用说明。
结构体声明:struct sockaddr
{
sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
成员变量 :sa_family:IP地址的地址族,用AF_xxx定义的
sa_data:协议的地址数据,占14个字节的
注意事项 :
……
2.2.2 sockaddr_in
头文件 :#include <netinet/in.h>
结构体名称:sockaddr_in
结构体说明:一般用于对IPv4的地址信息的说明。
结构体声明:struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */
/* Pad to size of `struct sockaddr‘. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
成员变量 :sin_port:存放端口号。
sin_addr:存放IP地址。
sin_zero:填充数据,为了占满14个字节,无实际意义。
注意事项 :
……
……
2.2.3 sockaddr_in6
头文件 :#include <netinet/in.h>
结构体名称:sockaddr_in6
结构体说明:一般用于对IPv6的地址信息的说明。
结构体声明:struct sockaddr_in6
{
__SOCKADDR_COMMON (sin6_);
in_port_t sin6_port; /* Transport layer port # */
uint32_t sin6_flowinfo; /* IPv6 flow information */
struct in6_addr sin6_addr; /* IPv6 address */
uint32_t sin6_scope_id; /* IPv6 scope-id */
};
成员变量 :sin6_port:成员变量说明。
sin6_flowinfo:成员变量说明。
sin6_addr:
sin6_scope_id:
注意事项 :
……
……
2.3 网络设备
2.3.1 ifaddrs
头文件 :#include <ifaddrs.h>
结构体名称:ifaddrs
结构体说明:结构体主要使用说明。
结构体声明:struct ifaddrs
{
struct ifaddrs * ifa_next; /* Pointer to the next structure. */
char * ifa_name; /* Name of this network interface. */
unsigned int ifa_flags; /* Flags as from SIOCGIFFLAGS ioctl. */
struct sockaddr * ifa_addr; /* Network address of this interface. */
struct sockaddr * ifa_netmask; /* Netmask of this interface. */
union
{
/* At most one of the following two is valid. If the IFF_BROADCAST
bit is set in `ifa_flags‘, then `ifa_broadaddr‘ is valid. If the
IFF_POINTOPOINT bit is set, then `ifa_dstaddr‘ is valid.
It is never the case that both these bits are set at once. */
struct sockaddr * ifu_broadaddr; /* Broadcast address of this interface. */
struct sockaddr * ifu_dstaddr; /* Point-to-point destination address. */
} ifa_ifu;
/* These very same macros are defined by <net/if.h> for `struct ifaddr‘.
So if they are defined already, the existing definitions will be fine. */
# ifndef ifa_broadaddr
# define ifa_broadaddr ifa_ifu.ifu_broadaddr
# endif
# ifndef ifa_dstaddr
# define ifa_dstaddr ifa_ifu.ifu_dstaddr
# endif
void * ifa_data; /* Address-specific data (may be unused). */
};
成员变量 :ifa_next:指向链表的下一个成员;
ifa_name:是接口名称,以0结尾的字符串,比如eth0,lo;
ifa_flags:是接口的标识位(比如当IFF_BROADCAST或IFF_POINTOPOINT设置到此标识位时,影响联合体变量ifu_broadaddr存储广播地址或ifu_dstaddr记录点对点地址);
ifa_netmask:存储该接口的子网掩码;结构体变量存储广播地址或点对点地址(见括弧介绍ifa_flags);
ifa_data:存储了该接口协议族的特殊信息,它通常是NULL(一般不关注他)。
注意事项 :
……
……
2.4 文件描述符
2.4.1 pollfd
头文件 :#include <sys/poll.h>
结构体名称:pollfd
结构体说明:结构体主要使用说明。
结构体声明:struct pollfd
{
int fd; /* File descriptor to poll. */
short int events; /* Types of events poller cares about. */
short int revents; /* Types of events that actually occurred. */
};
成员变量 :fd:[输入],存放用于poll()函数检查的文件描述符。
events:[输入],存放需要检查此文件描述符的哪些状态。
revents:[输出],存放此文件描述符经过检查后,已经处于哪些状态。
注意事项 :
状态类型 |
数值 |
说明 |
POLLIN |
0x001 |
有数据可读 |
POLLRDNORM |
0x040 |
有普通数据可读 |
POLLRDBAND |
0x080 |
有优先数据可读 |
POLLPRI |
0x002 |
有紧迫数据可读 |
POLLOUT |
0x004 |
普通数据可写 |
POLLWRNORM |
0x100 |
普通数据可写 |
POLLWRBAND |
0x200 |
优先级带数据可写 |
POLLERR |
0x008 |
指定的文件描述符发生错误 |
POLLHUP |
0x010 |
指定的文件描述符发生挂起 |
POLLNVAL |
0x020 |
指定的文件描述符无效 |
POLLIN | POLLPRI等价于select()的读事件,POLLOUT | POLLWRBAND等价于select()的写事件。
POLLIN等价于POLLRDNORM | POLLRDBAND,而POLLOUT则等价于POLLWRNORM。
2.5 时钟
2.5.1 timeval
结构体名称 |
timeval |
头文件 |
#include <sys/time.h> |
结构体说明 |
用于记录时间的结构体。 |
结构体声明 |
struct timeval { time_t tv_sec; suseconds_t tv_usec; }; |
成员变量 |
tv_sec:[输入&输出],表示多少秒。 tv_usec:[输入&输出],表示多少微秒,1秒等于1000000微秒。 |
其他说明 |
|
2.5.2 timezone
结构体名称 |
timezone |
头文件 |
#include <sys/time.h> |
结构体说明 |
用于记录时区的结构体。 |
结构体声明 |
struct timezone { int tz_minuteswest; int tz_dsttime; }; |
成员变量 |
tz_minuteswest:[输入&输出],和格林威治时间往西方的时差,差了多少分钟。 tz_dsttime:[输入&输出],夏时制或夏令时或日光节约时(Daylight Saving Time)的类型。 类型如下: DST_NONE //不使用 DST_USA //美国 DST_AUST //澳洲 DST_WET //西欧 DST_MET //中欧 DST_EET //东欧 DST_CAN //加拿大 DST_GB //大不列颠 DST_RUM //罗马尼亚 DST_TUR //土耳其 DST_AUSTALT //澳洲(1986年以后) |
其他说明 |
|
2.5.3 tm
结构体名称 |
tm |
头文件 |
#include <time.h> |
结构体说明 |
结构体主要用途说明。 |
结构体声明 |
struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; }; |
成员变量 |
tm_sec:表示秒钟,在[0,60]之间,多出来的一秒是用来处理闰秒问题。 tm_min:表示分钟,在[0,59]之间。 tm_hour:表示时钟,在[0,23]之间。 tm_mday:表示日份,在[1,31]之间。 tm_mon:表示月份,在[0,11]之间。 tm_year:表示1900年到今年一共差多少年。 tm_wday:表示星期几,在[0,6]之间,星期天为0,星期一为1,以此类推。 tm_yday:表示当天是本年第几日,在[0,365]之间,非闰年有365日,闰年有366日。 tm_isdst:表示是否为日光节约时间。 |
其他说明 |
|
2.5.4 SYSTEMTIME
结构体名称 |
SYSTEMTIME |
头文件 |
#include <windows.h> |
结构体说明 |
存储日期时间信息。 |
结构体声明 |
typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; }SYSTEMTIME; |
成员变量 |
wYear:表示年份,在[1601-30827]之间。例如:此值为2013,就表示2013年。 wMonth:表示月份,在[1-12]之间。例如:此值为1,就表示1月;此值为12,就表示12月。 wDayOfWeek:表示星期几,在[1-7]之间。例如:此值为1,就表示星期日;此值为7,就表示星期六。 wDay:表示日份,在[1-31]之间。 wHour:表示时钟,在[0-23]之间。 wMinute:表示分钟,在[0-59]之间。 wSecond:表示秒钟,在[0-59]之间。 wMilliseconds:表示毫秒,在[0-999]之间。 |
其他说明 |
|
2.6 消息队列
2.6.1 msgbuf
结构体名称 |
msgbuf |
头文件 |
#include <linux/msg.h> |
结构体说明 |
消息缓存结构体,用于消息队列之间的消息发送和接收。 |
结构体声明 |
struct msgbuf { long mtype; char mtext[1]; }; |
成员变量 |
mtype:[输入&输出],消息类型,必须大于0。 mtext:[输入&输出],消息文本,长度可以无限大。 |
其他说明 |
|
2.6.2 msginfo(未完成)
结构体名称 |
msginfo |
头文件 |
#include <sys/msg.h> |
结构体说明 |
结构体主要用途说明。 |
结构体声明 |
struct msginfo { int msgpool; /* Size in bytes of buffer pool used to hold message data; unused */ int msgmap; /* Max. # of entries in message map; unused */ int msgmax; /* Max. # of bytes that can be written in a single message */ int msgmnb; /* Max. # of bytes that can be written to queue; used to initialize msg_qbytes during queue creation (msgget()) */ int msgmni; /* Max. # of message queues */ int msgssz; /* Message segment size; unused */ int msgtql; /* Max. # of messages on all queues in system; unused */ unsigned short int msgseg; /* Max. # of segments; unused */ }; |
成员变量 |
成员变量1:[输入|输出|输入&输出],成员变量说明。 成员变量2:[输入|输出|输入&输出],成员变量说明。 …… |
其他说明 |
…… …… |
2.6.3 msqid_ds(未完成)
结构体名称 |
msqid_ds |
头文件 |
#include <sys/msg.h> |
结构体说明 |
结构体主要用途说明。 |
结构体声明 |
struct msqid_ds { struct ipc_perm msg_perm; /* Ownership and permissions time_t msg_stime; /* Time of last msgsnd() */ time_t msg_rtime; /* Time of last msgrcv() */ time_t msg_ctime; /* Time of last change */ unsigned long __msg_cbytes; /* Current number of bytes in queue (non-standard) */ msgqnum_t msg_qnum; /* Current number of messages in queue */ msglen_t msg_qbytes; /* Maximum number of bytes allowed in queue */ pid_t msg_lspid; /* PID of last msgsnd() */ pid_t msg_lrpid; /* PID of last msgrcv() */ }; |
成员变量 |
成员变量1:[输入|输出|输入&输出],成员变量说明。 成员变量2:[输入|输出|输入&输出],成员变量说明。 …… |
其他说明 |
…… …… |
2.6.4 ipc_perm(未完成)
结构体名称 |
ipc_perm |
头文件 |
#include <sys/ipc.h> |
结构体说明 |
结构体主要用途说明。 |
结构体声明 |
struct ipc_perm { key_t key; /* Key supplied to msgget() */ uid_t uid; /* Effective UID of owner */ gid_t gid; /* Effective GID of owner */ uid_t cuid; /* Effective UID of creator */ gid_t cgid; /* Effective GID of creator */ unsigned short mode; /* Permissions */ unsigned short seq; /* Sequence number */ }; |
成员变量 |
成员变量1:[输入|输出|输入&输出],成员变量说明。 成员变量2:[输入|输出|输入&输出],成员变量说明。 …… |
其他说明 |
…… …… |
3 类库
3.1 类模板
3.2 list
头文件:#include <list>
assign() 给list赋值
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
clear() 删除所有元素
empty() 如果list是空的则返回true
end() 返回末尾的迭代器
erase() 删除一个元素
front() 返回第一个元素
get_allocator() 返回list的配置器
insert() 插入一个元素到list中
max_size() 返回list能容纳的最大元素数量
merge() 合并两个list
pop_back() 删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front() 在list的头部添加一个元素
rbegin() 返回指向第一个元素的逆向迭代器
remove() 从list删除元素
remove_if() 按指定条件删除元素
rend() 指向list末尾的逆向迭代器
resize() 改变list的大小
reverse() 把list的元素倒转
size() 返回list中的元素个数
sort() 给list排序
splice() 合并两个list
swap() 交换两个list
unique() 删除list中重复的元素
4 errno错误码
注意:数值在不同的操作系统上可能不一样。
EPERM (1) /* Operation not permitted */
ENOENT (2) /* No such file or directory */
ESRCH (3) /* No such process */
EINTR (4) /* Interrupted system call */
EIO (5) /* Input/output error */
ENXIO (6) /* No such device or address */
E2BIG (7) /* Argument list too long */
ENOEXEC (8) /* Exec format error */
EBADF (9) /* Bad file descriptor */
ECHILD (10)/* No child processes */
EDEADLK (11)/* Resource deadlock avoided */
ENOMEM (12)/* Cannot allocate memory */
EACCES (13)/* Permission denied */
EFAULT (14)/* Bad address */
ENOTBLK (15)/* Block device required */
EBUSY (16)/* Device or resource busy */
EEXIST (17)/* File exists */
EXDEV (18)/* Invalid cross-device link */
ENODEV (19)/* No such device */
ENOTDIR (20)/* Not a directory */
EISDIR (21)/* Is a directory */
EINVAL (22)/* Invalid argument */
EMFILE (24)/* Too many open files */
ENFILE (23)/* Too many open files in system */
ENOTTY (25)/* Inappropriate ioctl for device */
ETXTBSY (26)/* Text file busy */
EFBIG (27)/* File too large */
ENOSPC (28)/* No space left on device */
ESPIPE (29)/* Illegal seek */
EROFS (30)/* Read-only file system */
EMLINK (31)/* Too many links */
EPIPE (32)/* Broken pipe */
EDOM (33)/* Numerical argument out of domain */
ERANGE (34)/* Numerical result out of range */
EAGAIN (35)/* Resource temporarily unavailable */
#define EWOULDBLOCK EAGAIN /* Operation would block */
EINPROGRESS (36)/* Operation now in progress */
EALREADY (37)/* Operation already in progress */
ENOTSOCK (38)/* Socket operation on non-socket */
EDESTADDRREQ (39)/* Destination address required */
EMSGSIZE (40)/* Message too long */
EPROTOTYPE (41)/* Protocol wrong type for socket */
ENOPROTOOPT (42)/* Protocol not available */
EPROTONOSUPPORT (43)/* Protocol not supported */
ESOCKTNOSUPPORT (44)/* Socket type not supported */
EOPNOTSUPP (45)/* Operation not supported */
EPFNOSUPPORT (46)/* Protocol family not supported */
EAFNOSUPPORT (47)/* Address family not supported by protocol */
EADDRINUSE (48)/* Address already in use */
EADDRNOTAVAIL (49)/* Cannot assign requested address */
ENETDOWN (50)/* Network is down */
ENETUNREACH (51)/* Network is unreachable */
ENETRESET (52)/* Network dropped connection on reset */
ECONNABORTED (53)/* Software caused connection abort */
ECONNRESET (54)/* Connection reset by peer */
ENOBUFS (55)/* No buffer space available */
EISCONN (56)/* Transport endpoint is already connected */
ENOTCONN (57)/* Transport endpoint is not connected */
ESHUTDOWN (58)/* Cannot send after transport endpoint shutdown */
ETOOMANYREFS (59)/* Too many references: cannot splice */
ETIMEDOUT (60)/* Connection timed out */
ECONNREFUSED (61)/* Connection refused */
ELOOP (62)/* Too many levels of symbolic links */
ENAMETOOLONG (63)/* File name too long */
EHOSTDOWN (64)/* Host is down */
EHOSTUNREACH (65)/* No route to host */
ENOTEMPTY (66)/* Directory not empty */
EPROCLIM (67)/* Too many processes */
EUSERS (68)/* Too many users */
EDQUOT (69)/* Disk quota exceeded */
ESTALE (70)/* Stale NFS file handle */
EREMOTE (71)/* Object is remote */
EBADRPC (72)/* RPC struct is bad */
ERPCMISMATCH (73)/* RPC version wrong */
EPROGUNAVAIL (74)/* RPC program not available */
EPROGMISMATCH (75)/* RPC program version wrong */
EPROCUNAVAIL (76)/* RPC bad procedure for program */
ENOLCK (77)/* No locks available */
ENOSYS (78)/* Function not implemented */
EFTYPE (79)/* Inappropriate file type or format */
EAUTH (80)/* Authentication error */
ENEEDAUTH (81)/* Need authenticator */
ELAST (81)/* Must be equal largest errno */
EBACKGROUND (100)/* Inappropriate operation for background process */
EDIED (101)/* Translator died */
ED (102)/* ? */
EGREGIOUS (103)/* You really blew it this time */
EIEIO (104)/* Computer bought the farm */
EGRATUITOUS (105)/* Gratuitous error */
EILSEQ (106)/* Invalid or incomplete multibyte or wide character */
EBADMSG (107)/* Bad message */
EIDRM (108)/* Identifier removed */
EMULTIHOP (109)/* Multihop attempted */
ENODATA (110)/* No data available */
ENOLINK (111)/* Link has been severed */
ENOMSG (112)/* No message of desired type */
ENOSR (113)/* Out of streams resources */
ENOSTR (114)/* Device not a stream */
EOVERFLOW (115)/* Value too large for defined data type */
EPROTO (116)/* Protocol error */
ETIME (117)/* Timer expired */
ECANCELED (118)/* Operation canceled */
ENOTSUP (118)/* Not supported */