Beginning Linux Programming 笔记(四)Linux编程环境

来源:互联网 发布:软件项目助理 升职 编辑:程序博客网 时间:2024/05/17 08:09

     第四章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

      第四章总体来说比较简单,知识点比较零碎。上面只是提到一些我觉得比较重要和要注意的地方,说到不对的地方,还请大家多多指教。 

原创粉丝点击