linux中C语言的扩展库函数.docx
- 文档编号:4628788
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:14
- 大小:20.70KB
linux中C语言的扩展库函数.docx
《linux中C语言的扩展库函数.docx》由会员分享,可在线阅读,更多相关《linux中C语言的扩展库函数.docx(14页珍藏版)》请在冰豆网上搜索。
linux中C语言的扩展库函数
c语言标准库函数
参考网页:
参考书:
《嵌入式Linux上的C语言编程实践》
其实在参考网页里,你已经可以找到所有C语标准库函数。
这里我只罗列我所学到的:
C语言的标准库函数集合有:
标准输入输出函数集合.
判断字符类型(是否大写,数字,空格)的函数集合.
操作字符串的函数集合.
数学应用相关函数集合.
工具集,包括类型转换和一些系统函数.
增加断言功能的集合.
不定参数的工具包.例如printf函数就用到此包.
支持函数跳转功能的集合.
处理中断的集合.
处理日期和时间的集合.
整数类型最大值和最小值集合.和具体实现有关.
浮点类型最大值和最小值集合.和具体实现有关.
1.标准格式化输入、输出类函数
涉及的头文件有stdio.h和stdarg.h
*scanf函数:
格式化输入字符串
*printf函数:
格式化输出字符串
*putchar函数:
输出字符到标准输出
*getchar函数:
从标准输入获取字符
*putc函数:
向文件输出字符
*getc函数:
从文件输入字符
while((c=getchar()!
=EOF)) putchar(c)
c=getc(pFile)
getchar()等价于getc(stdin)
*gets函数:
获得字符串
*puts函数:
输出指定字符串
*ungetc函数:
把字符写回流中
2.字符处理及转换函数
*sprintf函数:
格式化输出字符串到一个缓冲区
sprintf(s,"%d",123)
sprintf(s,"%08X",456) ;转16进制
sprintf(s,"%10.3f",3.1434)
*strcat和strncat函数:
字符串连接
char*strncat(char*dest,constchar*src,size_tn)
*strcpy和strncpy函数:
字符串复制
charstrncpy(char*dest,constchar*src,size_tmaxlen)
*strcmp和strncmp函数:
字符串比较
intstrcmp(constchar*s1,constchar*s2)
s1>s2 return1
s1=s2 return 0
s1 *strlen函数: 获取字符串长度 *strchr和strrchr函数: 字符/字符串定位 strchar: 定位一个字符第一次出现的位置 strrchr: 定位一个字符最后一次出现的位置 *strstr函数: 字符串查找 *strupr和strlwr函数: 字母形式转换 *strdup和strndup函数: 字符串复制 char*strdup(constchar*s) 将字符串s复制到指定的内存单元 3.数学计数类函数 divacosatancostancoshexpfrexpldexplogmodfpowsqrtceilabsfloor 4.数据结构和算法类函数 *bsearch函数: 二元搜索 *lfind函数: 线性搜索 *lsearch函数: 线性搜索 *qsort函数: 利用快速排序法排列数组 *rand函数: 产生随机数 5.文件I/O操作类相关函数 *fopen函数: 打开文件 *fclose函数: 关闭文件 *fgetc函数: 从文件中读取一个字符 fp=fopen("exit","r") while((c=fgetc(fp))! =EOF) *fputc函数: 将一指定字符写入文件流 *fgets函数: 从文件中读取一字符串 *fputs函数: 将一指定字符串写入文件内 *rewind函数: 重设文件流的读写位置为文件开头 *ftell函数: 取得文件流的读取位置 *fseek函数: 取得文件流的读取位置 *fwrite函数: 建文件写至文件流 *fread函数: 从文件流读取数据 *fgetpos函数: 获得文件位置 把stream的当前位置记录在*position中,供随后的fsetpos()调用使用 *fsetpos函数: 设置文件位置 6.工具函数 *assert函数: 程序诊断 *setjmp函数: 保存调用的 linux中C语言的扩展库函数 参考书: 《嵌入式Linux上的C语言编程实践》 1.文件I/O操作函数 *open函数: 打开文件 intopen(constchar*pathname,intflags) *close函数: 关闭文件 *read函数: 读文件 ssize_tread(int_fd,void*buf,size_tcount) 将fd所指的文件传送count个字节到buf指针所指的内存中。 *write函数: 写文件 ssize_twrite(intfd,constvoid*buf,size_tcount) 把以参数buf为起始的内存中的count个字节写入到参数fd所指的文件中,文件读写位置也会随之移动。 *lseek函数: 文件定位 off_tlseek(intfildes,off_toffset,intwhence); retuen当前的读写位置 *flock函数: 锁定文件 intflock(intfd,intoperation) *mmap函数和munmap函数: 内存映射 intmunmap(void*start,size_tlength) 将某个文件内容映射到内存中,对该内存区域的存取既是直接对该文件内容的读写。 *create函数: 创建新文件 intcreate(constchar*pathname,mode_tmode) *fcntl函数: 改变已打开的文件属性 intfcntl(intfields,intcmd,intarg) 若执行成功则返回新的描述符,否则返回-1 2.文件权限相关的操作函数 *access函数: 判断是否具有存取文件的权限 intaccess(constchar*pathname,intmode) if(0==access(argv[1],W_OK)) R_OKX_OKF_OK *chown函数和fchown函数: 改变文件的所有者 intfchown(intfd,uid_towner,gid_tgroup) *chmod函数和fchmod函数: 改变权限 intfchmod(intfildes,mode_tmode) *unlink函数: 删除文件 3.用户组操作函数 *getegid函数和setegid函数: 获得/设置有效的组识别码 gid_tgete(gid_tegid) *geteuid函数和seteuid函数: 获得/设置真实的用户识别码 uid_tgetuid(void) 4.信号类函数 *kill函数: 传送信号给指定的进程 intkill(pid_tpid,intsig) *rais函数: 信号发送 intraise(intsig) *alarm函数: 设置定时器 unsignedintalarm(unsignedintseconds) *signal函数: 信号安装函数 sighandler_tsignal(intsignum,sighandler_thandler) 5.进程处理函数 *getpid函数和getppid函数: 获得进程ID和父进程ID pid_tgetpid(void) pid_tgetppid(void) *fork函数: 建立子进程 pid_tfork(void) 父进程得到的返回值是子进程的进程号,而子进程则返回0 *sleep函数: 让进程暂停一段时间 unsignedintsleep(unsignedintseconds) *exec函数: 找到可执行文件 *_exit函数: 结束进程执行 动态内存的堆与栈 参考书: 《嵌入式Linux上的C语言编程实践》 1.程序内存区域的使用 存储区域分为: 静态和动态 静态: 只读数据区(RODATA),已初始化读写数据区(RWDATA),未初始化读写数据区(BSS) 动态: 堆内存(heap)和栈内存(stack) 堆内存是从低地址向高地址分配,栈内存是从高地址向低地址分配 2.C程序中栈空间的使用 在C语言程序中,栈空间是由编译器管理的,在程序中可以体现栈空间使用的例子是参数传递,返回值的使用以及自动变量的空间。 3.C程序中堆空间的使用 在C语言程序中,堆内存区域的分配和释放是通过调用库函数来完成的,他们的使用需要包含标准库文件: #include 实现堆内存分配和释放的四个主要函数为: void*malloc(size_tsize) 分配内存空间 voidfree(void*ptr) 释放内存空间 void*calloc(size_tnmemb,size_tsize) 分配内存空间 void*realloc(void*ptr,size_tsize) 重新分配内存空间 4.堆内存和栈内存使用的比较 最经典的swap例子: voidswap(inta,intb) { inttmp; tmp=b; b=a; a=tmp; return; } 这是无法实现swap的,因为,swap函数在调用时创建了一个新的栈空间,当栈返回后,这个栈区域已经被释放了。 所以,必须要用指针。 认真体会两个例子: typedefstruct_S100 { charstring[100]; }S100; voidfun_para1(S100a) { printf("Frompara: %s\n",a.string); strcpy(a.string,"-----"); printf("fun_para1change: %s\n",a.string); return; } voidtest_fun_para1(void) { S100a; strcpy(a.string,"+++++") fun_para1(a); printf("afterfun_para1return: %s\n",a.string); return; } 运行结果: Frompara: +++++ fun_para1change: ----- afterfun_para1return: +++++ voidfun_para3(chara[100]) { strcpy(a,"-----"); printf("fun_para1change: %s\n",a); retrun; } voidtest_fun_para3(void) { chara[100]; strcpy(a,"+++++"); fun_para3(a); printf("afterfun_para3return: %s\n",a); return; } 运行结果: frompara: +++++ fun_para1change: ----- afterfun_para3return: ----- 从运行的结果中,可以得出这样的结论: 在函数参数中使用结构体的时候,整个结构体被压入栈内存,和一般变量的情况一样。 数组在作为参数使用时,将被当做指针处理 函数指针的使用 参考书: 《嵌入式Linux上的C语言编程实践》 1.函数指针的概念: 在C语言中: 指针的本质是一个内存的地址,函数指针则是一个指向位于代码段的函数代码地址的指针。 对于函数来说,其地址和函数名称代表的含义是相同的。 在C语言编程中,数据结构和算法是两个基本的元素,通过函数指针,数据结构可以内嵌算法。 2.函数指针的使用 *最基本的用法: intadd(inta,intb) {....} intsub(inta,intb) {....} intmain() { int(*pf)(int,int); pf=add; result=pf(100,200); pf=sub; result=pf(100,200); } *类型转换: intadd(inta,intb) {....} intsub(inta,intb) {....} intmain() { void*pf; pf=add; result=(int(*)(int,int)pf)(100,200); pf=sub; result=(int(*)(int,int)pf)(100,200); } *函数指针的类型定义 typedefint(*fun_t)(int,int); fun_tpf; pf=add; result=pf(100,200); *函数指针作为结构体成员 structsource { inta; intb; fun_toperation ; //等价于int*fun_t(int,int); }; intmain(intargc,char*argv[]) { structsourcedata; intresult; data.a=200; data.b=100; data.operation=add; result=data.operation(data.a,data.b); } *函数指针作为函数的参数 intcalculate(inta,intb,fun_toperation) { intresult; result=operation(a,b); returnresult; } intmain(intargc,char*argv[]) { inta,b,result; a=200; b=100; result=calculate(a,b,add); } *函数指针作为函数的返回值 fun_tgetoperation(chara) { fun_tresult; switch(a) { case"+"; result=add; break; case"-"; result=sub; break; } returnresult; } intmain(intargc,char*argv[]) { inta,b,result; charoper; a=200; b=100; oper=’+’; result=getoperation(oper)(a,b); } *函数指针数组 enum{ oper_add=0, oper_sub } staticconstfun_toper_table[oper_num]= { add, sub } intmain(intargc,char*argv[]) { inta,b,result; a=200; b=100; result=oper_table[oper_add](a,b); } 、 回调函数 作为c语言来说,只有函数的说法。 因此不管是回调函数还是函数都是函数,在定义上是没有区别的。 置于在某些系统中,有些函数是你写并被你自己调用,这就是你说的“过程函数” 而另一些俄函数是由你来写但是在某些情况下不光由你来调用还可能被系统调用,这种函数就是“回调函数”。 既然在某些情况下,系统也要调用则这种函数在定义上必须符合系统预先定义的一些标准,比如窗口函数是最普遍的回调函数系统规定了这个函数必须有一个LRESULT的返回值,以及它需要的四个参数LRESULTfunction(hWnd,message,wParam,lParam)。 回调函数就是为系统提供一个接口,系统就会记录下这个函数的地址,当某个事件发生的时候,系统就可以调用你提供的这个接口干你想干的事情。 比如系统有这样一个功能: void注册开水报警器(void(*我的开水报警器)(void)); 我们自己写个函数: void我的开水报警器(void) { printf(“水开了! ! \n”); } 然后调用系统提供的接口注册我们的函数 开水注册报警器(我的开水报警器); 这样,指定事件发生的时候,就会调用我们自己写的函数。 回调函数(callback function)是一种供系统调用的函数。 在设置回调函数时,将你的回调函数的地址作为参数送给系统。 当系统调用时(如事件发生,启动功能...),就自动会执行你的回调函数。 程序本身不需要执行该函数。 常见的回调函数在 directX(OpenGL),Driver Design中要枚举驱动程序,显示模式等。 回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给 调用者从而实现调用。 回调函数使用是必要的,在我们想通过一个统一接口实现不 同的内容,这时用回掉函数非常合适。 比如,我们为几个不同的设备分别写了不同 的显示函数: voidTVshow();voidComputerShow();voidNoteBookShow()...等 等。 这是我们想用一个统一的显示函数,我们这时就可以用回掉函数了。 voidsho w(void(*ptr)());使用时根据所传入的参数不同而调用不同的回调函数。 不同的编程语言可能有不同的语法,下面举一个c语言中回调函数的例子, 其中一个回调函数不带参数,另一个回调函数带参数。 例子1: //Test.c #include #include intTest1() { inti; for(i=0;i<30;i++) { printf("The%dthcharactoris: %c\n",i,(char)('a'+i%26)); } return0; } intTest2(intnum) { inti; for(i=0;i { printf("The%dthcharactoris: %c\n",i,(char)('a'+i%26)); } return0; } voidCaller1(void(*ptr)())//指向函数的指针作函数参数 { (*ptr)(); } voidCaller2(intn,int(*ptr)())//指向函数的指针作函数参数,这里第一个参数是为指向函数的指针服务的, { //不能写成voidCaller2(int(*ptr)(intn)),这样的定义语法错误。 (*ptr)(n); return; } intmain() { printf("************************\n"); Caller1(Test1);//相当于调用Test2(); printf("&&&&&&************************\n"); Caller2(30,Test2);//相当于调用Test2(30); return0; } 以上通过将回调函数的地址传给调用者从而实现调用,但是需要注意的是带 参回调函数的用法。 要实现回调,必须首先定义函数指针。 函数指针的定义这里稍 微提一下。 比如: int(*ptr)();这里ptr是一个函数指针,其中(*ptr)的括号不能省略,因为 括号的优先级高于星号,那样就成了一个返回类型为整型的函数声明了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 语言 扩展 库函数