Linux常用库函数
1 getopt()
getopt被用来解析命令行选项参数,就不用自己处理argv了。
头文件:#include <unistd.h>
原型:int getopt(int argc, char * const argv[], const char *optstring);
参数:optstring - 选项字符串
- 单个字符,表示选项;
- 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg;
- 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。
例1:optstring为"a:b:cd::e"。对应到命令行就是-a ,-b ,-c ,-d, -e ;其中a b d后面有冒号,则后面必须跟一个参数;而c e后面没有冒号,所有不用跟参数。比如-a 11或-a11,11表示a的参数。
头文件与之相关变量(不用自己定义,直接使用):
extern char *optarg; //选项的参数指针
extern int optind, //下一个检索位置:下一次调用getopt的时,从optind存储的位置处重新开始检查选项。
extern int opterr, //是否将错误信息输出到stderr:当opterr=0时,getopt不向stderr输出错误信息。
extern int optopt; //不在选项字符串optstring中的选项:当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt中,getop()返回'?’、
例1:
#include <stdio.h>
#include <unistd.h>int main(int argc, char **argv)
{int ch;while( (ch = getopt(argc, argv, "ab:c::")) != -1 ){switch(ch){case 'a':printf("option = a, optopt = %c, optarg = %s\n", optopt, optarg);break;case 'b':printf("option = b, optopt = %c, optarg = %s\n", optopt, optarg);break;case 'c':printf("option = c, optopt = %c, optarg = %s\n", optopt, optarg);break;case '?':printf("option =? , optopt = %c, optarg = %s\n", optopt, optarg);break;default:printf("default, ch = %c\n",ch);break;}}return 0;
}
例2:
#include <stdio.h>
#include <unistd.h>int main(int argc, char **argv)
{int ch;printf("optind:%d,opterr:%d\n",optind,opterr);while( (ch = getopt(argc, argv, "ab:c::")) != -1 ){printf("optind: %d\n", optind);switch(ch){case 'a':printf("option = a, optopt = %c, optarg = %s\n", optopt, optarg);break;case 'b':printf("option = b, optopt = %c, optarg = %s\n", optopt, optarg);break;case 'c':printf("option = c, optopt = %c, optarg = %s\n", optopt, optarg);break;case '?':printf("option =? , optopt = %c, optarg = %s\n", optopt, optarg);break;default:printf("default, ch = %c\n",ch);break;}}return 0;
}
又上面可以看出:optind和opterr的初始值都为1,opterr非零表示产生的错误要输出到stderr上。optind的初值为1是因为,main函数的那两个参数了,argc表示参数的个数,argv[]表示每个参数字符串,./test -a -b hello -cwlord,实际上真正的参数是用第二个-a 开始,也就是argv[1],所以optind的初始值为1;
2 getopt_long()
头文件:#include<getopt.h>
函数原型:int getopt_long(int argc, char * const argv[],const char *optstring, const struct option *longopts,int *longindex)
参数:optstring - 选项字符串
longopts - 是一个结构的实例
struct option {const char *name; /*name表示的是长参数名*/int has_arg; /*has_arg有3个值:1、no_argument(或者是0),表示该参数后面不跟参数值;2、required_argument(或者是1),表示该参数后面一定要跟个参数值3、optional_argument(或者是2),表示该参数后面可以跟,也可以不跟参数值*/int *flag; /*用来决定,getopt_long()的返回值到底是什么。如果flag是null,则函数会返回与 该项option匹配的val值*/int val; /*和flag联合决定返回值*/ }
longindex - 如果longindex非空,它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值
#include <stdio.h>
#include <unistd.h>
#include<getopt.h>static struct option long_options[] ={{"add", no_argument, NULL, 'a'},{"back", required_argument, NULL, 'b'},{"create", required_argument, NULL, 'c'},{0, 0, 0, 0},};int main(int argc, char **argv)
{int ch;int option_index = 0;printf("optind:%d,opterr:%d\n",optind,opterr);while( (ch = getopt_long(argc, argv, "ab:c::",long_options, &option_index)) != -1 ){printf("optind: %d\n", optind);switch(ch){case 'a':printf("option = a, optopt = %c, optarg = %s\n", optopt, optarg);break;case 'b':printf("option = b, optopt = %c, optarg = %s\n", optopt, optarg);break;case 'c':printf("option = c, optopt = %c, optarg = %s\n", optopt, optarg);break;case '?':printf("option =? , optopt = %c, optarg = %s\n", optopt, optarg);break;default:printf("default, ch = %c\n",ch);break;}printf ("option %s\n", long_options[option_index].name);}return 0;
}
3 dlopen()
dlopen() 功能是以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程。使用dlclose()来卸载打开的库。
dlopen这个函数加载由以null结尾的字符串文件名命名的动态共享对象(共享库)文件,并为加载的对象返回不透明的“句柄”。此句柄与 dlopen API 中的其他函数一起使用,例如dlsym(),dladdr(),dlinfo()和dlclose()
#include <dlfcn.h>
void *dlopen(const char *filename, int flags);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
char *dlerror(void);
参数:
- filename:库路径;
- flags:标志指明是否立刻计算库的依赖性
- RTLD_LAZY:立刻计算库的依赖性;
- RTLD_NOW:在需要的时候才计算库的依赖性;
- handle:由dlopen打开动态链接库后返回的指针;
- symbol:是要求获取的函数的名称,函数返回值是void*,指向函数的地址,供调用使用
注意:编译时候要加入 -ldl (指定dl库) -rdynamic(通知链接器将所有符号添加到动态符号表中(目的是能够通过使用 dlopen 来实现向后跟踪)
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>#define LIB_PATH "./libsd.so"typedef int (*Callback_func)(int, int);int main()
{void *dlhandler;char *error;Callback_func func = NULL;dlhandler = dlopen(LIB_PATH, RTLD_LAZY);if(dlhandler == NULL){fprintf(stderr,"%s\n",dlerror());exit(-1);}dlerror();func = dlsym(dlhandler,"sumab");printf("%d\n",func(1,2));dlclose(dlhandler);return 0;
}
4 fstatfs/statfs
#include <sys/vfs.h> /* or <sys/statfs.h> */
int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);参数:
- path: 位于需要查询信息的文件系统的文件路径名。
- fd: 位于需要查询信息的文件系统的文件描述词。
- buf:以下结构体的指针变量,用于储存文件系统相关的信息
struct statfs {long f_type; /* 文件系统类型 */long f_bsize; /* 经过优化的传输块大小,剩余空间大小k */long f_blocks; /* 文件系统数据块总数 */long f_bfree; /* 可用块数 */long f_bavail; /* 非超级用户可获取的块数 */long f_files; /* 文件结点总数 */long f_ffree; /* 可用文件结点数 */fsid_t f_fsid; /* 文件系统标识 */long f_namelen; /* 文件名的最大长度 */ };
返回说明:
- 成功执行时,返回0。失败返回-1.
#include <stdio.h>
#include <sys/vfs.h>int main()
{long totalBlocks = 0;long freeDisk = 0;const char *path = "/root/work/demo";struct statfs diskinfo;int ret = statfs(path, &diskinfo);if(ret != 0){printf("statfs error");}totalBlocks = diskinfo.f_bsize;freeDisk = diskinfo.f_bfree * totalBlocks; //剩余空间大小printf("totalBlocks = %ld, freeDisk = %ld\n",totalBlocks, freeDisk);return 0;
}
Linux常用库函数相关推荐
- Linux常用基础指令、Linux常用工具(软件包)使用带图详解
目录 目录相关指令: 文件相关指令: 压缩解压缩指令: 匹配查找指令: 权限相关指令: Linux常用工具: 指令使用规则:指令 [该指令的详细操作选项] [操作对象(通常有路径)],后面两可不加. ...
- Linux 常用工具(上)
Linux常用工具 一.软件包管理工具 yum 二.编辑器 vim (一)定义 (二)模式分类 (三)模式切换 (四)不同模式下的常见操作 三.编译器 gcc\g++ (一)编译过程 (二)指令 四. ...
- Linux常用命令和快捷键大全
Linux常用命令和快捷键大全 最近总结了以下常用的Linux命令和快捷键,用于以后遗忘时方便快速查询,也可以反复观看,加深印象 Linux常用命令 命令 功能说明 线上查询及帮助命令(2个) man ...
- linux常用命令(转载)
Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短 ...
- mysql ls命令,Linux 常用 ls命令详解
ls命令是linux常用命令之一,用于在命令控制台提示符中列出目录和文件信息. 一.ls命令用法: ls命令运行在命令提示符终端,用法如下.其中[选项]和为可选参数,可以一零个或者多个选项:[文件]也 ...
- Linux常用20条命令
Linux常用20条命令 假装这里有个标题 1.cd 2.ls 3.grep 4.find 5.cp 6.mv 7.rm 8.ps 9.kill 10.kill all 11.file 12.tar ...
- Linux 常用的压缩与解压缩命令详解
Linux 常用的压缩与解压缩命令有:tar.gzip.gunzip.bzip2.bunzip2.compress .uncompress. zip. unzip.rar.unrar 等. tar 最 ...
- linux常用命令汇总
linux常用命令汇总,以便需要时快速查询 中文释义 相应命令 备注 在文件中查找 grep error catalina.out 在catalina.out文件中查找error信息 重启nginx ...
- 计算机二级c常用函数,计算机等级考试二级C语言的常用库函数试题
计算机等级考试二级C语言的常用库函数试题 计算机等级考试二级C语言的常用库函数试题 settextstyle()显示字符的当前设置函数 功能:设置当前输出英文字符的字体.大小和方向. 调用方式: vo ...
最新文章
- Vue单文件组件的使用
- java 双调旅行商 hamiltonian,双调欧几里得旅行商问题(TSP)
- mysql 5.7临时表空间_深度解析MySQL 5.7之临时表空间
- pymysql Key error:255的解决办法
- ajax跨域服务器404,Ajax和跨域
- Pessimistic Error Pruning example of C4.5
- iPhone开发笔记[1/50]:初学iPhone上用Quartz 2D画图
- 怎么才能显示Eclipse中ConSole的全部输出内容
- java 中关键字_java中关键字一览
- MPD2011 深圳站 徐锋《手机(及互联网产品)可以做得更好》要点纪要
- 【Oracle】非RMAN恢复数据文件、控制文件
- 杨辉三角c语言if 编程,杨辉三角_用c语言怎么编程
- 推荐系统算法工程师-从入门到就业
- 平面几何----用角平分线逆定理证明阿氏圆定理
- Unity手游性能测评报告——MOBA篇
- 基于低代码平台(Low Code Platform)开发中小企业信息化项目
- Vue快速入门(狂神版)
- 成都旅游住宿购物交通攻略617
- USB gadget(1)----controller driver
- html页面证书过期,网页上的完全证书过期过失效怎么处理
热门文章
- 雷军:你写程序有写诗一样的感觉吗?没有就做产品经理吧
- JSON快速学习入门
- Grunt视频-佟刚-专题视频课程
- vim操作方式的PDF阅读器 okular
- android制作3d打印机,基于Rayland主板的3D打印机指令控制Android(部分)实现
- jpeg2000(j2k)图像编码解码:c++实现openjpeg内存流接口(memory stream)
- Module 模块化
- OAuth2学习(二)——OAuth2实战
- mxnet下载与使用
- 输入关键字的爬虫方法(运行环境python3)