炫彩好望角 The Colorful Cape of Good Hope

庸人不必自扰,智者何需千虑?

常用链接

统计

最新评论

Linux 编程学习笔记 02——Linux 环境

上次忘了说,我的学习顺序是按照《Beginning Linux Programming, 4th Edition》(以后简称《BLP》)这本书来的,同时参照官方文档《The GNU C Library Reference Manual》(以后简称《GLIBC》)和 man。这次是第四章《The Linux Environment》的学习笔记。

程序参数

没什么特别,主要是 int getopt(int argc, char** argv, const char* options)int getopt_long(int argc, char* const* argv, const char* shortopts, const struct option* longopts, int* indexptr) 这两个用于解析命令行参数的使用。只要按照规范定义参数,就可以很方便地进行解析。怎么 Java 就没有提供类似的方法呢?

环境变量

要设置一个环境变量,《BLP》只讲了 int putenv(char* string) 函数。根据《GLIBC》和 man 的描述,调用此函数后,string 就变成了环境的一部分,对它所做的任何更改,不论对键还是对值,都将自动反映到环境中,这就要求 string 的生命周期不能在该环境变量被删除之前结束,否则可能出错。例如:

        char env[] = "a=b";
        putenv(env);
        printf("%s\n", getenv("a"));       // 输出“b”。

        env[2] = 'z';
        printf("%s\n", getenv("a"));       // 输出“z”。

        env[0] = 'x';
        // printf("%s\n", getenv("a"));    // 程序崩溃……
        printf("%s\n", getenv("x"));       // 输出“z”。
    

从《GLIBC》可以查到另两个用起来更为安全可靠的函数: int setenv(const char* name, const char* value, int replace)int unsetenv(const char* name)

可通过 extern char** environ 遍历所有的环境变量,但是最好不要直接使用此变量进行迭代,而是创建一个副本,可避免影响程序的其他部分。

时间和日期

《BLP》只讲了精确到秒的 time_t time(time_t* tloc)。《GLIBC》指出 sys/time.h 中声明了用来获取更高精度的结构体 timeval 和函数 int gettimeofday(struct timeval* tp, struct timezone* tzp)timeval 定义了表示整秒数的成员 tv_sec 和表示剩余毫微秒数的成员 tv_usec,其中 tv_usec 不超过一百万,所以两者加起来就是实际的时间。由于 timezone 结构体已被废弃,而且不再被 GNU 支持,所以 gettimeofday 的第二个参数只能设为 NULL,否则 errno 会被置为 ENOSYS(Function not implemented)。例如:

        time_t now = time(NULL);
        struct timeval tvnow;
        gettimeofday(&tvnow, NULL);

        printf("%jd\n", (intmax_t) now);       // 输出“1304649729”。
        printf("%jd.%06ju\n", (intmax_t) tvnow.tv_sec,
                (uintmax_t) tvnow.tv_usec);    // 输出“1304649729.644344”。
    

临时文件

最好不要先使用 char* tmpnam(char* s)char* mktemp(char* template) 生成“随机”字符串,再创建相应文件,因为在创建文件前,有可能其他程序也生成了相同的字符串,从而导致冲突。应当使用 FILE* tmpfile(void)int mkstemp(char* template) 直接生成文件——前者的好处所创建的临时文件在关闭时会被自动删除,但却无法取得文件名;后者能得到文件名,但必须手动删除。

用户信息

在我的 Debian 上,char* getlogin(void) 不能正确工作,errno 给出的原因是“No such file or directory”。具体哪个文件没找到没搞清楚,不过 man 已经指出此函数不安全,不用为妙。通过 uid_t getuid(void)struct passwd* getpwuid(uid_t uid) 可以得到当前用户的详细信息。

主机信息

掌握 int uname(struct utsname* name) 就差不多了。

日志记录

遗憾的是,Linux 本身只提供了写入系统日志的函数,而没有类似 java.util.Logger 那种通用接口。

资源和限制

除了偶尔测试一下算法的性能,也许只有专业性能分析工具才用得上这些东西吧。

posted on 2011-05-06 11:06 蜀山兆孨龘 阅读(1916) 评论(2)  编辑 收藏 引用 所属分类: Linux

评论

# re: Linux 编程学习笔记 02——Linux 环境 2011-05-06 12:59 wales

關於syslog可以看看syslog-ng的資料  回复  更多评论   

# re: Linux 编程学习笔记 02——Linux 环境 2011-05-12 13:35 mbt scarpe

I see that you are using Wordpress on your blog, wordpress is the best.  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理