Linux环境下系统函数的使用
作者:zccst
一.数学函数
随即函数rand()
函数原型:int rand(void)
函数输入:无
函数输出:2~2147483648(0至RAND_MAX间)
头文件: #include <stdlib.h>
二.字符函数
字符测试函数如下:
函数名 | 功能 |
isalnum | 测试字符是否为英文或数字 |
Isalpha | 测试字符是否为英文字母 |
Isascii | 测试字符是否为ASCII码字符 |
Isctrl | 测试字符是否为ASCII码字符控制字符 |
Isdigit | 测试字符是否为阿拉伯字符 |
Islower | 测试字符是否为小写字母 |
Isprint | 测试字符是否为可打印字符 |
Isspace | 测试字符是否为空格字符 |
Ispunct | 测试字符是否为标点符号或特殊字符 |
Isupper | 测试字符是否为大写字母 |
isxdigit | 测试字符是否为16进制数字 |
为说明其使用方法,选isupper为例说明,其他类同。
函数原型:int isupper(int c)
函数功能:测试字符是否为大写字母
参数输入:字符
函数返回:TRUE(ABC……XYZ),NULL(非大写字母)
头文件: #include <ctype.h>
备注: 此为宏定义,并非真正函数。
例子:从键盘读入一行字符,测试读入字符是否为大写字符。
vi testupper 编辑源码
#include "stdio.h"
#include <ctype.h>
main()
{
char c;
while((c=getchar()) != '/n')
if(isupper(c))
printf("%c is an uppercase character/n", c);
}
输出结果:
[root@localhost 3-4]# ./testupper
Welcome To BeiJing
W is an uppercase character
T is an uppercase character
B is an uppercase character
J is an uppercase character
注1:getchar函数的解释
getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)。
所以你在输入“12”回车后,“1”首先被读入,“2”和回车还在输入缓冲区里,被后面的getchar()依次读入。所以有这样的运行结果。
这是getchar()使用的不方便的地方。解决方法:
(1)使用下面的语句清除回车:
while(getchar()!='/n');
(2)用getche()或getch()代替getchar(),其作用是从键盘读入一个字符(不用按回车),注意要包含头文件<conio.h> 。
注2:getchar和getch的区别
getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回,getch返回值是用户输入的ASCII码,出错返回-1.输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行.
简单的说,getch()是读取按键值常放在程序末尾起暂停作用而getchar()是从标准输入设备读取下一个字符~~所读字符若文件结束或出错则返回-1
下面的链接有这些函数更详细的注释及实例,请参阅:
http://tieba.baidu.com/f?kz=176949561
http://man.chinaunix.net/develop/c&c++/linux_c/default.htm
三.系统时间与日期函数
系统时间与日期函数如下:
函数名 | 功能 |
char * asctime(const struct tm * timeptr); | 参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。 例:Fri Sep 18 07:21:50 2009 |
char *ctime(const time_t *timep); | 将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。 |
int gettimeofday ( struct timeval * tv , struct timezone * tz ) | 把目前的时间有tv所指的结构返回,当地时区的信息则放到tz所指的结构中。 |
struct tm*gmtime(const time_t*timep); | 将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回。 |
struct tm *localtime(const time_t * timep); | 将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回。 |
time_t mktime(strcut tm * timeptr); | 将参数timeptr所指的tm结构数据转换成从公元1970年1月1日0时0分0 秒算起至今的UTC时间所经过的秒数。
|
int settimeofday ( const struct timeval *tv,const struct timezone *tz); | 把目前时间设成由tv所指的结构信息,当地时区信息则设成tz所指的结构。详细的说明请参考gettimeofday()。 |
time_t time(time_t *t); | 返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数。 |
四.环境控制函数
getenv()
相关函数 :putenv,setenv,unsetenv
表头文件 :#include<stdlib.h>
定义函数 :char * getenv(const char *name);
函数说明 :getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为name=value。
返回值 :执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。
范例
#include<stdlib.h>
mian()
{
char *p;
if((p = getenv(“USER”)))
printf(“USER=%sn”,p);
}
执行
USER = root
相关函数 :getenv,setenv,unsetenv
表头文件 :#include4<stdlib.h>
定义函数 :int putenv(const char * string);
函数说明 :putenv()用来改变或增加环境变量的内容。参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。
返回值 :执行成功则返回0,有错误发生则返回-1。
错误代码 :ENOMEM 内存不足,无法配置新的环境变量空间。
范例
#include<stdlib.h>
main()
{
char *p;
if((p = getenv(“USER”)))
printf(“USER =%sn”,p);
putenv(“USER=test”);
printf(“USER+5sn”,getenv(“USER”));
}
执行
USER=root
USER=root
相关函数 :getenv,putenv,unsetenv
表头文件 :#include<stdlib.h>
定义函数 :int setenv(const char *name,const char * value,int overwrite);
函数说明 :setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。
参数 :value 则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,而该环境变量原已有内容,则原内容会被改为参 数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。
返回值 :执行成功则返回0,有错误发生时返回-1。
错误代码 :ENOMEM 内存不足,无法配置新的环境变量空间
范例
#include<stdlib.h>
main()
{
char * p;
if((p=getenv(“USER”)))
printf(“USER =%sn”,p);
setenv(“USER”,”test”,1);
printf(“USER=%sn”,getenv(“USEr”));
unsetenv(“USER”);
printf(“USER=%sn”,getenv(“USER”));
}
执行
USER = root
USER = test
USER = (null)
五.内存分配函数
* kmalloc:这个用到很多。这个函数将会分配一片连续的物理内存。通常分配连续物理内存的好处就是构造页表的时候开销很低(通常线性地址加上一个偏移就是物理地址),同时访问起来效率也高。当然连续的物理内存也是很宝贵的资源。内核中使用的buddy algorithm和slab机制都是为了尽量减少内存碎片,增加连续内存分配成功的几率。kmalloc有很多mode,比如说GFP_KERNEL, GFP_ATOMIC。这些mode其实是一些更细节的flag的组合,比如说 GFP_KERNEL 就是 __GFP_WAIT | __GFP_IO | __GFP_FS ; 而 GFP_ATOMIC 就是 __GFP_HIGH。在一些中断处理中需要内存分配立刻返回,这样就需要不同的kmalloc 模式。这些flag具体的意思可以参考LDD3的第八章。
* kmem_cache:这个是Linux内核Slab机制提供的特殊的内存分配函数。“slab”直译过来就是“水泥预制板”:) 其实这个名字非常的形象。内核中经常要分配一些常用的struct,比如说filp, task_struct, file等等。Slab是一个lookaside cache机制,在内存中会创建一个memory pool。这个pool里面当然就是这些指定大小的object。这样分配或者释放起来都很高效(省去了内存分配和初始化的过程)。
* __get_free_pages:是直接获取整页的内存(页数是2的幂)。其实kmalloc在实现的时候也调用了这个函数。当需要分配大量的内存的时候,使用这个函数能够提高效率。
* vmalloc:这个函数分配一片连续的“虚拟内存”。也就是说返回的线性地址虽然是连续的,但是映射到的物理内存是不连续的,而且跟物理地址可能不是一一对应的(不同于kmalloc和__get_free_pages)。所以在使用分配到的内存时,页表的查询比较频繁,所以效率相对较低。但是 LDD3中提到了Linux内核在create_module的时候,采用的就是vmalloc。我看了看/proc/kallsyms,我load的 module里面的symbol确实都分布在不同的内存区域。
六.数据结构中常用函数
函数名 | 功能 |
void *bsearch(const void *key,const void *base,size_t nmemb,size_tsize,int (*compar) (const void*,const void*)); | 二分法搜索(从排好序的数组中查找数据) |
void *lfind (const void *key,const void *base,size_t *nmemb,size_t size,int(* compar) (const void * ,const void *)); | 线性搜索(在数组中从头至尾逐项找一遍) |
void qsort(void *base, size_t nmemb, size_t size,int(*compar)(const void *, const void *)); | 它根据compar所指向的函数所提供的顺序对base所指向的数组进行排序,nmemb为参加排序的元素个数,size为每个元素所占的字节数。 |