<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一江春水向東流

    做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks

    linux的c編程技巧

    1. 獲取文件的信息:
    stat(char* filename, struct stat* buf);
    struct stat {
    dev_t st_dev; /* 設備 */
    ino_t st_ino; /* 節點 */
    mode_t st_mode; /* 模式 */
    nlink_t st_nlink; /* 硬連接 */
    uid_t st_uid; /* 用戶ID */
    gid_t st_gid; /* 組ID */
    dev_t st_rdev; /* 設備類型 */
    off_t st_off; /* 文件字節數 */
    unsigned long st_blksize; /* 塊大小 */
    unsigned long st_blocks; /* 塊數 */
    time_t st_atime; /* 最后一次訪問時間 */
    time_t st_mtime; /* 最后一次修改時間 */
    time_t st_ctime; /* 最后一次改變時間(指屬性) */
    };

    struct statfs
    {
    long f_type; /* 文件系統類型 */
    long f_bsize; /* 塊大小*/
    long f_blocks; /* 塊多少*/
    long f_bfree; /* 空閑的塊()*/
    long f_bavail; /* 可用塊 */
    long f_files; /* 總文件節點 */
    long f_ffree; /* 空閑文件節點 */
    fsid_t f_fsid; /* 文件系統id */
    long f_namelen; /* 文件名的最大長度 */
    long f_spare[6]; /* spare for later */
    };

    2. 獲取文件訪問權限或者判斷文件是否存在:
    int access(char* filename, int mode);

    3. 獲取當前時間:
    time_t t;char* asctime(localtime(&t));
    或者
    time(&t);char* ctime(&t);
    得到的字符串形式為:Wed Mar 12 10:07:53 2003

    4. 計算兩個時刻之間的時間差
    double difftime(time_t time2, time_t time1);

    5. 刪除某文件:
    int unlink(char* pathname);
    int remove(char* pathname);

    6. 刪除某目錄:
    int rmdir(const char* pathname);

    7. 獲得當前所在目錄名:
    char * getcwd(char *buf,size_t size); buf將會返回目前路徑名稱。

    8. 獲取目錄信息:
    DIR * opendir(const char * pathname);
    int closedir(DIR *dir);
    struct dirent * readdir(DIR *dir);
    struct dirent
    {
    long d_ino; /* inode number */
    off_t d_off; /* offset to this dirent */
    unsigned short d_reclen; /* length of this d_name */
    char d_name [NAME_MAX+1]; /* file name (null-terminated) */
    };

    9. strerror(errno);函數會返回一個指定的錯誤號的錯誤信息的字符串.

    10.得到當前路徑下面所有的文件(包含目錄)的個數
    struct dirent **namelist;
    int num = scandir(".",&namelist,0,alphasort)

    11./etc/ld.so.conf:包含共享庫的搜索位置
    查看執行文件調用了哪些共享庫
    shell>ldd a.out
    共享庫管理工具,一般在更新了共享庫之后要運行該命令
    shell>ldconfig

    12.查看文件執行的速度
    shell>time ./a.out

    13.改變文件訪問權限
    int chmod(const char* path, mode_t mode);

    14.改變文件大小
    int chsize(int handle, long size);

    15.把一個浮點數轉換為字符串
    char ecvt(double value, int ndigit, int *decpt, int *sign);

    16.檢測文件結束
    int eof(int *handle);

    17.檢測流上的文件結束符
    int feof(FILE *stream);

    18.檢測流上的錯誤
    int ferror(FILE *stream);

    19.裝入并運行其它程序的函數
    int execl(char *pathname, char *arg0, arg1, ..., argn, NULL);
    int execle(char *pathname, char *arg0, arg1, ..., argn, NULL,
    char *envp[]);
    int execlp(char *pathname, char *arg0, arg1, .., NULL);
    int execple(char *pathname, char *arg0, arg1, ..., NULL,
    char *envp[]);
    int execv(char *pathname, char *argv[]);
    int execve(char *pathname, char *argv[], char *envp[]);
    int execvp(char *pathname, char *argv[]);
    int execvpe(char *pathname, char *argv[], char *envp[]);

    20.指數函數
    double exp(double x);

    21. struct sockaddr
    {
    unsigned short sa_family; /* address family, AF_xxx */
    char sa_data[14]; /* 14 bytes of protocol address */
    };
    struct sockaddr_in
    {
    short int sin_family; /* Address family */
    unsigned short int sin_port; /* Port number */
    struct in_addr sin_addr; /* Internet address */
    unsigned char sin_zero[8]; /* Same size as struct sockaddr */
    };
    struct in_addr
    {
    unsigned long s_addr;
    };
    s_addr按照網絡字節順序存儲IP地址
    sin_zero是為了讓sockaddr與sockaddr_in兩個數據結構保持大小相同而保留的空字節。

    使用的例子:
    struct sockaddr_in sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(3490);
    sa.sin_addr.s_addr = inet_addr("132.241.5.10");
    bzero(&(sa.sin_zero), 8);
    注意:如果sa.sin_addr.s_addr = INADDR_ANY,則不指定IP地址(用于Server程序)

    22. #define UNIX_PATH_MAX 108
    struct sockaddr_un
    {
    sa_family_t sun_family; /* AF_UNIX */
    char sun_path[UNIX_PATH_MAX]; /* 路徑名 */
    };

    23. IP地址轉換函數:
    unsigned long inet_addr (const char *cp);
    inet_addr將一個點分十進制IP地址字符串轉換成32位數字表示的IP地址(網絡字節順序)

    char* inet_ntoa (struct in_addr in);
    inet_ntoa將一個32位數字表示的IP地址轉換成點分十進制IP地址字符串。

    這兩個函數互為反函數

    字節順序轉換:
    htons()--"Host to Network Short"
    htonl()--"Host to Network Long"
    ntohs()--"Network to Host Short"
    ntohl()--"Network to Host Long" 

    24. 獲取當前機器的CPU、內存使用情況
    getrusage

    25. open的使用中常用的flag和mode參數
    int FILE_FLAG = O_WRONLY|O_APPEND|O_CREAT;
    int FILE_MODE = S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;

    26. makefile中常用的符號:
    預定義變量 含義
    $* 不包含擴展名的目標文件名稱。
    $@ 目標的完整名稱
    $% 如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱。例如,如果目標名稱
    為 mytarget.so(image.o),則 $@ 為 mytarget.so,而 $% 為 image.o。

    $+ 所有的依賴文件,以空格分開,并以出現的先后為序,可能包含重復的依賴文件。
    $< 第一個依賴文件的名稱。
    $? 所有的依賴文件,以空格分開,這些依賴文件的修改日期比目標的創建日期晚
    $^ 所有的依賴文件,以空格分開,不包含重復的依賴文件。

    AR 歸檔維護程序的名稱,默認值為 ar。
    ARFLAGS 歸檔維護程序的選項。
    AS 匯編程序的名稱,默認值為 as。
    ASFLAGS 匯編程序的選項。
    CC C 編譯器的名稱,默認值為 cc。
    CCFLAGS C 編譯器的選項。
    CPP C 預編譯器的名稱,默認值為 $(CC) -E。
    CPPFLAGS C 預編譯的選項。
    CXX C++ 編譯器的名稱,默認值為 g++。
    CXXFLAGS C++ 編譯器的選項。
    FC FORTRAN 編譯器的名稱,默認值為 f77。
    FFLAGS FORTRAN 編譯器的選項。

    用變量object表示所有的.o文件:
    objects := $(wildcard *.o)

    make -n或者--just-print表示只是顯示命令,但不會執行命令
    make -s或者--slient表示全面禁止命令的顯示
    make -i或者--ignore-errors表示Makefile中所有命令都會忽略錯誤
    make -k或者--keep-going表示如果某規則中的命令出錯了,那么就終止該規則的執行,但繼續執行其它規則

    在makefile中直接利用shell獲取變量PLAT
    使用make中的一種用變量來定義變量的方法。這種方法使用的是“:=”操作符
    PLAT := $(shell uname -a)

    我們要定義一個變量,其值是一個空格,那么我們可以這樣來:
    nullstring :=
    space := $(nullstring) # end of the line

    FOO ?= bar含義是:
    如果FOO沒有被定義過,那么變量FOO的值就是“bar”,如果FOO先前被定義過,那么這條語將什么也不做,其等價于:
    ifeq ($(origin FOO), undefined)
    FOO = bar
    endif

    foo := a.o b.o c.o
    bar := $(foo:.o=.c)
    我們先定義了一個“$(foo)”變量,而第二行的意思是把“$(foo)”中所有以“.o”字串“結尾”全部替換成“.c”,所以我們的“$(bar)”的值就是“a.c b.c c.c”。


    你想在Makefile中設置參數值,你可以使用“override”指示符。其語法是:
    override <variable> = <value>
    override <variable> := <value>
    當然,你還可以追加:
    override <variable> += <more text>

    make運行時的系統環境變量可以在make開始運行時被載入到Makefile文件中,
    但是如果Makefile中已定義了這個變量,或是這個變量由make命令行帶入,
    那么系統的環境變量的值將被覆蓋。
    如果make指定了“-e”參數,那么,系統環境變量將覆蓋Makefile中定義的變量

    posted on 2007-04-14 21:03 allic 閱讀(373) 評論(0)  編輯  收藏 所屬分類: linux/UNIX 應用開發
    主站蜘蛛池模板: 亚洲一区二区三区在线观看精品中文| 又黄又爽又成人免费视频| 日韩在线免费电影| 亚洲熟妇av午夜无码不卡| 麻豆最新国产剧情AV原创免费 | 伊人亚洲综合青草青草久热| 免费一级毛片在线播放放视频| 亚洲av再在线观看| 插鸡网站在线播放免费观看| 亚洲色婷婷综合久久| 亚洲免费人成在线视频观看 | 四虎成人免费网站在线| 亚洲午夜精品久久久久久app| 成人免费无码视频在线网站| 亚洲熟女乱色一区二区三区| 国产禁女女网站免费看| 美女视频黄a视频全免费网站一区 美女视频黄a视频全免费网站色 | 亚洲中文字幕久久无码| 国产精品酒店视频免费看| 美女羞羞视频免费网站| 亚洲精品自在在线观看| 久久精品国产免费观看三人同眠| 亚洲色丰满少妇高潮18p| 国产又黄又爽又刺激的免费网址 | 永久免费视频网站在线观看| 亚洲欧洲日本在线观看| 免费人妻无码不卡中文字幕18禁| 在线免费观看h片| 亚洲国产av高清无码| 国产精品色午夜免费视频| 中文字幕免费在线看电影大全 | 成人在线免费观看| 一级毛片aaaaaa视频免费看| 亚洲国产高清视频| 国产aa免费视频| 男人进去女人爽免费视频国产| 亚洲一区二区三区高清不卡| 亚洲第一视频在线观看免费| 1000部免费啪啪十八未年禁止观看 | 57pao国产成视频免费播放| 九九精品国产亚洲AV日韩|