1埃难、UNIX莹弊、Linux和GNU簡介
2、shell程序設(shè)計
shell的通配符涡尘,*,?,[],[^],{}忍弛,其中{}是把其中所有元素組成一個集合,如ls {a,b}.c考抄,將匹配a.c细疚,b.c。grep -l只顯示文件名川梅,如grep -l main *疯兼。file 文件名,可看文件格式挑势。從shell輸入用read镇防。shell中的條件判斷啦鸣,可用if test -f main.潮饱,或if [ -f main.c ],表測試main.c是否為常規(guī)文件[]兩側(cè)都要空格诫给。for循環(huán)香拉,如for file in var in x) ;;y);;凫碌。&&扑毡,||。語句塊盛险,用{}括起來瞄摊,多條語句合成一個,當作單條語句苦掘。函數(shù)fun_a(){}换帜,調(diào)用時直接fun_a,不用()鹤啡。:是空命令惯驼。echo -n輸出不換行。eval:對參數(shù)求值递瑰。echo可直接替換printf祟牲,如printf "%s\n" hello。trap命令用于指定在接收信號后將要采取的行動抖部,格式trap command signal说贝。here文檔,它允許一條命令在獲得輸入數(shù)據(jù)時好像是在讀取一個文件或鍵盤一樣慎颗。
3狂丝、文件操作
Linux中比較重要的設(shè)備文件:/dev/console,/dev/tty和/dev/null哗总。open時O_CREATE與O_EXCL一起使用几颜,確保文件已經(jīng)存在時,能返回錯誤讯屈。open時同時設(shè)置權(quán)限:open("myfile", O_CREATE, S_IRUSR|S_IXOTH);創(chuàng)建的權(quán)限會受umask限制蛋哭,umask有值的不會被設(shè)置權(quán)限,如設(shè)置值為032涮母,則禁止組寫和執(zhí)行權(quán)限谆趾,禁止其他用戶寫權(quán)限。ioctl系統(tǒng)調(diào)用叛本,提供用于控制設(shè)備及其描述符行為和配置底層服務(wù)的接口沪蓬,通過流獲到對應(yīng)描述符fileno,反之fdopen。目錄:opendir,closedir,readdir,telldir,seekdir,closedir来候。錯誤碼及取值:EPERM,EINTR,EINVA等跷叉。char *strerror(int errnum); void perror(const char *s);Linux提供一個特殊的文件系統(tǒng)procfs,它通常以/proc目錄的形式呈現(xiàn),該目錄中包含許多特殊文件用來對驅(qū)動程序和內(nèi)核信息進行高層的訪問云挟,如cat /proc/cpuinfo(meminfo)(version)梆砸。如修改值echo 80000 >/proc/sys/fs/file-max。如查看特定進程:ls -l /proc/9188园欣,可通過如下方式查看命令行參數(shù):od -c /proc/9188/cmdline帖世。fcntl系統(tǒng)調(diào)用對底層文件描述提供了更多的操縱方法,int fcntl(int fildes, int cmd, long arg)沸枯,可復(fù)制日矫、獲取和設(shè)置文件描述符標志,如fcntl(fildes, F_DUPFD, newfd)绑榴,fcntl(fildes, F_GETFD)搬男。mmap內(nèi)存映射作用是建立一段可以被兩個或更多程序讀寫的內(nèi)存。
4彭沼、Linux環(huán)境
getopt解析命令行參數(shù)缔逛。getopt_long可接受以雙劃線(__)開始的長參數(shù)。環(huán)境變量:getenv,putenv姓惑。environ環(huán)境變量褐奴,extern char **environ。計算兩個time_t時間差于毙,用difftime敦冬。struct tm *gmtime(const time_t timeval)。char *tmpnam(char *a)生成唯一的臨時文件名(多用戶可能會重名)唯沮,F(xiàn)ILE *tmpfile()直接生成可寫臨時文件脖旱,不會出現(xiàn)前面沖突的情況。char *getlogin(void);返回與當前用戶關(guān)聯(lián)的登錄名介蛉。用于/etc/shadow文件普通用戶不能讀萌庆,可以用struct passwd *getpwuid(uid uid);/getpwnam(const char *name);掃描密碼文件中的所有信息:endpwend,getpwent,setpwend币旧。獲取網(wǎng)絡(luò)名:gethostname(char *name, size_t namelen)践险。獲取主機信息:uname(strucct utsname *name);syslog向日志設(shè)施(facility)寫日志,其中設(shè)施值包括LOG_USER(默認值),它指出消息來自一個用戶應(yīng)用程序,以及LOG_LOCAL0到LOG_LOCAL7冕杠,它們含義由本地管理員指定。嚴重級別:LOG_EMERG(可能會廣播給所有用戶)奸忽,LOG_ALERT(可能會EMAIL給管理員),LOG_CRIT,LOG_ERR,LOG_WARNING瓦胎,LOG_NOTICE芬萍,LOG_INFO,LOG_DEBUG(可能會被忽略)凛捏。syslog時用%m可用于插入與錯誤變量errno當前值對應(yīng)的出錯消息字符串。closelog,openlog,setlogmask芹缔。openlog(const char *ident, int logopt, int facility);ident會添加在日志信息前面坯癣,如指明哪個程序創(chuàng)建了這條信息,logoopt對后續(xù)syslog調(diào)用的行為進行配置最欠,如LOG_PID示罗,LOG_CONS(如果信息不能被記錄到日志文件中,就把它們發(fā)到控制臺)芝硬,LOG_ODELAY(在第一次調(diào)用syslog時才打開日志設(shè)施)蚜点,LOG_NDELAY立即打開。資源和限制:limits.h拌阴,getrlimit,setrlimit绍绘。
5、終端
用戶在屏幕上輸入內(nèi)容再按Enter才把數(shù)據(jù)傳遞給程序迟赃,這種處理方式為“規(guī)范模式(canonical mode)”或標準模式陪拘,所有輸入都基于行處理(包括退格鍵),相對是非標準模式(non-canonical mode)纤壁。判斷文件描述符是否關(guān)聯(lián)到一個終端:isatty(int fd)左刽,如isatty(fileno(stdout))判斷標準輸出是否被重定向(如重定向到文件,則stdout調(diào)用isatty就不為真)酌媒。FILE *input = fopen("/dev/tty", "r"); FILE *output=fopen("/dev/tty", "w");打開tty欠痴,始終向終端輸入輸出,即使標準輸入輸出被重定向也不會改變此值秒咨。echo $TERM可查看當前Shell喇辽,terminfo屏蔽終端差異,setupterm設(shè)置終端類型雨席,tigetnum獲取行列長度茵臭。Linux通常在前6個虛擬控制臺上運行一個getty進程,這樣用戶即可用同一個屏幕舅世、鍵盤和鼠標在6不不同的虛擬控制臺上登錄旦委。
6、使用curses函數(shù)庫管理基于文本的屏幕
initscr,endwin,move,printw,refresh,還有刷新屏幕函數(shù):addch,addchstr,printw,refresh,box,insch,insertln,delch,deleteln,beep,flash雏亚。從讀取屏幕:inch,instr,innstr,erase,clean,clrtobot,clrtoeol缨硝。move,leaveok,字符屬性:attron,attroff,attrset,standout,standend。鍵盤模式:echo,noecho,cbreak(非標準模式罢低,輸入立即傳給程序),nocbreak,raw,noraw查辩。鍵盤輸入:getch,getstr,getnstr,scanw胖笛。窗口:newwin,delwin,移動窗口:mvwin,scroll宜岛。
7长踊、數(shù)據(jù)管理
malloc可保證其返回的內(nèi)存是地址對齊的,所以它可以被轉(zhuǎn)換為任何類型的指針萍倡。calloc(size_t number_of_elements, size_t elemet_size);身弊,realloc。文件區(qū)域鎖定:如可用int fcntl(int fildes, int comman, struct flock *flock_struct);其中flock包括成員l_type, l_whence, l_start, l_len, l_pid列敲。comman命令字:F_GETLK阱佛,F(xiàn)_SETLK。fread與fwrite有緩存戴而,底層read,write沒有緩存凑术。dbm數(shù)據(jù)庫適用于處理那些頻繁訪問但卻很少被更新的數(shù)據(jù),因為它創(chuàng)建數(shù)據(jù)項時非常慢所意,而檢索時非郴囱罚快。dbm也有新的ndbm(可以模塊其他兩個接口)及gdbm扶踊。頭文件:/usr/include/gdbm中包含前三個頭文件壮莹。dbm_open,dbm_stroe,dbm_fetch,dbm_close姻檀。
8命满、MySQL
9、開發(fā)工具
diff a b > c绣版,計算a胶台,b的差,用patch a c則a與b的值相同了杂抽,patch -R a c诈唬,則a又還原為原內(nèi)容。tar參數(shù)cxvftz缩麸。
10铸磅、調(diào)試
操作系統(tǒng)分配給程序的內(nèi)存一般都會比實際使用的大些,如果非法訪問的內(nèi)存出現(xiàn)在這部分區(qū)域杭朱,硬件就不能檢測到阅仔,就不會出現(xiàn)段錯誤。DATE及TIME系統(tǒng)編譯時的時間弧械,不是運行時間八酒。還有宏FILE,FUNCTION,LINE。gcc編譯時加-DDEBUG時刃唐,#ifdef DEBUG代碼就可起作用羞迷。gdb中用commands 斷點號設(shè)置執(zhí)行到指定斷點的操作界轩。可在編譯時用gcc -O -g來同時獲得程序優(yōu)化和調(diào)試信息的好處衔瓮,但優(yōu)化可以對程序代碼的先后順序調(diào)整浊猾,在調(diào)試時可能跳來跳去。動態(tài)內(nèi)存檢測工具:ElectricFence(發(fā)現(xiàn)內(nèi)存破壞時就停止運行),valgrind(檢測出數(shù)組訪問錯誤和內(nèi)存泄漏)热鞍。
11葫慎、進程和信號
啟動新進程:int system(const char *string);相當于sh -c string。WIFEXITED,WEXITSTATUS,WIFSIGNALED,WTERMSIG,WISTOPPED,WSTOPSIG碍现。僵尸進程:子進程運行完成后幅疼,進程表中代表子進程的表項不會釋放米奸,因為它退出碼還需要保存起來昼接,以備父進程今后的wait調(diào)用使用。如果父進程異常終止悴晰,子進程將init作為其父進程慢睡,此時子進程由init接管,僵尸進程將一直保留在進程表中直到被init進程發(fā)現(xiàn)并釋放铡溪。wait會阻塞父進程,waitpid(pid_t pid, int *sta_loc, int options);當options指定為WNOHANG則不阻塞父進程漂辐。已打開的文件描述符將在fork和exec調(diào)用之后保留下來,F(xiàn)ILE * freopen(const char *filename, const char mode,FILE stream);void (signal(int sig, void (func)(int)))(int);SIG_IGN,SIG_DEL棕硫。不可重入函數(shù)指該函數(shù)在被調(diào)用還沒有結(jié)束前髓涯,再被調(diào)用可能會產(chǎn)生錯誤,通常是使用了全局資源哈扮,如printf中引用了全局變量stdout纬纪,malloc及free中全局內(nèi)存分配表,信號處理函數(shù)中不能包含printf這樣的不安全函數(shù)滑肉。sigaction包各。int pause(void);會將程序掛起直到有一個信號出現(xiàn)為止。int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);sigaddset,sigemptyset,sigfillset,sigdelset,sigismember,sigprocmask,sigpending,sigsuspend靶庙。
12 POSIX線程
pthread_create问畅,pthread_exit,int pthread_join(pthread_t th, void **thread_return);線程同步:信號量(如資源分配個數(shù))、互斥量(互斥訪問共享內(nèi)存)六荒。int sem_init(sem_t *sem, int pshared, unsigned int value);sem_wait,sem_post(不受init時初始化的個數(shù)限制护姆,一直申請一直增加),sem_trywait,sem_destroy掏击。pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);ptrhead_mutex_lock,unlock,destroy.如果父不再關(guān)心子線程签则,可用pthread_detach或修改屬性,pthread_attr_detachedstate(如果設(shè)置了PTHREAD_CREATE_DETACHED就不能再調(diào)用pthead_join來獲取另一線程的退出狀態(tài)铐料,脫離線程渐裂,還有JOINABLE),pthread_attr_setschedpolicy(如SCHED_FIFO),設(shè)置完之后pthread_attr_destroy豺旬。sched_get_priority_min(max)。取消(終止線程)pthread_cancel(pthread_t);被取消的線程可用pthread_setcancelstate(int state, int *oldstate);設(shè)置取消狀態(tài)柒凉,如PTHRAD_CANCEL_ENABLE或DISABLE來忽略取消請求族阅。pthread_setcanceltype。
13膝捞、進程間通信:管道
FILE *popen(const char *cmd, const char *mode);pclose坦刀,如果模式為r則把另一個進程的輸出給當前進程用,否則為w則可調(diào)用fwrite向被調(diào)用程序發(fā)送數(shù)據(jù)蔬咬,只能單向鲤遥。int pipe(int file_des[2]);是FIFO,使用的是fd而不是stream林艘,必須是底層的read,write不用能流fread,fwrite盖奈。管道有內(nèi)置緩存區(qū),它在write及read調(diào)用之間保存數(shù)據(jù)狐援。創(chuàng)建命令管道:mkfifo filename(命令行或程序)钢坦。open時不指定O_NONBLOCK時,只指定O_RDONLY或O_WRONLY會阻塞啥酱,直到另一個讀或?qū)懘蜷_為止爹凹。
14、信號量镶殷、共享內(nèi)存和消息隊列
semctl,semop,semget禾酱。shmget.shmat,shmdt,shmctl。消息隊列獨立于發(fā)送和接收進程而存在绘趋,消除了在同步命令管理的打開和關(guān)閉時產(chǎn)生的困難颤陶。msgget,msgsnd,msgrcv,msgctl。用命令行顯示刪除ipcs,ipcrm埋心。
15 指郁、套接字
用sockaddr_un可在沒網(wǎng)絡(luò)的本機上運行(只能在同一電腦上運行),sockaddr_in是網(wǎng)絡(luò)套接字拷呆。端口號:/etc/services闲坎。查看網(wǎng)絡(luò)連接狀況:netstat。select,FD_ZERO,FD_CLR,FD_SET,FDISSET茬斧。
16腰懂、用GTK+進行GNOME編程
17、用QT進程KDE編程
18项秉、Linux標準
電子書目錄:
鏈接:https://pan.baidu.com/s/1juVqQOMqXTzY9cBe_9SmSA
提取碼:twtd
復(fù)制這段內(nèi)容后打開百度網(wǎng)盤手機App绣溜,操作更方便哦