Linux环境下系统函数的使用

来源:互联网 发布:太平洋手机炒股软件 编辑:程序博客网 时间:2024/05/17 03:50

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=root
USER=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 = root
USER = test
USER = (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为每个元素所占的字节数。