• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            炫彩好望角 The Colorful Cape of Good Hope

            庸人不必自擾,智者何需千慮?

            常用鏈接

            統(tǒng)計(jì)

            最新評論

            Linux 編程學(xué)習(xí)筆記 02——Linux 環(huán)境

            上次忘了說,我的學(xué)習(xí)順序是按照《Beginning Linux Programming, 4th Edition》(以后簡稱《BLP》)這本書來的,同時(shí)參照官方文檔《The GNU C Library Reference Manual》(以后簡稱《GLIBC》)和 man。這次是第四章《The Linux Environment》的學(xué)習(xí)筆記。

            程序參數(shù)

            沒什么特別,主要是 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) 這兩個(gè)用于解析命令行參數(shù)的使用。只要按照規(guī)范定義參數(shù),就可以很方便地進(jìn)行解析。怎么 Java 就沒有提供類似的方法呢?

            環(huán)境變量

            要設(shè)置一個(gè)環(huán)境變量,《BLP》只講了 int putenv(char* string) 函數(shù)。根據(jù)《GLIBC》和 man 的描述,調(diào)用此函數(shù)后,string 就變成了環(huán)境的一部分,對它所做的任何更改,不論對鍵還是對值,都將自動反映到環(huán)境中,這就要求 string 的生命周期不能在該環(huán)境變量被刪除之前結(jié)束,否則可能出錯。例如:

                    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》可以查到另兩個(gè)用起來更為安全可靠的函數(shù): int setenv(const char* name, const char* value, int replace)int unsetenv(const char* name)。

            可通過 extern char** environ 遍歷所有的環(huán)境變量,但是最好不要直接使用此變量進(jìn)行迭代,而是創(chuàng)建一個(gè)副本,可避免影響程序的其他部分。

            時(shí)間和日期

            《BLP》只講了精確到秒的 time_t time(time_t* tloc)。《GLIBC》指出 sys/time.h 中聲明了用來獲取更高精度的結(jié)構(gòu)體 timeval 和函數(shù) int gettimeofday(struct timeval* tp, struct timezone* tzp)。timeval 定義了表示整秒數(shù)的成員 tv_sec 和表示剩余毫微秒數(shù)的成員 tv_usec,其中 tv_usec 不超過一百萬,所以兩者加起來就是實(shí)際的時(shí)間。由于 timezone 結(jié)構(gòu)體已被廢棄,而且不再被 GNU 支持,所以 gettimeofday 的第二個(gè)參數(shù)只能設(shè)為 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”。
                

            臨時(shí)文件

            最好不要先使用 char* tmpnam(char* s)char* mktemp(char* template) 生成“隨機(jī)”字符串,再創(chuàng)建相應(yīng)文件,因?yàn)樵趧?chuàng)建文件前,有可能其他程序也生成了相同的字符串,從而導(dǎo)致沖突。應(yīng)當(dāng)使用 FILE* tmpfile(void)int mkstemp(char* template) 直接生成文件——前者的好處所創(chuàng)建的臨時(shí)文件在關(guān)閉時(shí)會被自動刪除,但卻無法取得文件名;后者能得到文件名,但必須手動刪除。

            用戶信息

            在我的 Debian 上,char* getlogin(void) 不能正確工作,errno 給出的原因是“No such file or directory”。具體哪個(gè)文件沒找到?jīng)]搞清楚,不過 man 已經(jīng)指出此函數(shù)不安全,不用為妙。通過 uid_t getuid(void)struct passwd* getpwuid(uid_t uid) 可以得到當(dāng)前用戶的詳細(xì)信息。

            主機(jī)信息

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

            日志記錄

            遺憾的是,Linux 本身只提供了寫入系統(tǒng)日志的函數(shù),而沒有類似 java.util.Logger 那種通用接口。

            資源和限制

            除了偶爾測試一下算法的性能,也許只有專業(yè)性能分析工具才用得上這些東西吧。

            posted on 2011-05-06 11:06 蜀山兆孨龘 閱讀(1952) 評論(2)  編輯 收藏 引用 所屬分類: Linux

            評論

            # re: Linux 編程學(xué)習(xí)筆記 02——Linux 環(huán)境 2011-05-06 12:59 wales

            關(guān)於syslog可以看看syslog-ng的資料  回復(fù)  更多評論   

            # re: Linux 編程學(xué)習(xí)筆記 02——Linux 環(huán)境 2011-05-12 13:35 mbt scarpe

            I see that you are using Wordpress on your blog, wordpress is the best.  回復(fù)  更多評論   

            国产精品乱码久久久久久软件| 久久99精品久久久久久水蜜桃| 99999久久久久久亚洲| 色综合久久久久综合99| 久久久久99精品成人片牛牛影视| 99久久精品国产高清一区二区| 久久中文骚妇内射| 久久国产劲爆AV内射—百度| 亚洲国产精品无码久久久久久曰| 久久AV高清无码| 亚洲色欲久久久综合网| 亚洲国产综合久久天堂| 中文字幕无码久久精品青草| 免费精品国产日韩热久久| 亚洲国产高清精品线久久 | 久久精品亚洲精品国产色婷| 一本久久知道综合久久| 伊人久久大香线蕉精品不卡 | 亚洲精品无码久久久久AV麻豆| 久久亚洲精品无码AV红樱桃| 久久久久四虎国产精品| 国产成人精品综合久久久| 一本久道久久综合狠狠躁AV| 久久棈精品久久久久久噜噜| 久久精品aⅴ无码中文字字幕不卡| 久久er99热精品一区二区| 精品久久久久久无码中文野结衣| 久久天天躁狠狠躁夜夜av浪潮 | 日韩人妻无码精品久久久不卡 | 久久免费精品一区二区| 久久久中文字幕日本| 久久久久精品国产亚洲AV无码| 精品国际久久久久999波多野| 国产综合成人久久大片91| 综合久久给合久久狠狠狠97色| 久久国产精品一区二区| 伊色综合久久之综合久久| 亚洲国产成人久久综合一| 久久婷婷五月综合97色直播| 国产成人久久精品麻豆一区| 久久久久99精品成人片欧美|