第四章Linux编程环境相对比较简单,这一章介绍了与Linux编程开发中的一些相关知识。包括编程参数、环境变量、时间日期、临时文件、用户信息、日志与资源限制。
编程参数
编程参数上一章有做了简单的介绍,通过void main(int argc, char *argv[ ]) 来调用参数。对于比较简单的参数,我们可以简单通过数组argv[ ]来调用,如果是需要有选项功能,系统提供getopt()函数给我们进一步分析处理选项。
int getopt(int argc, char *const argv[], const char *optstring);
argc跟argv是main里面的参数,而optstring则是用来定义选项的,例如:getopt(argc, argv, "if:lr"),optstring定义的是允使用的选项,后面带有冒号(:)表明该选项后面需要带参数。
就如平常使用编译文件的命令: $ gcc -o bin/test test.c,明显选项o是一定要使用参数的,不然系统不知道把编译之后的结果存放在什么地方。要注意的是,使用了getopt()做了一次循环扫描之后,参数的顺序是会发生改变的。例如gcc test.c -o bin/test,执行完扫描之后argv[ ]参数的顺序变成了 gcc -o bin/test test.c,也即是说,optget()会把没有选项的参数都放到argv[ ]的最后面。
环境变量
关于系统的环境变量,主要有两个处理函数分别是:
#include <stdlib.h>
char *getenv(const char *name); 取得某个环境变量的值,如getenv("HOME")
int putenv(const char *string); 把一个形如"name=value"的东西输入到环境变量里面。
时间日期
时间在计算机里面的存储是长整形,表示的是从1970年1月1日 00:00到所指示时间点所经过的秒数,因此,这个时间只能精确到秒。
#include <time.h>
time_t time(time_t *tloc);
time函数可以获得当前计算机时间,这个函数可以通过参数也可以通过返回值来获取时间。即
the_time = time((time_t)NULL);
time(&the_time);
这两个式子的作用是一样的,都可以获取当前时间。
对于整形数,便于计算机处理,但对于人类,这个整数本身并没有带着太多我们可以理解的信息。所以需要进一步解析该整形数,变成人类易于理解的时间(包含年月日等信息)。
struct tm *gmtime(const time_t timeval); //获取计算机时间
struct tm *localtime(const time_t timeval); //获取当地时间
tm里面有tm_sec,tm_min, tim_hour, tm_mon, tm_year, tm_mday, tm_wday, tm_yday, tm_isdst这些参数,通过这些参数就能调用一个时间的点的年月日以及时分秒等。
临时文件
临时文件的创建很简单,使用tmpfile()就行,在使用完改文件之后,系统会自动删除。
#include <stdio.h>
FILE *tmpfile(void);
注意返回值是FILE类型,而不是int类型,所以创建后的文件只能用于标准文件处理函数(stdio.h),而不能用户低级文件处理函数(unistd.h)。
用户信息
在Linux中,用于存放用户信息的文件一般存放在/etc/passwd,该文件一般包括用户名,用户ID,用户组ID,用户HOME目录,用户shell启动程序等。例如下面就是passwd文件中的一条记录:
qitai:x:1002:1001:,,,:/home/qitai:/bin/bash
同时/etc下面还有一个文件是用来存储用户组信息的,/etc/group,例如下面一条记录
qitai:x:1001:
Linux中对用户信息查询处理其实就是对这两个文件的处理,有下面几个常用的函数。
#include <sys/types.h>
#include <unistd.h>
uid_t getuid(void); //读取当前登录的用户ID
char *getlogin(void); //读取当前登录用户名字
gid_t getgid(void); //读取当前登录用户组ID
系统日志
说到系统日志,就得谈谈日志记录里面的记录优先级,也就是日志信息的紧急程度。根据程度的又深到浅可以分为下面八种情况:
LOG_EMERG 超级紧急
LOG_ALERT 紧急警报,例如数据库崩溃
LOG_CRIT 比较严重的错误,例如硬件错误
LOG_ERR 普通错误
LOG_WARNING 警告
LOG_NOTICE 注意
LOG_INFO 信息
LOG_DEBUG 调试信息
记录系统日志通过下面函数即可实现:
#include <syslog.h>
void syslog(int priority, const char *message, arguments......);
优先级有上面八种情况可以选择,后面的信息跟printf();的用法一样。
资源管理
系统的资源主要包括内存资源跟CPU资源,因为硬件本身有原因,所以资源会有所限制。而且操作系统为了维持整个系统的稳定,也不会毫无限制地让你使用系统资源,也即是说,系统资源需要一个比较有效的管理。程序对资源的管理主要有两个方面,一个是优先级管理,一个是资源利用限制。由于资源操作都比较繁琐,这里就不多加叙述,感兴趣的可以查看下面的文章http://pubs.opengroup.org/onlinepubs/007908799/xsh/sysresource.h.html。
这里介绍一个很有用的函数,是用来获取系统使用资源的。
#include <sys/resource.h>
int getrusage(int who, struct rusage *r_usage);
who是一个常量,有两个值:RUSAGE_SELF、RUSAGE_CHILDREN(当前进程,跟包括子进程)
r_usage有下面两个量:struct timeval ru_utime , struct timeval ru_stime。
一个是程序执行的用户时间,一个是系统时间。用户时间是普通运算运行的时间,系统时间是程序进行系统调用时,切换到内核模式下,其所运行的时间。用户时间跟系统时间的具体区别,可参考https://engineering.purdue.edu/ECN/Support/KB/Docs/UserTimeVsSystemTime
第四章总体来说比较简单,知识点比较零碎。上面只是提到一些我觉得比较重要和要注意的地方,说到不对的地方,还请大家多多指教。