Linux环境下系统函数的使用

    技术2022-05-11  2

    Linux环境下系统函数的使用

    作者:zccst

    一.数学函数

    随即函数rand()

    函数原型:int rand(void)

    函数输入:无

    函数输出:2~21474836480RAND_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

     

    1getchar函数的解释

    getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)

    所以你在输入“12”回车后,“1”首先被读入,“2”和回车还在输入缓冲区里,被后面的getchar()依次读入。所以有这样的运行结果。

    这是getchar()使用的不方便的地方。解决方法:

    1)使用下面的语句清除回车:

    while(getchar()!='/n');

    2)用getche()getch()代替getchar(),其作用是从键盘读入一个字符(不用按回车),注意要包含头文件<conio.h>

     

    2getchargetch的区别

    getchar有一个int型的返回值.当程序调用getchar.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).getchar函数的返回值是用户输入的第一个字符的ASCII,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.

     

    getchgetchar基本功能相同,差别是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结构数据转换成从公元197011000 秒算起至今的UTC时间所经过的秒数。

     

    int settimeofday ( const struct timeval *tv,const struct timezone *tz);

    把目前时间设成由tv所指的结构信息,当地时区信息则设成tz所指的结构。详细的说明请参考gettimeofday()

    time_t time(time_t *t);

    返回从公元197011日的UTC时间从000秒算起到现在所经过的秒数。

     

    四.环境控制函数

    getenv()

    相关函数 :putenvsetenvunsetenv

    表头文件 :#include<stdlib.h>

    定义函数 :char * getenv(const char *name);

    函数说明 :getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为namevalue

    返回值 :执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL

    范例

    #include<stdlib.h>mian(){char *p;if((p = getenv(USER)))printf(USER=%sn,p);}

    执行

    USER = root

    putenv(改变或增加环境变量)

    相关函数 :getenvsetenvunsetenv

    表头文件 :#include4<stdlib.h>

    定义函数 :int putenv(const char * string);

    函数说明 :putenv()用来改变或增加环境变量的内容。参数string的格式为namevalue,如果该环境变量原先存在,则变量内容会依参数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=rootUSER=root

    setenv(改变或增加环境变量)

    相关函数 :getenvputenvunsetenv

    表头文件 :#include<stdlib.h>

    定义函数 :int setenv(const char *name,const char * value,int overwrite);

    函数说明 :setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。

    参数 :value 则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,而该环境变量原已有内容,则原内容会被改为参 数value所指的变量内容。如果overwrite0,且该环境变量已有内容,则参数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 = rootUSER = testUSER = (null)

     

    五.内存分配函数

        * kmalloc:这个用到很多。这个函数将会分配一片连续的物理内存。通常分配连续物理内存的好处就是构造页表的时候开销很低(通常线性地址加上一个偏移就是物理地址),同时访问起来效率也高。当然连续的物理内存也是很宝贵的资源。内核中使用的buddy algorithmslab机制都是为了尽量减少内存碎片,增加连续内存分配成功的几率。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为每个元素所占的字节数。

     

     


    最新回复(0)