linux操作系統(tǒng)下c語言編程入門課件_第1頁
linux操作系統(tǒng)下c語言編程入門課件_第2頁
linux操作系統(tǒng)下c語言編程入門課件_第3頁
linux操作系統(tǒng)下c語言編程入門課件_第4頁
linux操作系統(tǒng)下c語言編程入門課件_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

2、基礎(chǔ)知識源程序的編譯gcc 編譯器g+ 編譯器例:gcc -o hello hello.c g+ -g -o hello.o hello.cpp編寫makefile文件對某個Project編譯時,需要編寫makefile文件。一般的格式是:Target : components (依賴關(guān)系)TAB rule(規(guī)則)makefile 有三個非常有用的變量,分別是:$、$ 、$ 代表目標文件$ 代表所有的依賴文件$ 代表第一個依賴文件的名稱第4頁,共37頁。Makefile實例:#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;/*是否寫完所有讀的字節(jié)*/else if(bytes_write

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

6、不符合時,返回-1。要獲得文件的其他屬性,我們可以使用函數(shù)stat 或者 stat(const char *pathname, struct stat * buf);int fstat(int filedes, struct stat * buf);返回的文件特性保存在類型為stat的結(jié)構(gòu)體中(包含設(shè)備、節(jié)點、模式、用戶ID、組ID、文件字節(jié)數(shù)、最后一次訪問、修改的時間等信息),參數(shù)buf指向該結(jié)構(gòu)。在該結(jié)構(gòu)中,我們感興趣的成員之一是st_mode,它包含了文件類型和文件權(quán)限。第13頁,共37頁。目錄文件的操作C庫函數(shù)中提供了getcwd函數(shù),可以得到當前工作路徑。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); /打開目錄struct dirent *readdir(DIR *dir); /讀取目錄int closedir(DIR *dir); /關(guān)閉目錄第14頁,共37頁。其他函數(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用于改變文件的訪問權(quán)限。成功則返回0,否則返回-1。第15頁,共37頁。五.時間概念時間表示和測量time_t time(time_t *tloc);返回自1970年1月1日0點以來的秒數(shù)char *ctime(const

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

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

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

12、功后開始執(zhí)行的函數(shù),arg是這個函數(shù)的唯一一個參數(shù),表明傳遞給start_routine 的參數(shù)。第19頁,共37頁。例: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頁,共37頁。void pthread_exit(void *retval);int pthread_join(pthread *thread,void *thread_return);pthread_exit 函數(shù)和exit 函數(shù)類似,用來退出線程。這個函數(shù)結(jié)束線程,釋放函數(shù)的資源,并在最后阻塞,直到其他線程使用pthread_join 函數(shù)等待它,然后將*retval 的值傳遞給*thread_return。*多線程中共同占用某一資源時,注意信號鎖機制。第21頁,共37頁。八.網(wǎng)絡(luò)編程Linux 網(wǎng)絡(luò)知識介紹1.客戶端程序和服務(wù)端程序網(wǎng)絡(luò)程序和普通的程序有一個

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

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

16、器上的多個客戶與單個服務(wù)相連;最后,套接字的創(chuàng)建和各種操作與文件描述字也有所不同。第24頁,共37頁。socket (創(chuàng)建套接字)int socket(int domain, int type, int protocol);domain: 說明網(wǎng)絡(luò)程序所在的主機采用的通信協(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)用成功時,返回值為0;否則返回-1。例:skConnectSocket = socket(AF_INET,SOCK_DGRAM,0); 第25頁,共37頁。bind (命名套接字)int bind(int sockfd, struct sockaddr *my_addr, int addrlen);sockfd: 是由socket 調(diào)用返回的文件描述符.my_addr: 是一個指向結(jié)構(gòu)類型sockaddr 對象的指針,該對象包含了要指定給socket的地址。addlen: socketaddr結(jié)構(gòu)對象的長度。函數(shù)調(diào)用成功時返回0,否則返回-1。listen (創(chuàng)建連接隊

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

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

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

21、返回-1,并設(shè)置errno 變量。如果錯誤為EINTR,表示在寫的時候出現(xiàn)了中斷錯誤;如果為EPIPE,表示網(wǎng)絡(luò)連接出現(xiàn)了問題(對方已經(jīng)關(guān)閉了連接)。第30頁,共37頁。讀函數(shù) readssize_t read(int fd,void *buf,size_t nbyte) ;read 函數(shù)是負責從fd 中讀取內(nèi)容。當讀成功時,read返回實際所讀的字節(jié)數(shù),如果返回的值是0 表示已經(jīng)讀到文件的結(jié)束了,小于0表示出現(xiàn)了錯誤。如果錯誤為EINTR 說明讀是由中斷引起的, 如果是ECONNREST 表示網(wǎng)絡(luò)連接出了問題。第31頁,共37頁。數(shù)據(jù)的傳遞/* 客戶端向服務(wù)端寫 */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頁,共37頁。用戶數(shù)據(jù)報發(fā)送(UDP)兩個常用的函數(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 負責從sockfd 接收數(shù)據(jù),如果from不是NULL,那么from 里面存儲了信息來源的情況;如果對信息的來源不感興趣,可以將from 和fromlen 設(shè)置為NULL。sendto 負責向to 發(fā)送信息,此時在to 里面存儲了收信息方的詳細資料。例: int iRetVal = sendto(skConnectSocket, ps

溫馨提示

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

評論

0/150

提交評論