1 getopt()

getopt被用来解析命令行选项参数,就不用自己处理argv了。

头文件:#include <unistd.h>

原型:int getopt(int argc, char * const argv[], const char *optstring);

参数:optstring - 选项字符串

  1. 单个字符,表示选项;
  2. 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg;
  3. 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。

例1:optstring为"a:b:cd::e"。对应到命令行就是-a ,-b ,-c ,-d, -e ;其中a b d后面有冒号,则后面必须跟一个参数;而c e后面没有冒号,所有不用跟参数。比如-a 11或-a11,11表示a的参数。

头文件与之相关变量(不用自己定义,直接使用):

  1. extern char *optarg; //选项的参数指针

  2. extern int optind, //下一个检索位置:下一次调用getopt的时,从optind存储的位置处重新开始检查选项。

  3. extern int opterr, //是否将错误信息输出到stderr:当opterr=0时,getopt不向stderr输出错误信息。

  4. 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);

参数:

  1. filename:库路径;
  2. flags:标志指明是否立刻计算库的依赖性
    1. RTLD_LAZY:立刻计算库的依赖性;
    2. RTLD_NOW:在需要的时候才计算库的依赖性;
  3. handle:由dlopen打开动态链接库后返回的指针;
  4. 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);

参数:

  1. path: 位于需要查询信息的文件系统的文件路径名。
  2. fd: 位于需要查询信息的文件系统的文件描述词。
  3. 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常用库函数相关推荐

  1. Linux常用基础指令、Linux常用工具(软件包)使用带图详解

    目录 目录相关指令: 文件相关指令: 压缩解压缩指令: 匹配查找指令: 权限相关指令: Linux常用工具: 指令使用规则:指令 [该指令的详细操作选项] [操作对象(通常有路径)],后面两可不加. ...

  2. Linux 常用工具(上)

    Linux常用工具 一.软件包管理工具 yum 二.编辑器 vim (一)定义 (二)模式分类 (三)模式切换 (四)不同模式下的常见操作 三.编译器 gcc\g++ (一)编译过程 (二)指令 四. ...

  3. Linux常用命令和快捷键大全

    Linux常用命令和快捷键大全 最近总结了以下常用的Linux命令和快捷键,用于以后遗忘时方便快速查询,也可以反复观看,加深印象 Linux常用命令 命令 功能说明 线上查询及帮助命令(2个) man ...

  4. linux常用命令(转载)

    Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短 ...

  5. mysql ls命令,Linux 常用 ls命令详解

    ls命令是linux常用命令之一,用于在命令控制台提示符中列出目录和文件信息. 一.ls命令用法: ls命令运行在命令提示符终端,用法如下.其中[选项]和为可选参数,可以一零个或者多个选项:[文件]也 ...

  6. 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 ...

  7. Linux 常用的压缩与解压缩命令详解

    Linux 常用的压缩与解压缩命令有:tar.gzip.gunzip.bzip2.bunzip2.compress .uncompress. zip. unzip.rar.unrar 等. tar 最 ...

  8. linux常用命令汇总

    linux常用命令汇总,以便需要时快速查询 中文释义 相应命令 备注 在文件中查找 grep error catalina.out 在catalina.out文件中查找error信息 重启nginx ...

  9. 计算机二级c常用函数,计算机等级考试二级C语言的常用库函数试题

    计算机等级考试二级C语言的常用库函数试题 计算机等级考试二级C语言的常用库函数试题 settextstyle()显示字符的当前设置函数 功能:设置当前输出英文字符的字体.大小和方向. 调用方式: vo ...

最新文章

  1. Vue单文件组件的使用
  2. java 双调旅行商 hamiltonian,双调欧几里得旅行商问题(TSP)
  3. mysql 5.7临时表空间_深度解析MySQL 5.7之临时表空间
  4. pymysql Key error:255的解决办法
  5. ajax跨域服务器404,Ajax和跨域
  6. Pessimistic Error Pruning example of C4.5
  7. iPhone开发笔记[1/50]:初学iPhone上用Quartz 2D画图
  8. 怎么才能显示Eclipse中ConSole的全部输出内容
  9. java 中关键字_java中关键字一览
  10. MPD2011 深圳站 徐锋《手机(及互联网产品)可以做得更好》要点纪要
  11. 【Oracle】非RMAN恢复数据文件、控制文件
  12. 杨辉三角c语言if 编程,杨辉三角_用c语言怎么编程
  13. 推荐系统算法工程师-从入门到就业
  14. 平面几何----用角平分线逆定理证明阿氏圆定理
  15. Unity手游性能测评报告——MOBA篇
  16. 基于低代码平台(Low Code Platform)开发中小企业信息化项目
  17. Vue快速入门(狂神版)
  18. 成都旅游住宿购物交通攻略617
  19. USB gadget(1)----controller driver
  20. html页面证书过期,网页上的完全证书过期过失效怎么处理

热门文章

  1. 雷军:你写程序有写诗一样的感觉吗?没有就做产品经理吧
  2. JSON快速学习入门
  3. Grunt视频-佟刚-专题视频课程
  4. vim操作方式的PDF阅读器 okular
  5. android制作3d打印机,基于Rayland主板的3D打印机指令控制Android(部分)实现
  6. jpeg2000(j2k)图像编码解码:c++实现openjpeg内存流接口(memory stream)
  7. Module 模块化
  8. OAuth2学习(二)——OAuth2实战
  9. mxnet下载与使用
  10. 输入关键字的爬虫方法(运行环境python3)