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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、基礎知識源程序的編譯gcc 編譯器g+ 編譯器例:gcc -o hello hello.c g+ -g -o hello.o hello.cpp編寫makefile文件對某個Project編譯時,需要編寫makefile文件。一般的格式是:Target : components (依賴關系)TAB rule(規則)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;/*是否寫完所有讀的字節*/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 文件可以執行; F_OK 文件存在測試成功時,函數返回0;當有一項

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

7、*getcwd(char *buffer , size_t size);Linux下的目錄操作函數:int mkdir(const char *path,mode_t mode); /創建目錄DIR *opendir(const char *path); /打開目錄struct dirent *readdir(DIR *dir); /讀取目錄int closedir(DIR *dir); /關閉目錄第14頁,共37頁。其他函數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用于改變文件的訪問權限。成功則返回0,否則返回-1。第15頁,共37頁。五.時間概念時間表示和測量time_t time(time_t *tloc);返回自1970年1月1日0點以來的秒數char *ctime(const

9、 time_t *clock); 將秒數轉化成字符串,例:Sat Dec 31 10:00:00 2005localtime 取得當地目前的時間和日期mktime 將時間結構數據轉換成經過的秒數settimeofday 設置目前的時間gettimeofday 取得目前的時間,可以用作時間的測量第16頁,共37頁。六.消息管理POSIX 無名信號量用主要是用來保護共享資源,使得資源在一個時刻只為一個進程所擁有。信號燈(semaphore)是進程間共享的資源計數器。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,同時發出信號喚醒等待的進程int sem_trywait(sem_t *sem);/與sem_wait相似,但不阻塞int sem_getvalue(sem_t *sem); /得到信號燈的值第17頁,共37頁。System V 信號量System V的信號量是信號量集,可以包括多個信號燈,每個操作可以同時操作多個信號燈 ;POSIX是單個信號燈,P

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

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

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

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

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

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

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

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

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

21、返回-1,并設置errno 變量。如果錯誤為EINTR,表示在寫的時候出現了中斷錯誤;如果為EPIPE,表示網絡連接出現了問題(對方已經關閉了連接)。第30頁,共37頁。讀函數 readssize_t read(int fd,void *buf,size_t nbyte) ;read 函數是負責從fd 中讀取內容。當讀成功時,read返回實際所讀的字節數,如果返回的值是0 表示已經讀到文件的結束了,小于0表示出現了錯誤。如果錯誤為EINTR 說明讀是由中斷引起的, 如果是ECONNREST 表示網絡連接出了問題。第31頁,共37頁。數據的傳遞/* 客戶端向服務端寫 */struct my_st

22、ruct my_struct_client;write(fd,(void *)&my_struct_client,sizeof(struct my_struct);/* 服務端的讀*/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頁。用戶數據報發送(UDP)兩個常用的函數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 一樣,分別表示套接字描述符、發送或接收的緩沖區及大小。recvfrom 負責從sockfd 接收數據,如果from不是NULL,那么from 里面存儲了信息來源的情況;如果對信息的來源不感興趣,可以將from 和fromlen 設置為NULL。sendto 負責向to 發送信息,此時在to 里面存儲了收信息方的詳細資料。例: int iRetVal = sendto(skConnectSocket, ps

溫馨提示

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

評論

0/150

提交評論