您的位置:首页 > 运维架构 > Linux

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

2011-04-10 00:10 155 查看
第四章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

第四章总体来说比较简单,知识点比较零碎。上面只是提到一些我觉得比较重要和要注意的地方,说到不对的地方,还请大家多多指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: