linux操作系統(tǒng)下c語(yǔ)言編程入門(mén)課件_第1頁(yè)
linux操作系統(tǒng)下c語(yǔ)言編程入門(mén)課件_第2頁(yè)
linux操作系統(tǒng)下c語(yǔ)言編程入門(mén)課件_第3頁(yè)
linux操作系統(tǒng)下c語(yǔ)言編程入門(mén)課件_第4頁(yè)
linux操作系統(tǒng)下c語(yǔ)言編程入門(mén)課件_第5頁(yè)
已閱讀5頁(yè),還剩32頁(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、Linux操作系統(tǒng)下C語(yǔ)言編程入門(mén)CNT第1頁(yè),共37頁(yè)。Linux操作系統(tǒng)簡(jiǎn)介基礎(chǔ)知識(shí)進(jìn)程介紹文件操作時(shí)間概念消息管理線程操作網(wǎng)絡(luò)編程Linux下C開(kāi)發(fā)工具介紹第2頁(yè),共37頁(yè)。一.Linux操作系統(tǒng)簡(jiǎn)介發(fā)展歷史 1969年,Ken Thompson ,UNIXMINIX 1991年,芬蘭赫爾辛基大學(xué) LINUS現(xiàn)狀和前景 大型計(jì)算機(jī)系統(tǒng)、PC、手持電腦主要特點(diǎn) 多用戶、多任務(wù)、穩(wěn)定性、安全性、開(kāi)放性、網(wǎng)絡(luò)功能應(yīng)用領(lǐng)域 Internet(WEB、FTP、郵件、DNS服務(wù)器,TCP/IP路由、防火墻)、LAN、嵌入式系統(tǒng)、辦公桌面發(fā)行版本 RedHat、Debian、紅旗第3頁(yè),共37頁(yè)。二.

2、基礎(chǔ)知識(shí)源程序的編譯gcc 編譯器g+ 編譯器例:gcc -o hello hello.c g+ -g -o hello.o hello.cpp編寫(xiě)makefile文件對(duì)某個(gè)Project編譯時(shí),需要編寫(xiě)makefile文件。一般的格式是:Target : components (依賴關(guān)系)TAB rule(規(guī)則)makefile 有三個(gè)非常有用的變量,分別是:$、$ 、$ 代表目標(biāo)文件$ 代表所有的依賴文件$ 代表第一個(gè)依賴文件的名稱第4頁(yè),共37頁(yè)。Makefile實(shí)例:#This is the makefileCC = g+CFLAG = -Wall -OplcMain: src/mai

3、n.cpp obj/com.o obj/msgware.o obj/process.o obj/rtu.o obj/lmasrtu.o obj/schedule.o obj/rs232.o obj/linkcheck.o obj/msgqueue.o obj/ping.o obj/pid.o obj/paramfile.o$(CC) $(CFLAG) -lpthread -o $ src/main.cpp obj/com.o obj/msgware.o obj/process.o obj/rtu.o obj/lmasrtu.o obj/schedule.o obj/rs232.o obj/li

4、nkcheck.o obj/msgqueue.o obj/ping.o obj/pid.o obj/paramfile.oobj/com.o:src/Communication.cpp$(CC) $(CFLAG) -c -o $ $obj/msgware.o:src/MsgWare.cpp$(CC) $(CFLAG) -c -o $ $0)ptr=buffer;while(bytes_write=write(to_fd,ptr,bytes_read)if(bytes_write=-1)&(errno!=EINTR) break;/*是否寫(xiě)完所有讀的字節(jié)*/else if(bytes_write

5、=bytes_read) break;else if(bytes_write0) /*只寫(xiě)了一部分*/ptr+=bytes_write;bytes_read-=bytes_write;if(bytes_write=-1) break;close(from_fd); close(to_fd);第12頁(yè),共37頁(yè)。文件的屬性int access(const char *pathname,int mode);判斷文件是否可以進(jìn)行某種操作(讀,寫(xiě)等等),mode可以是以下值的組合:R_OK 文件可以讀; W_OK 文件可以寫(xiě);X_OK 文件可以執(zhí)行; F_OK 文件存在測(cè)試成功時(shí),函數(shù)返回0;當(dāng)有一項(xiàng)

6、不符合時(shí),返回-1。要獲得文件的其他屬性,我們可以使用函數(shù)stat 或者 stat(const char *pathname, struct stat * buf);int fstat(int filedes, struct stat * buf);返回的文件特性保存在類型為stat的結(jié)構(gòu)體中(包含設(shè)備、節(jié)點(diǎn)、模式、用戶ID、組ID、文件字節(jié)數(shù)、最后一次訪問(wèn)、修改的時(shí)間等信息),參數(shù)buf指向該結(jié)構(gòu)。在該結(jié)構(gòu)中,我們感興趣的成員之一是st_mode,它包含了文件類型和文件權(quán)限。第13頁(yè),共37頁(yè)。目錄文件的操作C庫(kù)函數(shù)中提供了getcwd函數(shù),可以得到當(dāng)前工作路徑。char

7、*getcwd(char *buffer , size_t size);Linux下的目錄操作函數(shù):int mkdir(const char *path,mode_t mode); /創(chuàng)建目錄DIR *opendir(const char *path); /打開(kāi)目錄struct dirent *readdir(DIR *dir); /讀取目錄int closedir(DIR *dir); /關(guān)閉目錄第14頁(yè),共37頁(yè)。其他函數(shù)int unlink(const char *pathname); /刪除文件int rmdir(const char *pathname); /刪除目錄int remo

8、ve(const char *pathname); /刪除文件或目錄int rename(const char *oldname, const char *newname);/文件或目錄更名int chmod(const char *filename, mode_t mode);int fchmod(int filedes, mode_t mode);chmod和fchmod用于改變文件的訪問(wèn)權(quán)限。成功則返回0,否則返回-1。第15頁(yè),共37頁(yè)。五.時(shí)間概念時(shí)間表示和測(cè)量time_t time(time_t *tloc);返回自1970年1月1日0點(diǎn)以來(lái)的秒數(shù)char *ctime(const

9、 time_t *clock); 將秒數(shù)轉(zhuǎn)化成字符串,例:Sat Dec 31 10:00:00 2005localtime 取得當(dāng)?shù)啬壳暗臅r(shí)間和日期mktime 將時(shí)間結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)換成經(jīng)過(guò)的秒數(shù)settimeofday 設(shè)置目前的時(shí)間gettimeofday 取得目前的時(shí)間,可以用作時(shí)間的測(cè)量第16頁(yè),共37頁(yè)。六.消息管理POSIX 無(wú)名信號(hào)量用主要是用來(lái)保護(hù)共享資源,使得資源在一個(gè)時(shí)刻只為一個(gè)進(jìn)程所擁有。信號(hào)燈(semaphore)是進(jìn)程間共享的資源計(jì)數(shù)器。int sem_init(sem_t *sem,int pshared,unsigned int value);int sem_des

