嵌入式LINUX_C基礎(chǔ)09_第1頁(yè)
嵌入式LINUX_C基礎(chǔ)09_第2頁(yè)
嵌入式LINUX_C基礎(chǔ)09_第3頁(yè)
嵌入式LINUX_C基礎(chǔ)09_第4頁(yè)
嵌入式LINUX_C基礎(chǔ)09_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、ESD_DAY031_ElvisUNIX/LINUX 系統(tǒng)下的C高級(jí)編程A.N.E.K1.目錄的管理1.1 使用opendir函數(shù)打開目錄使用時(shí)引入頭文件sys/stat.h,dirent.h功能:打開參數(shù)指定的目錄。格式:DIR* opendir(const char*name);注意:一個(gè)參數(shù):想打開的目錄路徑,雙引號(hào)括起來(lái);多級(jí)路徑可能需要sprintf函數(shù)拼接。返回值:成功返回目錄指針,失敗返回NULL。1.2 使用readdir函數(shù)讀取目錄使用時(shí)引入頭文件dirent.h功能:讀取參數(shù)指定目錄中的內(nèi)容。格式:struct dirent* readdir(DIR*dirp);注意:一個(gè)

2、參數(shù):目錄指針,函數(shù)opendir()的返回值;返回值:成功返回結(jié)構(gòu)體指針,失敗返回NULL。struct dirent . . . unsigned char d_type; /文件的類型 char d_name256;/文件的名稱. . . ;1.3 使用closedir函數(shù)關(guān)閉目錄使用時(shí)引入頭文件dirent.h功能:關(guān)閉參數(shù)指定的目錄。格式:int closedir(DIR*dirp);注意:一個(gè)參數(shù):目錄指針,函數(shù)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.遍歷目錄中的內(nèi)容 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); /讀取下一個(gè) /ent=readdir(dir); /3.關(guān)閉目錄 int res=closedir(dir); if(-1=res) perror("closedir"); exit(-1); printf("成功關(guān)閉目錄n"); return 0;*練習(xí):編程實(shí)現(xiàn)打印指定目錄中的所有內(nèi)容,要求子目錄中的內(nèi)容也要打印出來(lái)

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)讀取目錄中的內(nèi)容 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); /調(diào)用遞歸子目錄中的內(nèi)容 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("成功關(guān)閉文件n");1.4 其他相關(guān)的函數(shù)mkdir()-創(chuàng)建一個(gè)目錄rmdir(

8、)-刪除一個(gè)目錄chdir()-改變目錄getcwd()-獲取當(dāng)前進(jìn)程所在目錄,get current working directory。2.進(jìn)程管理2.1 基本概念和基本命令(1)基本概念程序就是存放在磁盤上的一個(gè)可執(zhí)行文件,進(jìn)程就是指運(yùn)行在內(nèi)存中的程序。同一個(gè)程序可以啟動(dòng)多個(gè)進(jìn)程。(2)基本命令ps-查看當(dāng)前終端中啟動(dòng)的進(jìn)程(進(jìn)程的快照)。ps命令的執(zhí)行結(jié)果:PID-進(jìn)程號(hào);TTY-終端的次要裝置號(hào)碼(了解);TIME-命令占用CPU的時(shí)間(了解);CMD-命令的名稱;ps -aux-表示顯示所有包含其他使用者的進(jìn)程;ps -aux|more-分屏顯示所有的進(jìn)程;”|”表示管道,即ps-

9、aux命令的結(jié)果通過(guò)一個(gè)管道存放到more中;進(jìn)程的狀態(tài):S:休眠狀態(tài),以減輕CPU的壓力;s:進(jìn)程的領(lǐng)導(dǎo)者,旗下有子進(jìn)程;Z:僵尸進(jìn)程,已經(jīng)結(jié)束的進(jìn)程,但是資源沒(méi)有回收;R:正在運(yùn)行的進(jìn)程;O:可以運(yùn)行的進(jìn)程,T:掛起狀態(tài)的進(jìn)程,現(xiàn)場(chǎng)保護(hù);<:優(yōu)先級(jí)較高的進(jìn)程;N;優(yōu)先級(jí)較低的進(jìn)程ps -ef-表示以全格式的方式顯示進(jìn)程的信息;ps -ef|more-表示分屏顯示進(jìn)程的信息UID-用戶的編號(hào);PID-進(jìn)程的編號(hào);PPID-父進(jìn)程的編號(hào);C-占用的CPU百分比;STIME-進(jìn)程的開始時(shí)間;TTY-終端號(hào);TIME-消耗CPU的時(shí)間;CMD-進(jìn)程的名稱如果進(jìn)程A啟動(dòng)了進(jìn)程B,那么進(jìn)程A就叫

