炫彩好望角 The Colorful Cape of Good Hope

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

导航

公告

人气
神奇好望角
The Magical Cape of Good Hope

留言簿(1)

随笔分类(7)

随笔档案(7)

阅读排行榜

评论排行榜

常用链接

统计

最新评论

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 蜀山兆孨龘 阅读(1933) 评论(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   博问   Chat2DB   管理