10、troy(sem_t *sem);/刪除信號(hào)燈int sem_wait(sem_t *sem);/阻塞進(jìn)程,直到信號(hào)燈值大于0,返回時(shí)自動(dòng)將信號(hào)燈的值減1int sem_post(sem_t *sem);/與sem_wait相反,將信號(hào)燈的值加1,同時(shí)發(fā)出信號(hào)喚醒等待的進(jìn)程int sem_trywait(sem_t *sem);/與sem_wait相似,但不阻塞int sem_getvalue(sem_t *sem); /得到信號(hào)燈的值第17頁(yè),共37頁(yè)。System V 信號(hào)量System V的信號(hào)量是信號(hào)量集,可以包括多個(gè)信號(hào)燈,每個(gè)操作可以同時(shí)操作多個(gè)信號(hào)燈 ;POSIX是單個(gè)信號(hào)燈,P

11、OSIX有名信號(hào)燈支持進(jìn)程間通信,無(wú)名信號(hào)燈放在共享內(nèi)存中時(shí)可以用于進(jìn)程間通信。第18頁(yè),共37頁(yè)。七.線程操作線程線程是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。 共享程序代碼節(jié)省資源線程的創(chuàng)建和使用int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);pthread_create 創(chuàng)建一個(gè)線程,thread 是用來(lái)表明創(chuàng)建線程的ID,attr 指出線程創(chuàng)建時(shí)候的屬性,我們用NULL 來(lái)表明使用缺省屬性。start_routine 函數(shù)指針是線程創(chuàng)建成

12、功后開(kāi)始執(zhí)行的函數(shù),arg是這個(gè)函數(shù)的唯一一個(gè)參數(shù),表明傳遞給start_routine 的參數(shù)。第19頁(yè),共37頁(yè)。例:if(pthread_create(&m_threadID,NULL,ThreadQueryData,(void*)this) != 0)if(pthread_create(&UpdateThreadId, NULL, ThreadDownLoadBaseSchedule, (void*)this) != 0)if(pthread_create(&SpanUpdateThreadId, NULL, ThreadUpdateSpanTimeTableToPlc, (void*

13、)this) != 0)第20頁(yè),共37頁(yè)。void pthread_exit(void *retval);int pthread_join(pthread *thread,void *thread_return);pthread_exit 函數(shù)和exit 函數(shù)類似,用來(lái)退出線程。這個(gè)函數(shù)結(jié)束線程,釋放函數(shù)的資源,并在最后阻塞,直到其他線程使用pthread_join 函數(shù)等待它,然后將*retval 的值傳遞給*thread_return。*多線程中共同占用某一資源時(shí),注意信號(hào)鎖機(jī)制。第21頁(yè),共37頁(yè)。八.網(wǎng)絡(luò)編程Linux 網(wǎng)絡(luò)知識(shí)介紹1.客戶端程序和服務(wù)端程序網(wǎng)絡(luò)程序和普通的程序有一個(gè)