10、做進(jìn)程B的父進(jìn)程,進(jìn)程B叫做進(jìn)程A的子進(jìn)程,目前主流的操作系統(tǒng)都是支持多進(jìn)程的。系統(tǒng)中進(jìn)程0是系統(tǒng)的內(nèi)部的進(jìn)程,負(fù)責(zé)啟動(dòng)進(jìn)程1(init)和進(jìn)程2,其他所有進(jìn)程都是直接/簡(jiǎn)介由進(jìn)程1和進(jìn)程2啟動(dòng)起來(lái)的,從而形成了一個(gè)樹形結(jié)構(gòu)。kill -9-表示殺死指定的進(jìn)程2.2 各種ID的獲取PID-進(jìn)程的編號(hào),系統(tǒng)采用進(jìn)程的編號(hào)來(lái)唯一標(biāo)識(shí)一個(gè)進(jìn)程,采用延遲重用的策略進(jìn)行管理,在任意時(shí)刻都保證進(jìn)程號(hào)是唯一的。getpid()-獲取當(dāng)前進(jìn)程的進(jìn)程號(hào);getppid()-獲取當(dāng)前進(jìn)程的父進(jìn)程的進(jìn)程號(hào);getuid()-獲取用戶的編號(hào);getgid()-獲取用戶組的編號(hào);其中進(jìn)程號(hào)的數(shù)據(jù)類型是pid_t,本質(zhì)是

11、int類型,但是一般都是從0開始使用;用戶ID的數(shù)據(jù)類型是uid_t,本質(zhì)上是unsigned int型;用戶組ID的數(shù)據(jù)類型是gid_t,本質(zhì)上是unsigned int類型。2.3 進(jìn)程的創(chuàng)建(1)fork函數(shù)使用時(shí)引入頭文件unistd.h功能:以復(fù)制正在調(diào)用進(jìn)程的方式來(lái)創(chuàng)建新進(jìn)程,其中正在調(diào)用的進(jìn)程叫做父進(jìn)程,創(chuàng)建出來(lái)的新進(jìn)程叫做子進(jìn)程。格式:pid_t fork();注意:無(wú)參數(shù);返回值:成功調(diào)用時(shí)在父進(jìn)程中返回子進(jìn)程的進(jìn)程號(hào),子進(jìn)程返回0,失敗調(diào)用失敗時(shí)父進(jìn)程返回-1,子進(jìn)程沒(méi)有被創(chuàng)建出來(lái)。/使用fork函數(shù)創(chuàng)建子進(jìn)程#include<stdio.h>#include&

12、lt;stdlib.h>#include<unistd.h>#include<sys/types.h>int main() printf("main函數(shù)開始執(zhí)行n");/執(zhí)行一次 /使用fork函數(shù)創(chuàng)建子進(jìn)程 pid_t pid=fork(); if(-1=pid) perror("fork"); exit(-1); /printf("main函數(shù)結(jié)束n,%d",pid);/執(zhí)行兩次 /分辨子進(jìn)程 if(0=pid) printf("我是子進(jìn)程,我的進(jìn)程號(hào)是:%d,我的父進(jìn)程是:%dn"

