庫的使用
頭文件:.h 裏面的函數及變量的聲明 好比#include <stdio.h> ,Linux下默認頭文件的搜索路徑
系統定義的頭文件:
/usr/include
/usr/local/include
/usr/target/include (平臺不一樣路徑不一樣)
庫文件:/lib64
c庫函數php
root@centos1 c]# ls /lib64/libc.so.6
/lib64/libc.so.6linux
查看一個程序使用了哪些庫
ldd 可執行程序路徑編程
//wait.c代碼 #include <sys/wait.h> #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> void child(int delay){ sleep(delay); exit(0); } void parent(int *status){ wait(status); } main(){ pid_t pid; int status; printf("Before:%d\n",getpid()); pid=fork(); if(pid == 0){ child(10); } if(pid >0 ){ printf("pid =%d\n",getpid()); parent(&status); printf("status =%d\n",status); } }
[root@centos1 c]# ldd ./wait
linux-vdso.so.1 => (0x00007ffebd1d2000)
libc.so.6 => /lib64/libc.so.6 (0x000000333a200000)
/lib64/ld-linux-x86-64.so.2 (0x0000003339e00000)centos
編譯時默認連接c庫,若是使用其它庫編譯時須要用-l
好比使用數學庫
gcc -o m.c -lm -lc函數
系統限制
自己平臺的類型:32位,64位
數據類型的限制:
位置根據機器
/usr/include/limits.h
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/include/float.h
系統自己的限制
命令行:ulimit來修改和獲取
編程時使用:
getrlimit來獲取ui
setrlimit來設置spa
man getrlimit #include <sys/time.h> #include <sys/resource.h> int getrlimit(int resource, struct rlimit *rlim); int setrlimit(int resource, const struct rlimit *rlim); struct rlimit { rlim_t rlim_cur; /* Soft limit */ rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */ }; resource 的一些值 RLIMIT_CORE:core文件的最大字節數. core文件是系統某個文件出現異常退出時,系統爲其保存的上下文信息,在gdb調試時常須要用 RLIMIT_CPU:cpu時間最大值(秒) RLIMIT_DATA:一個進程數據段的最大字節數 RLIMIT_FSIZE:可建立文件的大小最大值 RLIMIT_NOFILE:每一個進程能夠打開的文件的個數 RLIMIT_STACK:進程棧空間的最大值,使系統不會自動的動態修改這個限制 RLIMIT_VMEM:虛擬地址空間的最大值 RLIMIT_AS:系統進程可用內存空間最大值
命令行參數命令行
選項:-l -a -i
參數: -l /etc
main函數的參數形式指針
#include <stdio.h> int main(int argc,char* argv[]){ int i=0; for(;i<argc;i++){ printf("argv[%d]=%s\n",i,argv[i]); } return 0; } /* [root@centos1 c]# ./arg -a -bl c argv[0]=./arg argv[1]=-a argv[2]=-bl argv[3]=c */
命令行選項不少,提取時無需知道命令行參數的順序
getopt
getopt_long
長選項(一個字符串)和短選項(一個字符)調試
man 3 getopt 庫函數裏查找
#include <unistd.h> int getopt(int argc, char * const argv[],const char *optstring); extern char *optarg; extern int optind, opterr, optopt;
選項:一個選項通常完成不一樣功能的操做
參數:在執行相應選項功能操做時傳入的信息
-a:選項
參數:-h host -u root -p 123456
爲了識別命令行輸入信息,getopt函數第三個參數的約定
1.若是就是一個字符,表示某個選項
2.若是一個字符後有1個冒號,表示選項後面必定要跟一個參數,參數能夠緊跟選項或者與選項相隔一個空格
3.若是一個字符後有2個冒號,表示選項後能夠有一個參數或沒有參數,在選項後的參數必定不能跟字符以空格間隔
ab:c::d::
a是一個選項
b後有冒號,其後內容必定是個參數
c,d後雙冒號,其後內容能夠後也能夠沒有,有的話必定緊挨
./getopt -a -b host -chello -d word
a是選項,host是b的參數
hello是c的參數
word和-d沒任何關係
getopt每成功執行一次,將返回當前的一個選項
而且
extern char *optarg;//將向下一個要掃描的參數
extern int optind, //索引爲下一個要處理的指針小標
opterr, //oprerr=0 不將錯誤輸出的標準錯誤輸出設備
optopt;//用於到處可能的錯誤或者不可知的信息
getopt.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc,char **argv) { int result; opterr=0; while( (result = getopt(argc,argv,"ab:c::")) !=-1 ) { switch(result) { case 'a': printf("option=a,optopt=%c,optarg=%s\n",optopt,optarg); break; case 'b': printf("option=b,optopt=%c,optarg=%s\n",optopt,optarg); break; case 'c': printf("option=c,optopt=%c,optarg=%s\n",optopt,optarg); break; case '?': printf("option=?,optopt=%c,optarg=%s\n",optopt,optarg); break; default: printf("option=default,optopt=%c,optarg=%s\n",optopt,optarg); } printf("argv[%d]=%s\n",optind,argv[optind]); } printf("result=%d,optind=%d\n",result,optind); for(result=optind;result<argc;result++) { printf("-------argv[%d]=%s\n",result,argv[result] ); } for(result=1;result<argc;result++){ printf("\nat the end ---argv[%d]=%s\n",result,argv[result] ); } return 0; }
[root@centos1 c]# ./getopt -b b1 -a1 -cc1 d option=b,optopt=,optarg=b1 argv[3]=-a1 option=a,optopt=,optarg=(null) argv[3]=-a1 option=?,optopt=1,optarg=(null) argv[4]=-cc1 option=c,optopt=1,optarg=c1 argv[5]=d result=-1,optind=5 -------argv[5]=d at the end ---argv[1]=-b at the end ---argv[2]=b1 at the end ---argv[3]=-a1 at the end ---argv[4]=-cc1 at the end ---argv[5]=d
長選項:這個選項由一個字符串組成,在選項不少的時候容易記憶
#include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; #include <getopt.h> int getopt_long( int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
optstring:通常爲一個字符串常量,表明全部的短選項,就是通常以"-"開頭的選項,
若是選項後帶參數,則必須在相應的字符後面加":",如"ab:cde:"
longindex參數若是沒有設置爲NULL,那麼它就指向一個變量,這個變量會被賦值爲尋找到的長選項在longopts中的索引值,這能夠用於錯誤診斷
幾種返回值
0 getopt_long()設置一個標誌,它的值與option結構中的val字段的值同樣
1 每碰到一個命令行參數,optarg都會記錄它
'?' 無效選項
':' 缺乏選項參數
'x' 選項字符'x'
-1 選項解析結束
struct option { const char *name; //長選項名 int has_arg; //是否有參數 0、一、2,分別表示沒有參數、有參數、參數可選 int *flag; int val; //返回值,短選項值 };
flag若是爲NULL,函數返回val的值,
不然將val的值寫入flag指向的變量中,
通常狀況下,若是flag爲NULL,則val的值爲該長選項對應的短選項
短選項 長選項
-h --help
-o filename --output filename
-v --version
第三個參數 :短選項方式的格式
ho:v
第四個參數struct
struct option my_option={ {"help",0,NULL,'h'}, {"output",1,NULL,'o'}, {"version",0,NULL,'v'} }
長選項使用
getopt_long.c
#include <stdio.h> #include <unistd.h> #include <getopt.h> #include <stdlib.h> int main(int argc,char *argv[]) { int opt; struct option longopts[] = { {"initialize",0,NULL,'i'}, {"file",1,NULL,'f'}, {"list",0,NULL,'l'}, {"restart",0,NULL,'r'}, {"help",0,NULL,'h'}, {"output",1,NULL,'o'}, {"version",0,NULL,'v'} }; while((opt = getopt_long(argc, argv, "if:lrho:v", longopts, NULL)) != -1){ switch(opt){ case ':': printf("option needs a value\n"); break; case '?': printf("unknown option: %c\n",optopt); break; default: printf("opt=%c,optind=%d,optarg=%s\n",opt,optind,optarg); } } }
執行結果
[root@centos1 c]# ./getopt_long -v -i --file a.php -l --eee -o opt=v,optind=2,optarg=(null) opt=i,optind=3,optarg=(null) opt=f,optind=5,optarg=a.php opt=l,optind=6,optarg=(null) ./getopt_long: unrecognized option '--eee' unknown option: ./getopt_long: option requires an argument -- 'o' unknown option: o