14、最大的區(qū)別是網(wǎng)絡(luò)程序是由兩個(gè)部分組成的客戶端和服務(wù)器端。網(wǎng)絡(luò)程序是先有服務(wù)器程序啟動(dòng),等待客戶端的程序運(yùn)行并建立連接。一般的來(lái)說(shuō)是服務(wù)端的程序在一個(gè)端口上監(jiān)聽(tīng),直到有一個(gè)客戶端的程序發(fā)來(lái)了請(qǐng)求。2.常用的命令netstat 顯示網(wǎng)絡(luò)的連接、路由表和接口等信息。telnet用于遠(yuǎn)程控制的程序,可以用來(lái)調(diào)試服務(wù)端程序。第22頁(yè),共37頁(yè)。3. TCP/UDP 介紹TCP(Transfer Control Protocol)傳輸控制協(xié)議是一種面向連接的協(xié)議,當(dāng)我們的網(wǎng)絡(luò)程序使用這個(gè)協(xié)議的時(shí)候,網(wǎng)絡(luò)可以保證我們的客戶端和服務(wù)端的連接是可靠的,安全的。UDP(User Datagram Protocol

15、)用戶數(shù)據(jù)報(bào)協(xié)議是一種非面向連接的協(xié)議,這種協(xié)議并不能保證我們的網(wǎng)絡(luò)程序的連接是可靠的,所以我們現(xiàn)在編寫(xiě)的程序一般是采用TCP 協(xié)議的。第23頁(yè),共37頁(yè)。初等網(wǎng)絡(luò)函數(shù)介紹(TCP)Socket(套接字)套接字是一個(gè)通信端口,是一種使用標(biāo)準(zhǔn)UNIX文件描述字和其他程序通信的方法。從程序員的角度來(lái)看,它很象文件描述字,因?yàn)樗募凸艿酪粯邮褂脀rite/read來(lái)讀寫(xiě)數(shù)據(jù)。但是套接字和普通文件描述字又有不同:首先,套接字除了可以有一個(gè)地址以外,還明顯包含著關(guān)于通信的3個(gè)屬性域、類型和協(xié)議;其次,套接字的使用可以是非對(duì)稱的,它通常明確的區(qū)分通信的兩個(gè)進(jìn)程為客戶進(jìn)程和服務(wù)進(jìn)程,并且允許不同系統(tǒng)或機(jī)

16、器上的多個(gè)客戶與單個(gè)服務(wù)相連;最后,套接字的創(chuàng)建和各種操作與文件描述字也有所不同。第24頁(yè),共37頁(yè)。socket (創(chuàng)建套接字)int socket(int domain, int type, int protocol);domain: 說(shuō)明網(wǎng)絡(luò)程序所在的主機(jī)采用的通信協(xié)議族(AF_UNIX(UNIX域) 和AF_INET(Internet域) 等);type:網(wǎng)絡(luò)程序所采用的通訊協(xié)議(SOCK_STREAM、SOCK_DGRAM等) ,SOCK_STREAM表示我們使用的是TCP協(xié)議, SOCK_DGRAM表示我們使用的是UDP協(xié)議。protocol: TCP/UDP,由于已指定協(xié)議,這里

17、設(shè)置為0。socket調(diào)用成功時(shí),返回值為0;否則返回-1。例:skConnectSocket = socket(AF_INET,SOCK_DGRAM,0); 第25頁(yè),共37頁(yè)。bind (命名套接字)int bind(int sockfd, struct sockaddr *my_addr, int addrlen);sockfd: 是由socket 調(diào)用返回的文件描述符.my_addr: 是一個(gè)指向結(jié)構(gòu)類型sockaddr 對(duì)象的指針,該對(duì)象包含了要指定給socket的地址。addlen: socketaddr結(jié)構(gòu)對(duì)象的長(zhǎng)度。函數(shù)調(diào)用成功時(shí)返回0,否則返回-1。listen (創(chuàng)建連接隊(duì)

18、列)int listen(int sockfd,int backlog);sockfd: 是bind返回的文件描述符。backlog: 設(shè)置請(qǐng)求排隊(duì)的最大長(zhǎng)度。listen 函數(shù)將bind 的文件描述符變?yōu)楸O(jiān)聽(tīng)套接字,返回的情況和bind 一樣。第26頁(yè),共37頁(yè)。accept (創(chuàng)建新的面向特定客戶的套接字)int accept(int sockfd, struct sockaddr *addr,int *addrlen);sockfd: 是listen 后的文件描述符。addr, addrlen 是用來(lái)給客戶端的程序填寫(xiě)的,服務(wù)器端只要傳遞指針就可以了。bind、listen和accept

