版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、ESD_DAY031_ElvisUNIX/LINUX 系統(tǒng)下的C高級編程A.N.E.K1.目錄的管理1.1 使用opendir函數打開目錄使用時引入頭文件sys/stat.h,dirent.h功能:打開參數指定的目錄。格式:DIR* opendir(const char*name);注意:一個參數:想打開的目錄路徑,雙引號括起來;多級路徑可能需要sprintf函數拼接。返回值:成功返回目錄指針,失敗返回NULL。1.2 使用readdir函數讀取目錄使用時引入頭文件dirent.h功能:讀取參數指定目錄中的內容。格式:struct dirent* readdir(DIR*dirp);注意:一個
2、參數:目錄指針,函數opendir()的返回值;返回值:成功返回結構體指針,失敗返回NULL。struct dirent . . . unsigned char d_type; /文件的類型 char d_name256;/文件的名稱. . . ;1.3 使用closedir函數關閉目錄使用時引入頭文件dirent.h功能:關閉參數指定的目錄。格式:int closedir(DIR*dirp);注意:一個參數:目錄指針,函數opendir()的返回值;返回值:成功返回0,失敗返回-1。*目錄的基本操作*#include<stdio.h>#include<stdlib.h>
3、;#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<dirent.h>int main() /1.打開目錄 DIR*dir=opendir("./day09"); if(NULL=dir) perror("opendir"); exit(-1); printf("打開目錄成功n"); /2.遍歷目錄中的內容 struct dirent*ent;/=readdir(dir); /while(NULL!=e
4、nt) while(ent=readdir(dir) /打印讀取到的類型和文件名 /4->目錄,8->文件 printf("%d,%sn",ent->d_type,ent->d_name); /讀取下一個 /ent=readdir(dir); /3.關閉目錄 int res=closedir(dir); if(-1=res) perror("closedir"); exit(-1); printf("成功關閉目錄n"); return 0;*練習:編程實現打印指定目錄中的所有內容,要求子目錄中的內容也要打印出來
5、*#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<dirent.h>#include<string.h>void print(char*path);int main() print("./day02"); return 0;void print(char*path) /1.打開目錄 DIR*dir=opendir(path); if(NULL=dir) perror("op
6、endir"); return; printf("目錄打開成功n"); /2循環(huán)讀取目錄中的內容 struct dirent*ent; while(ent=readdir(dir) /2.1如果讀取到目錄,則打印再遞歸 if(4=ent->d_type) printf("%sn",ent->d_name); /特殊處理特殊目錄.和. if(!strcmp(ent->d_name,".")|!strcmp(ent->d_name,".") continue; /拼接新的路徑 char
7、 buf100=0; sprintf(buf,"%s/%s",path,ent->d_name); /調用遞歸子目錄中的內容 print(buf); /2.2如果讀取到文件,則直接打印 if(8=ent->d_type) printf("%sn",ent->d_name); int res=closedir(dir); if(-1=res) perror("closedir"); exit(-1); printf("成功關閉文件n");1.4 其他相關的函數mkdir()-創(chuàng)建一個目錄rmdir(
8、)-刪除一個目錄chdir()-改變目錄getcwd()-獲取當前進程所在目錄,get current working directory。2.進程管理2.1 基本概念和基本命令(1)基本概念程序就是存放在磁盤上的一個可執(zhí)行文件,進程就是指運行在內存中的程序。同一個程序可以啟動多個進程。(2)基本命令ps-查看當前終端中啟動的進程(進程的快照)。ps命令的執(zhí)行結果:PID-進程號;TTY-終端的次要裝置號碼(了解);TIME-命令占用CPU的時間(了解);CMD-命令的名稱;ps -aux-表示顯示所有包含其他使用者的進程;ps -aux|more-分屏顯示所有的進程;”|”表示管道,即ps-
9、aux命令的結果通過一個管道存放到more中;進程的狀態(tài):S:休眠狀態(tài),以減輕CPU的壓力;s:進程的領導者,旗下有子進程;Z:僵尸進程,已經結束的進程,但是資源沒有回收;R:正在運行的進程;O:可以運行的進程,T:掛起狀態(tài)的進程,現場保護;<:優(yōu)先級較高的進程;N;優(yōu)先級較低的進程ps -ef-表示以全格式的方式顯示進程的信息;ps -ef|more-表示分屏顯示進程的信息UID-用戶的編號;PID-進程的編號;PPID-父進程的編號;C-占用的CPU百分比;STIME-進程的開始時間;TTY-終端號;TIME-消耗CPU的時間;CMD-進程的名稱如果進程A啟動了進程B,那么進程A就叫
10、做進程B的父進程,進程B叫做進程A的子進程,目前主流的操作系統(tǒng)都是支持多進程的。系統(tǒng)中進程0是系統(tǒng)的內部的進程,負責啟動進程1(init)和進程2,其他所有進程都是直接/簡介由進程1和進程2啟動起來的,從而形成了一個樹形結構。kill -9-表示殺死指定的進程2.2 各種ID的獲取PID-進程的編號,系統(tǒng)采用進程的編號來唯一標識一個進程,采用延遲重用的策略進行管理,在任意時刻都保證進程號是唯一的。getpid()-獲取當前進程的進程號;getppid()-獲取當前進程的父進程的進程號;getuid()-獲取用戶的編號;getgid()-獲取用戶組的編號;其中進程號的數據類型是pid_t,本質是
11、int類型,但是一般都是從0開始使用;用戶ID的數據類型是uid_t,本質上是unsigned int型;用戶組ID的數據類型是gid_t,本質上是unsigned int類型。2.3 進程的創(chuàng)建(1)fork函數使用時引入頭文件unistd.h功能:以復制正在調用進程的方式來創(chuàng)建新進程,其中正在調用的進程叫做父進程,創(chuàng)建出來的新進程叫做子進程。格式:pid_t fork();注意:無參數;返回值:成功調用時在父進程中返回子進程的進程號,子進程返回0,失敗調用失敗時父進程返回-1,子進程沒有被創(chuàng)建出來。/使用fork函數創(chuàng)建子進程#include<stdio.h>#include&
12、lt;stdlib.h>#include<unistd.h>#include<sys/types.h>int main() printf("main函數開始執(zhí)行n");/執(zhí)行一次 /使用fork函數創(chuàng)建子進程 pid_t pid=fork(); if(-1=pid) perror("fork"); exit(-1); /printf("main函數結束n,%d",pid);/執(zhí)行兩次 /分辨子進程 if(0=pid) printf("我是子進程,我的進程號是:%d,我的父進程是:%dn"
13、;,getpid(),getppid(); sleep(3); printf("我是子進程,我的進程號是:%d,我的父進程是:%dn",getpid(),getppid();/此時,這里的父進程已經是init,其進程號是1 else sleep(1); printf("我是父進程,我的進程號是%d,我的子進程號是:%dn",getpid(),pid); return 0;(2)使用fork函數創(chuàng)建的子進程的執(zhí)行方式a.對于fork函數之前的代碼,父進程執(zhí)行一次;b.對于fork函數之后的代碼,父子進程各執(zhí)行一次;連同fork()函數的一部分也再執(zhí)行1次,
14、因此會有兩個返回值。c.對于fork函數的返回值來說,父子進程各返回一次,父進程返回子進程的ID,子進程返回0;因此可以通過函數的返回值來區(qū)分父子進程。(3)父子進程之間的關系a.父進程啟動子進程,父子進程同時工作,如果子進程結束,則會給父進程發(fā)信號SIGCHLD,由父進程幫助其回收資源;b.如果父進程先結束,則子進程會變成孤兒進程,子進程會變更父進程(重新設定父進程,init(1)進程),init進程叫做孤兒院;c.如果子進程先結束,但是父進程由于各種原因沒有收到子進程發(fā)來的信號,也就沒有幫助子進程回收資源,則子進程就會變成僵尸進程;注意:使用fork函數創(chuàng)建子進程后,父子進程的執(zhí)行順序由操
15、作系統(tǒng)調度。(4)父子進程之間的內存資源關系*觀察父子進程之間的內存關系*#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/types.h>int i1=1;/全局變量,全局區(qū)int main() int i2=1;/局部變量,棧區(qū) /pc指向堆區(qū),pc本身在棧區(qū) char*pc=(char*)malloc(sizeof(char)*10); strcpy(pc,"hello"); /使用fork函
16、數創(chuàng)建子進程 pid_t pid=fork(); if(-1=pid) perror("fork"); exit(-1); /子進程 if(0=pid) i1=2; i2=2; strcpy(pc,"HELLO"); printf("子進程中:i1=%d,i2=%d,pc=%sn",i1,i2,pc); exit(0);/終止子進程 sleep(1);/保證子進程先結束 printf("父進程中:i1=%d,i2=%d,pc=%sn",i1,i2,pc); return 0;/父子進程打印的結果不一樣,說明實際內存
17、并沒有共享可見,對于fork函數創(chuàng)建的子進程來說,復制父進程中除了代碼區(qū)之外的其他內存區(qū)域,代碼區(qū)和父進程共享。(5)擴展a.如何創(chuàng)建3個進程,一共4個進程:連續(xù)調用兩次fork函數,4個進程:1個父進程+2個子進程+1個孫進程。以指數級增長。b.如何創(chuàng)建2個子進程,一共3個進程:pid=fork();if(pid!=0) fork();/在父進程中單獨調用,1個進程+2個子進程;c.俗稱:fork炸彈while(1) fork();2.4 進程的終止(1)進程的正常終止方式a.在main函數中執(zhí)行了return 0表示正常結束;b.調用exit(0)函數;c.調用_exit(0)/_Exit
18、(0)函數來終止進程d.最后一個線程返回;e.最后一個線程調用了pthread_exit函數(2)進程的異常終止方式a.采用信號來終止進程;b.最后一個線程被其他線程調用pthread_cancle取消(3)相關函數的解析_exit()/_Exit()函數:功能:立即終止當前正在運行的進程。格式:#include <unistd.h> void _exit(int status); #include <stdlib.h> void _Exit(int status);注意:_exit()和_Exit()函數功能上完全相同;在終止進程時,會自動關閉屬于該進程的文件描述符,
19、會給該進程的父進程發(fā)送SIGCHLD信號,該進程的所有子進程會重新認定新的父進程為init;參數值會被返回給父進程作為該進程終止時的退出狀態(tài)信息,父進程需要調用wait系列函數來獲取該數據。返回值:無返回值exit()函數:功能:引起正常進程的終止。格式:#include <stdlib.h> void exit(int status);注意:將參數status&0377之后的數據返回給當前進程的父進程 自動調用所有被atexit()和on_exit()函數注冊過的函數,一般用于處理善后工作。返回值:無返回值atexit()函數:功能:對參數指定的函數進程注冊。格式:#in
20、clude <stdlib.h> int atexit(void(*function)(void);注意:所有被該函數注冊過的函數會在正常終止時被調用,而正常進程終止的主要方式為:調用exit函數和執(zhí)行main函數中的return。返回值:成功返回0,失敗返回非零。*使用不同的函數終止進程*#include<stdio.h>#include<stdlib.h>#include<unistd.h>void show(void)/當執(zhí)行到return時調用此函數 printf("Komachi wa tsuyoin");int main() /調用atexit函數進行注冊,但不會調用函數 int res=atexit(show);/注冊show函數 if(0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版環(huán)保節(jié)能技術轉化第三方履約擔保協議3篇
- 二零二五年飛機租賃與購買合同3篇
- 2024版系統(tǒng)集成項目外包合同3篇
- 二零二五年度鋼結構廠房項目施工圖紙及技術交底合同3篇
- 二零二五年餐飲店員工派遣及服務質量保證合同3篇
- 二零二五版半地下室租賃合同附帶租賃雙方責任界定3篇
- 烏蘭察布醫(yī)學高等專科學?!缎W英語教學研究》2023-2024學年第一學期期末試卷
- 二零二五版?zhèn)€人住房貸款利率調整協議2篇
- 二零二五版房地產抵押權抵押合同示范文本3篇
- 二零二五年餐飲廚房整體承包運營協議3篇
- 農化分析土壤P分析
- GB/T 18476-2001流體輸送用聚烯烴管材耐裂紋擴展的測定切口管材裂紋慢速增長的試驗方法(切口試驗)
- GA 1551.5-2019石油石化系統(tǒng)治安反恐防范要求第5部分:運輸企業(yè)
- 拘留所教育課件02
- 沖壓生產的品質保障
- 《腎臟的結構和功能》課件
- 2023年湖南聯通校園招聘筆試題庫及答案解析
- 上海市徐匯區(qū)、金山區(qū)、松江區(qū)2023屆高一上數學期末統(tǒng)考試題含解析
- 護士事業(yè)單位工作人員年度考核登記表
- 產科操作技術規(guī)范范本
- 人教版八年級上冊地理全冊單元測試卷(含期中期末試卷及答案)
評論
0/150
提交評論