13、;,getpid(),getppid(); sleep(3); printf("我是子進(jìn)程,我的進(jìn)程號(hào)是:%d,我的父進(jìn)程是:%dn",getpid(),getppid();/此時(shí),這里的父進(jìn)程已經(jīng)是init,其進(jìn)程號(hào)是1 else sleep(1); printf("我是父進(jìn)程,我的進(jìn)程號(hào)是%d,我的子進(jìn)程號(hào)是:%dn",getpid(),pid); return 0;(2)使用fork函數(shù)創(chuàng)建的子進(jìn)程的執(zhí)行方式a.對(duì)于fork函數(shù)之前的代碼,父進(jìn)程執(zhí)行一次;b.對(duì)于fork函數(shù)之后的代碼,父子進(jìn)程各執(zhí)行一次;連同fork()函數(shù)的一部分也再執(zhí)行1次,

14、因此會(huì)有兩個(gè)返回值。c.對(duì)于fork函數(shù)的返回值來(lái)說(shuō),父子進(jìn)程各返回一次,父進(jìn)程返回子進(jìn)程的ID,子進(jìn)程返回0;因此可以通過(guò)函數(shù)的返回值來(lái)區(qū)分父子進(jìn)程。(3)父子進(jìn)程之間的關(guān)系a.父進(jìn)程啟動(dòng)子進(jìn)程,父子進(jìn)程同時(shí)工作,如果子進(jìn)程結(jié)束,則會(huì)給父進(jìn)程發(fā)信號(hào)SIGCHLD,由父進(jìn)程幫助其回收資源;b.如果父進(jìn)程先結(jié)束,則子進(jìn)程會(huì)變成孤兒進(jìn)程,子進(jìn)程會(huì)變更父進(jìn)程(重新設(shè)定父進(jìn)程,init(1)進(jìn)程),init進(jìn)程叫做孤兒院;c.如果子進(jìn)程先結(jié)束,但是父進(jìn)程由于各種原因沒(méi)有收到子進(jìn)程發(fā)來(lái)的信號(hào),也就沒(méi)有幫助子進(jìn)程回收資源,則子進(jìn)程就會(huì)變成僵尸進(jìn)程;注意:使用fork函數(shù)創(chuàng)建子進(jìn)程后,父子進(jìn)程的執(zhí)行順序由操

15、作系統(tǒng)調(diào)度。(4)父子進(jìn)程之間的內(nèi)存資源關(guān)系*觀察父子進(jìn)程之間的內(nèi)存關(guān)系*#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、數(shù)創(chuàng)建子進(jìn)程 pid_t pid=fork(); if(-1=pid) perror("fork"); exit(-1); /子進(jìn)程 if(0=pid) i1=2; i2=2; strcpy(pc,"HELLO"); printf("子進(jìn)程中:i1=%d,i2=%d,pc=%sn",i1,i2,pc); exit(0);/終止子進(jìn)程 sleep(1);/保證子進(jìn)程先結(jié)束 printf("父進(jìn)程中:i1=%d,i2=%d,pc=%sn",i1,i2,pc); return 0;/父子進(jìn)程打印的結(jié)果不一樣,說(shuō)明實(shí)際內(nèi)存

17、并沒(méi)有共享可見(jiàn),對(duì)于fork函數(shù)創(chuàng)建的子進(jìn)程來(lái)說(shuō),復(fù)制父進(jìn)程中除了代碼區(qū)之外的其他內(nèi)存區(qū)域,代碼區(qū)和父進(jìn)程共享。(5)擴(kuò)展a.如何創(chuàng)建3個(gè)進(jìn)程,一共4個(gè)進(jìn)程:連續(xù)調(diào)用兩次fork函數(shù),4個(gè)進(jìn)程:1個(gè)父進(jìn)程+2個(gè)子進(jìn)程+1個(gè)孫進(jìn)程。以指數(shù)級(jí)增長(zhǎng)。b.如何創(chuàng)建2個(gè)子進(jìn)程,一共3個(gè)進(jìn)程:pid=fork();if(pid!=0) fork();/在父進(jìn)程中單獨(dú)調(diào)用,1個(gè)進(jìn)程+2個(gè)子進(jìn)程;c.俗稱:fork炸彈while(1) fork();2.4 進(jìn)程的終止(1)進(jìn)程的正常終止方式a.在main函數(shù)中執(zhí)行了return 0表示正常結(jié)束;b.調(diào)用exit(0)函數(shù);c.調(diào)用_exit(0)/_Exit

18、(0)函數(shù)來(lái)終止進(jìn)程d.最后一個(gè)線程返回;e.最后一個(gè)線程調(diào)用了pthread_exit函數(shù)(2)進(jìn)程的異常終止方式a.采用信號(hào)來(lái)終止進(jìn)程;b.最后一個(gè)線程被其他線程調(diào)用pthread_cancle取消(3)相關(guān)函數(shù)的解析_exit()/_Exit()函數(shù):功能:立即終止當(dāng)前正在運(yùn)行的進(jìn)程。格式:#include <unistd.h> void _exit(int status); #include <stdlib.h> void _Exit(int status);注意:_exit()和_Exit()函數(shù)功能上完全相同;在終止進(jìn)程時(shí),會(huì)自動(dòng)關(guān)閉屬于該進(jìn)程的文件描述符,

19、會(huì)給該進(jìn)程的父進(jìn)程發(fā)送SIGCHLD信號(hào),該進(jìn)程的所有子進(jìn)程會(huì)重新認(rèn)定新的父進(jìn)程為init;參數(shù)值會(huì)被返回給父進(jìn)程作為該進(jìn)程終止時(shí)的退出狀態(tài)信息,父進(jìn)程需要調(diào)用wait系列函數(shù)來(lái)獲取該數(shù)據(jù)。返回值:無(wú)返回值exit()函數(shù):功能:引起正常進(jìn)程的終止。格式:#include <stdlib.h> void exit(int status);注意:將參數(shù)status&0377之后的數(shù)據(jù)返回給當(dāng)前進(jìn)程的父進(jìn)程 自動(dòng)調(diào)用所有被atexit()和on_exit()函數(shù)注冊(cè)過(guò)的函數(shù),一般用于處理善后工作。返回值:無(wú)返回值atexit()函數(shù):功能:對(duì)參數(shù)指定的函數(shù)進(jìn)程注冊(cè)。格式:#in

20、clude <stdlib.h> int atexit(void(*function)(void);注意:所有被該函數(shù)注冊(cè)過(guò)的函數(shù)會(huì)在正常終止時(shí)被調(diào)用,而正常進(jìn)程終止的主要方式為:調(diào)用exit函數(shù)和執(zhí)行main函數(shù)中的return。返回值:成功返回0,失敗返回非零。*使用不同的函數(shù)終止進(jìn)程*#include<stdio.h>#include<stdlib.h>#include<unistd.h>void show(void)/當(dāng)執(zhí)行到return時(shí)調(diào)用此函數(shù) printf("Komachi wa tsuyoin");int main() /調(diào)用atexit函數(shù)進(jìn)行注冊(cè),但不會(huì)調(diào)用函數(shù) int res=atexit(show);/注冊(cè)show函數(shù) if(0

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論