19、 服務(wù)器端用的函數(shù),accept 調(diào)用時(shí),服務(wù)器端的程序會(huì)一直阻塞到有一個(gè)客戶程序發(fā)出了連接。accept 成功時(shí)返回最后的服務(wù)器端的文件描述符,這個(gè)時(shí)候服務(wù)器端可以向該描述符寫(xiě)信息了,失敗時(shí)返回-1。第27頁(yè),共37頁(yè)。connect (與服務(wù)器建立連接)int connect(int sockfd, struct sockaddr * serv_addr,int addrlen);sockfd:socket返回的、同服務(wù)端通訊的文件描述符。serv_addr:儲(chǔ)存了服務(wù)器端的連接信息。其中包含了服務(wù)端的地址。addrlen:serv_addr結(jié)構(gòu)對(duì)象的長(zhǎng)度。connect 函數(shù)是客戶端用來(lái)

20、同服務(wù)端連接的。成功時(shí)返回0,失敗時(shí)返回-1。第28頁(yè),共37頁(yè)。套接字連接示意圖服務(wù)端客戶端socket()bind()accept()listen()阻塞直到收到來(lái)自客戶的數(shù)據(jù)報(bào)socket()connect()建立連接write()read()數(shù)據(jù)(請(qǐng)求)read()進(jìn)程請(qǐng)求write()數(shù)據(jù)(回答)read()close()close()文件結(jié)束第29頁(yè),共37頁(yè)。讀寫(xiě)函數(shù)寫(xiě)函數(shù)writessize_t write(int fd,const void *buf,size_t nbytes);write 函數(shù)將buf中的nbytes字節(jié)內(nèi)容寫(xiě)入文件描述符fd。成功時(shí)返回寫(xiě)的字節(jié)數(shù),失敗時(shí)

21、返回-1,并設(shè)置errno 變量。如果錯(cuò)誤為EINTR,表示在寫(xiě)的時(shí)候出現(xiàn)了中斷錯(cuò)誤;如果為EPIPE,表示網(wǎng)絡(luò)連接出現(xiàn)了問(wèn)題(對(duì)方已經(jīng)關(guān)閉了連接)。第30頁(yè),共37頁(yè)。讀函數(shù) readssize_t read(int fd,void *buf,size_t nbyte) ;read 函數(shù)是負(fù)責(zé)從fd 中讀取內(nèi)容。當(dāng)讀成功時(shí),read返回實(shí)際所讀的字節(jié)數(shù),如果返回的值是0 表示已經(jīng)讀到文件的結(jié)束了,小于0表示出現(xiàn)了錯(cuò)誤。如果錯(cuò)誤為EINTR 說(shuō)明讀是由中斷引起的, 如果是ECONNREST 表示網(wǎng)絡(luò)連接出了問(wèn)題。第31頁(yè),共37頁(yè)。數(shù)據(jù)的傳遞/* 客戶端向服務(wù)端寫(xiě) */struct my_st

22、ruct my_struct_client;write(fd,(void *)&my_struct_client,sizeof(struct my_struct);/* 服務(wù)端的讀*/char buffersizeof(struct my_struct);struct *my_struct_server;read(fd,(void *)buffer,sizeof(struct my_struct);my_struct_server=(struct my_struct *)buffer;第32頁(yè),共37頁(yè)。用戶數(shù)據(jù)報(bào)發(fā)送(UDP)兩個(gè)常用的函數(shù)int recvfrom(int sockfd,vo

23、id *buf,int len,unsigned int flags,struct sockaddr * from, int *fromlen);int sendto(int sockfd,const void *msg,int len,unsigned int flags,struct sockaddr *to, int tolen);sockfd,buf,len 的意義和read、write 一樣,分別表示套接字描述符、發(fā)送或接收的緩沖區(qū)及大小。recvfrom 負(fù)責(zé)從sockfd 接收數(shù)據(jù),如果from不是NULL,那么from 里面存儲(chǔ)了信息來(lái)源的情況;如果對(duì)信息的來(lái)源不感興趣,可以將from 和fromlen 設(shè)置為NULL。sendto 負(fù)責(zé)向to 發(fā)送信息,此時(shí)在to 里面存儲(chǔ)了收信息方的詳細(xì)資料。例: int iRetVal = sendto(skConnectSocket, ps

溫馨提示

  • 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)論