《嵌入式系統(tǒng)原理及應(yīng)用》 課件 第3章 文件IO編程;第4章 進(jìn)程與線程;第5章 硬件平臺(tái)_第1頁(yè)
《嵌入式系統(tǒng)原理及應(yīng)用》 課件 第3章 文件IO編程;第4章 進(jìn)程與線程;第5章 硬件平臺(tái)_第2頁(yè)
《嵌入式系統(tǒng)原理及應(yīng)用》 課件 第3章 文件IO編程;第4章 進(jìn)程與線程;第5章 硬件平臺(tái)_第3頁(yè)
《嵌入式系統(tǒng)原理及應(yīng)用》 課件 第3章 文件IO編程;第4章 進(jìn)程與線程;第5章 硬件平臺(tái)_第4頁(yè)
《嵌入式系統(tǒng)原理及應(yīng)用》 課件 第3章 文件IO編程;第4章 進(jìn)程與線程;第5章 硬件平臺(tái)_第5頁(yè)
已閱讀5頁(yè),還剩201頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

嵌入式系統(tǒng)原理與應(yīng)用第四章進(jìn)程與線程正大氣象厚德載物MinnanUniversityofScienceandTechnology進(jìn)程與線程CONTENTS01.進(jìn)程02.進(jìn)程間通信03.多線程正大氣象厚德載物MinnanUniversityofScienceandTechnology01PARTONE進(jìn)程正大氣象厚德載物MinnanUniversityofScienceandTechnology進(jìn)程簡(jiǎn)介進(jìn)程創(chuàng)建和退出wait()和waitpid()

exec函數(shù)族進(jìn)程1、什么是進(jìn)程進(jìn)程是一個(gè)程序的執(zhí)行過(guò)程,是動(dòng)態(tài)的,包括動(dòng)態(tài)創(chuàng)建、調(diào)度、消亡整個(gè)過(guò)程。資源分配的最小單元。程序是靜態(tài)的,是一些保存在磁盤(pán)上的指令的有序集合,沒(méi)有任何執(zhí)行的概念。2、進(jìn)程的標(biāo)識(shí)進(jìn)程號(hào)(PID,ProcessIdentityNumber):進(jìn)程的標(biāo)識(shí),獲取當(dāng)前進(jìn)程的PID的函數(shù)是getpid()。父進(jìn)程號(hào)(PPID,ParentProcessIdentityNumber),獲取父進(jìn)程號(hào)為getppid()。進(jìn)程簡(jiǎn)介進(jìn)程簡(jiǎn)介演示:process.c3、父進(jìn)程和子進(jìn)程進(jìn)程A創(chuàng)建進(jìn)程B,那進(jìn)程A就是進(jìn)程B的父進(jìn)程,進(jìn)程B是進(jìn)程A的子進(jìn)程。所有進(jìn)程都是由它的父進(jìn)程創(chuàng)建出來(lái)的,init是所有進(jìn)程的祖先。4、進(jìn)程如何被中止進(jìn)程的中止可以分為兩種:正常終止和異常中止正常終止: 1.main函數(shù)調(diào)用return返回,終止進(jìn)程。 2.庫(kù)函數(shù)exit終止進(jìn)程 3.系統(tǒng)調(diào)用_exit或者_(dá)Exit終止進(jìn)程。異常中止: 1.調(diào)用abort函數(shù)終止進(jìn)程 2.被信號(hào)終止進(jìn)程簡(jiǎn)介5、進(jìn)程空間在Linux系統(tǒng)中,進(jìn)程的用戶(hù)空間是獨(dú)立的,相互不影響的;一個(gè)進(jìn)程不能讀取或者修改另一個(gè)進(jìn)程的數(shù)據(jù),只這樣提高了安全性和穩(wěn)定性。

新進(jìn)程被創(chuàng)建出來(lái)后,便是一個(gè)獨(dú)立的進(jìn)程,擁有自己獨(dú)立的進(jìn)程空間,擁有自己唯一的進(jìn)程號(hào)(PID)、擁有自己獨(dú)立的PCB(進(jìn)程控制塊),新進(jìn)程會(huì)被內(nèi)核同等調(diào)度執(zhí)行,參與到系統(tǒng)調(diào)用中。進(jìn)程簡(jiǎn)介6、進(jìn)程的生命周期創(chuàng)建、就緒、運(yùn)行(執(zhí)行)、等待(阻塞)、退出(終止或者結(jié)束)主要由進(jìn)程調(diào)度完成進(jìn)程狀態(tài)轉(zhuǎn)換進(jìn)程簡(jiǎn)介進(jìn)程的創(chuàng)建和退出1、進(jìn)程的創(chuàng)建#include<unistd.h>pid_tfork(void)返回值:成功:0或者大于0的整數(shù)

失敗:-1注意:當(dāng)一個(gè)進(jìn)程調(diào)用fork()成功后,fork()在父子兩個(gè)進(jìn)程中都會(huì)返回,父進(jìn)程返回值子進(jìn)程的PID;子進(jìn)程返回0。操作4.1:fork_sample.c進(jìn)程的創(chuàng)建和退出2、進(jìn)程的退出:exit和_exit函數(shù)exit和_exit都是C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的函數(shù),用于終止程序的執(zhí)行#include<stdlib.h>voidexit(intstatus);參數(shù):status進(jìn)程終止的狀態(tài),零這表示正常終止。

如果status為非零,這表示進(jìn)程異常終止。intatexit(void(*)(void));這個(gè)函數(shù)會(huì)注冊(cè)一個(gè)函數(shù),該函數(shù)會(huì)在程序正常終止時(shí)被調(diào)用。進(jìn)程的創(chuàng)建和退出2、進(jìn)程的退出exit和_exit函數(shù)exit和_exit都是C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的函數(shù),用于終止程序的執(zhí)行#include<unistd.h>void_exit(intstatus)參數(shù):status進(jìn)程終止的狀態(tài)。 _exit函數(shù)則立即終止程序,不會(huì)執(zhí)行任何清理操作,也不會(huì)關(guān)閉打開(kāi)的流或釋放動(dòng)態(tài)分配的內(nèi)存。exit函數(shù)最后會(huì)調(diào)用_exit函數(shù)來(lái)終止程序。進(jìn)程的創(chuàng)建和退出2、進(jìn)程的退出-

exit和_exit函數(shù)操作4.5:exit.c等待子進(jìn)程退出---wait()和waitpid()子進(jìn)程的狀態(tài)變化:1.子進(jìn)程終止2.子進(jìn)程因?yàn)槭盏酵V剐盘?hào)而停止運(yùn)行。(SIGSTOP、SIGSTP)3.子進(jìn)程在停止?fàn)顟B(tài)下因?yàn)槭盏交謴?fù)信號(hào)而恢復(fù)運(yùn)行。(SIGCONT)父進(jìn)程監(jiān)視子進(jìn)程進(jìn)程退出時(shí)會(huì)關(guān)閉所有文件描述符,釋放在用戶(hù)空間分配的內(nèi)存,但是進(jìn)程控制塊PCB會(huì)暫時(shí)保留,里面存放退出狀態(tài)。比如一個(gè)進(jìn)程正常退出,進(jìn)程控制塊PCB里就存放進(jìn)程的退出狀態(tài)(退出碼);如果是異常退出,那么進(jìn)程控制塊PCB里存放導(dǎo)致該進(jìn)程終止的信號(hào)進(jìn)程等待等待子進(jìn)程退出---wait()和waitpid()1.確保時(shí)序問(wèn)題:子進(jìn)程先退出,父進(jìn)程再退出2.資源回收,防止內(nèi)存泄露的問(wèn)題進(jìn)程等待的必要性wait()函數(shù)waitpid()函數(shù)進(jìn)程等待的方式等待子進(jìn)程退出---wait()和waitpid()status:子進(jìn)程退出狀態(tài);pid:<-1

表示等待進(jìn)程組ID等于pid絕對(duì)值的任何子進(jìn)程。-1 表示等待任何子進(jìn)程。0 表示等待任何子進(jìn)程,其進(jìn)程組ID等于調(diào)用進(jìn)程的進(jìn)程組ID。

>0 表示等待子進(jìn)程ID等于pid的值。options:

WNOHANG

沒(méi)有子進(jìn)程退出立即返回(非阻塞等待)#include<sys/types.h>#include<sys/wait.h>pid_twait(int*status);pid_twaitpid(pid_tpid,int*status,intoptions);等待子進(jìn)程退出---wait()和waitpid()頭文件#include<sys/types.h>和<sys/wait.h>1.pid_twait(int*status)用于使父進(jìn)程阻塞,直到一個(gè)子進(jìn)程結(jié)束或該進(jìn)程接到了一個(gè)指定的信號(hào)為止。參數(shù):status用于存放子進(jìn)程終止時(shí)候的狀態(tài)信息返回值:成功返回終止的子進(jìn)程號(hào)。失敗返回-12.pid_twaitpid(pid_tpidint*status,intoption)等待指定pid的進(jìn)程,可以是非阻塞的。參數(shù):pid用于表示需要等待的某個(gè)具體的子進(jìn)程 status用于存放子進(jìn)程終止時(shí)候的狀態(tài)信息 option是一個(gè)選項(xiàng)標(biāo)志,用于控制waitpid()的行為。返回值:成功返回終止的子進(jìn)程號(hào)。失敗返回-1等待子進(jìn)程退出---wait()和waitpid()status:子進(jìn)程退出狀態(tài);WIFEXITED(status):子進(jìn)程正常退出,此宏為真WEXITSTATUS(status):子進(jìn)程正常退出,獲取子進(jìn)程的退出值WIFSIGNALED(status):子進(jìn)程被信號(hào)殺死,此宏為真WTERMSIG(status):子進(jìn)程被信號(hào)殺死,獲取導(dǎo)致子進(jìn)程死亡的信號(hào)WCOREDUMP(status):子進(jìn)程被信號(hào)殺死或生成核心存儲(chǔ)文件,此宏為真WIFSTOPPED(status):子進(jìn)程被信號(hào)暫停,options=WUNTRACED,此宏為真WSTOPSIG(status):WIFSTOPPED(status)為真,獲取導(dǎo)致子進(jìn)程暫停的信號(hào)值WIFCONTINUED(status):子進(jìn)程被SIGCONT重置,此宏為真等待子進(jìn)程退出---wait()和waitpid()操作4.3:wait.c操作4.4:waitpid.cexec函數(shù)族path和file:被加載的執(zhí)行的文件或腳本路徑;arg:列表形式的參數(shù);argv:數(shù)組形式的參數(shù);envp:用戶(hù)自定義的環(huán)境變量數(shù)組。#include<unistd.h>intexecl(constchar*path,constchar*arg,...);intexeclp(constchar*file,constchar*arg,...);intexecle(constchar*path,constchar*arg,...);intexecv(constchar*path,char*constargv[]);intexecvp(constchar*file,char*constargv[]);intexecvpe(constchar*file,char*constargv[],char*constenvp[]);exec函數(shù)族path和file:被加載的執(zhí)行的文件或腳本路徑;arg:列表形式的參數(shù);argv:數(shù)組形式的參數(shù);envp:用戶(hù)自定義的環(huán)境變量數(shù)組。l:參數(shù)以列表(list)的方式提供v:參數(shù)以矢量(vector)數(shù)組方式提供p:利用環(huán)境變量PATH來(lái)指定可執(zhí)行文件e:用戶(hù)提供自定義的環(huán)境變量(environment)exec函數(shù)族1.child.c寫(xiě)一個(gè)main程序,傳入?yún)?shù)為字符串?dāng)?shù)組,將傳入的參數(shù)打印出來(lái)。編譯程序,生成二進(jìn)制可執(zhí)行文件child2.exec.c寫(xiě)一個(gè)main函數(shù),調(diào)用fork()創(chuàng)建一個(gè)子進(jìn)程,在子進(jìn)程中調(diào)用execl函數(shù)去執(zhí)行另一個(gè)程序child。編譯驗(yàn)證是否可以正常執(zhí)行child。操作4.2:exec.cchild.c1、fork()、wait()、waitpid()、exit()/_exit()、exec函數(shù)簇2、作業(yè)

編寫(xiě)程序?qū)崿F(xiàn)生成5個(gè)子進(jìn)程。3、思政:

總結(jié)與作業(yè)THANKYOU!02PARTTWO進(jìn)程間通信正大氣象厚德載物MinnanUniversityofScienceandTechnology進(jìn)程間通信概述無(wú)名管道、有名管道通信消息隊(duì)列信號(hào)共享內(nèi)存信號(hào)量進(jìn)程間通信進(jìn)程間通信

每個(gè)進(jìn)程是操作系統(tǒng)中獨(dú)立的執(zhí)行體,彼此隔離,并具有自己的生命周期。為了合作完成指定任務(wù),進(jìn)程之間也需要進(jìn)行數(shù)據(jù)交互和同步。Linux系統(tǒng)通過(guò)不同方式實(shí)現(xiàn)進(jìn)程間通信和同步。不同的方式適用于不同的場(chǎng)合,用戶(hù)可根據(jù)實(shí)際需要選擇合適的進(jìn)程間通信和同步機(jī)制。進(jìn)程間的通信方式:管道通信、信號(hào)、內(nèi)存共享、消息隊(duì)列、信號(hào)量、套接字管道通信管道通信管道是Linux系統(tǒng)中進(jìn)程間的半雙工通信方式。如果進(jìn)程A和進(jìn)程B通過(guò)管道連接起來(lái),那么數(shù)據(jù)就能夠通過(guò)管道由進(jìn)程A流向進(jìn)程B,或者由進(jìn)程B流向進(jìn)程A。管道是單向的、先進(jìn)先出的。管道通信的類(lèi)型:無(wú)名管道:用于父進(jìn)程和子進(jìn)程間的通信有名管道:可用于運(yùn)行于同一系統(tǒng)中的任意兩個(gè)進(jìn)程間的通信管道的創(chuàng)建所需頭文件#include<unistd.h>函數(shù)原型intpipe(intpipefd[2]);函數(shù)傳入值pipefd[2]:管道的兩個(gè)文件描述符,pipefd[0]用于管道的讀端,pipefd[1]用于管道的寫(xiě)端。函數(shù)返回值成功:0失?。?1所需頭文件#include<sys/types.h>#include<sys/stat.h>函數(shù)原型intmkfifo(constchar*pathname,mode_tmode);函數(shù)傳入值pathname:要?jiǎng)?chuàng)建的管道,創(chuàng)建之前不能存在mode:管道的訪問(wèn)權(quán)限,如0666函數(shù)返回值成功:0失敗:-1無(wú)名管道有名管道管道通信管道的關(guān)閉關(guān)閉管道只需將這兩個(gè)文件描述符關(guān)閉即可,可以使用普通的close函數(shù)逐個(gè)關(guān)閉。操作4.6:pipe.c操作4.7:w_fifo.cr_fifo.c消息隊(duì)列管道只能傳輸無(wú)格式的字節(jié)流,會(huì)給應(yīng)用程序開(kāi)發(fā)帶來(lái)不便,而消息隊(duì)列克服了此缺點(diǎn)。消息隊(duì)列就是一個(gè)消息的鏈表,可以把消息看作一個(gè)具有特定格式的記錄。進(jìn)程可以從消息隊(duì)列中添加消息,另一些進(jìn)程則可以從消息隊(duì)列中讀取消息。消息結(jié)構(gòu)體必須自己定義,但必須按照系統(tǒng)的要求定義,消息結(jié)構(gòu)體如下:structmsgbuf{ longmsgtype;//消息類(lèi)型,必須是long型 charname[SIZE];//消息正文};消息隊(duì)列消息隊(duì)列1、鍵值系統(tǒng)建立IPC通信(消息隊(duì)列、信號(hào)量和共享內(nèi)存)時(shí)必須指定一個(gè)ID值,該值通過(guò)ftok()函數(shù)獲取所需頭文件#include<sys/types.h>#include<sys/ipc.h>函數(shù)原型key_tftok(constchar*pathname,intproj_id);函數(shù)傳入值pathname:文件名proj_id:項(xiàng)目名,不為0即可函數(shù)返回值成功:返回文件名對(duì)應(yīng)的鍵值失敗:-1消息隊(duì)列2、打開(kāi)/創(chuàng)建消息隊(duì)列所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型intmsgget(key_tkey,intmsgflg);函數(shù)傳入值key:消息隊(duì)列的鍵值,多個(gè)進(jìn)程可通過(guò)它訪問(wèn)同一個(gè)消息隊(duì)列msgflg權(quán)限標(biāo)志位IPC_CREAT:創(chuàng)建IPC_EXCL:如果不存在則創(chuàng)建,否則返回錯(cuò)誤IPC_NOWAIT:不阻塞函數(shù)返回值成功:返回消息隊(duì)列ID失敗:-1消息隊(duì)列3、發(fā)送消息所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型intmsgsnd(intmsqid,constvoid*msgp,size_tmsgsz,intmsgflg);函數(shù)傳入值msqid:消息隊(duì)列的隊(duì)列IDmsgp:指向消息結(jié)構(gòu)的指針,消息結(jié)構(gòu)格式如前所述msgsz:消息正文的字節(jié)數(shù)msgflg發(fā)送標(biāo)志IPC_NOWAIT:若消息無(wú)法立即發(fā)送,函數(shù)立即返回,比如消息隊(duì)列已滿(mǎn)0:阻塞等待,直到發(fā)送成功為止函數(shù)返回值成功:0失?。?1消息隊(duì)列4、讀取消息所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型ssize_tmsgrcv(intmsqid,void*msgp,size_tmsgsz,longmsgtyp,intmsgflg);函數(shù)傳入值msqid:消息隊(duì)列的隊(duì)列IDmsgp:消息緩沖區(qū),將消息存放在消息結(jié)構(gòu)體中msgsz:消息正文的字節(jié)數(shù)msgtyp0:接受消息隊(duì)列中的第一個(gè)消息大于0:接受消息隊(duì)列中第一個(gè)類(lèi)型為msgtyp的消息小于0:接受消息隊(duì)列中第一個(gè)類(lèi)型值不小于msgtyp絕對(duì)值且類(lèi)型值最小的消息msgflgMSG_NOERROR:返回的消息比msgsz多,消息被截短為msgsz字節(jié)且不通知消息發(fā)送進(jìn)程IPC_NOWAIT:消息隊(duì)列中沒(méi)有相應(yīng)類(lèi)型的消息可以接收,立即返回0:阻塞直到接受一條相應(yīng)消息為止函數(shù)返回值成功:0失?。?1消息隊(duì)列5、消息控制所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型intmsgctl(intmsqid,intcmd,structmsqid_ds*buf);函數(shù)傳入值msqid:消息隊(duì)列的隊(duì)列IDcmdIPC_STAT:讀取消息隊(duì)列的數(shù)據(jù)結(jié)構(gòu)msgid_ds,并將其存儲(chǔ)在buf指定地址中IPC_SET:設(shè)置消息隊(duì)列的數(shù)據(jù)結(jié)構(gòu)msqid_ds中的ipc_perm域IPC_RMID:刪除msqid標(biāo)識(shí)的消息隊(duì)列buf描述消息隊(duì)列的msgid_ds結(jié)構(gòu)類(lèi)型變量函數(shù)返回值成功:0失?。?1操作4.9:snd_msg.crcv_msg.c信號(hào)Linux的信號(hào)在軟件層面對(duì)硬件中斷進(jìn)行模擬。運(yùn)行中的進(jìn)程會(huì)收到內(nèi)核或其他進(jìn)程發(fā)來(lái)的信號(hào)。接收到信號(hào)后,進(jìn)程根據(jù)預(yù)先設(shè)置的動(dòng)作對(duì)信號(hào)進(jìn)行處理kill-l--->查看信號(hào)類(lèi)型在Linux系統(tǒng)中,進(jìn)程對(duì)信號(hào)的響應(yīng)主要有三種形式:(1)忽略信號(hào):進(jìn)程將忽略信號(hào),不做任何響應(yīng),但對(duì)于信號(hào)SIGKILL和SIGSTOP,進(jìn)程不能夠忽略;(2)默認(rèn)動(dòng)作:對(duì)于給定的信號(hào)采用系統(tǒng)默認(rèn)操作;

(3)捕捉信號(hào):對(duì)于給定的信號(hào)預(yù)先設(shè)置信號(hào)處理函數(shù),收到信號(hào)后,進(jìn)程將執(zhí)行信號(hào)處理函數(shù)所需頭文件#include<signal.h>函數(shù)原型typedefvoid(*sighandler_t)(int);sighandler_tsignal(intsignum,sighandler_thandler);函數(shù)傳入值signum:要捕捉的信號(hào)handler

函數(shù)返回值成功:原來(lái)的信號(hào)處理函數(shù)指針失?。?1操作4.12:signal.c信號(hào)信號(hào)共享內(nèi)存共享內(nèi)存是進(jìn)程間高效數(shù)據(jù)傳輸通信方式。進(jìn)程通過(guò)共享內(nèi)存實(shí)現(xiàn)數(shù)據(jù)通信,先將其映射到進(jìn)程地址空間,然后訪問(wèn)該地址空間,進(jìn)行讀寫(xiě)操作,就能夠?qū)崿F(xiàn)對(duì)共享內(nèi)存的讀寫(xiě)。當(dāng)多個(gè)進(jìn)程對(duì)同一個(gè)共享內(nèi)存進(jìn)行操作時(shí),為了保證數(shù)據(jù)的一致性,往往通過(guò)同步機(jī)制對(duì)其進(jìn)行保護(hù),比如互斥鎖或信號(hào)量。共享內(nèi)存共享內(nèi)存實(shí)現(xiàn)分為兩個(gè)步驟:(1)創(chuàng)建共享內(nèi)存,使用shmget函數(shù)。(2)映射共享內(nèi)存,將這段創(chuàng)建的共享內(nèi)存映射到具體的進(jìn)程空間去,

共享內(nèi)存進(jìn)程A的邏輯地址空間物理空間進(jìn)程B的邏輯地址空間共享內(nèi)存(1)創(chuàng)建共享內(nèi)存函數(shù)所需頭文件#include<sys/ipc.h>#include<sys/shm.h>函數(shù)原型intshmget(key_tkey,size_tsize,intshmflg);函數(shù)傳入值key:共享內(nèi)存的鍵值,每一個(gè)IPC對(duì)象與一個(gè)key相對(duì)應(yīng),key為IPC_PRIVATE指創(chuàng)建私有共享內(nèi)存size:共享內(nèi)存區(qū)大小shmflg:標(biāo)志,與open的權(quán)限位相同,可用八進(jìn)制表示,如0666函數(shù)返回值成功:共享內(nèi)存ID失?。?1所需頭文件#include<sys/ipc.h>#include<sys/shm.h>函數(shù)原型void*shmat(intshmid,constvoid*shmaddr,intshmflg);函數(shù)傳入值shmid:共享內(nèi)存IDshmaddr:將共享內(nèi)存映射到指定地址,0表示系統(tǒng)自動(dòng)分配地址并把共享內(nèi)存映射到調(diào)用進(jìn)程的地址空間shmflgSHM_RDONLY:共享內(nèi)存只讀0:可讀可寫(xiě)函數(shù)返回值成功:被映射的段地址失?。?1(2)映射共享內(nèi)存的函數(shù)共享內(nèi)存(3)共享內(nèi)存解除所需頭文件#include<sys/ipc.h>#include<sys/shm.h>函數(shù)原型intshmdt(constvoid*shmaddr);函數(shù)傳入值shmaddr:被映射的共享內(nèi)存段地址函數(shù)返回值成功:0失?。?1所需頭文件#include<sys/ipc.h>#include<sys/shm.h>函數(shù)原型intshmctl(intshmid,intcmd,structshmid_ds*buf);函數(shù)傳入值shmid:共享內(nèi)存ID

cmdIPC_RMID:刪除shmid指向的共享內(nèi)存段SHM_LOCK:鎖定共享內(nèi)存,只能有超級(jí)用戶(hù)請(qǐng)求SHM_UNLOCK:對(duì)共享內(nèi)存段解鎖,只能超級(jí)用戶(hù)請(qǐng)求buf:描述共享內(nèi)存段的shmid_ds結(jié)構(gòu)函數(shù)返回值成功:0失敗:-1(4)共享內(nèi)存操作操作4.14:w_shm.cr_shm.c信號(hào)量Linux操作系統(tǒng)中的信號(hào)實(shí)現(xiàn)進(jìn)程之間的異步通信,信號(hào)量則是用于進(jìn)程間的步控制。在程序中,有時(shí)會(huì)存在一種特殊代碼,同一時(shí)間只允許一個(gè)進(jìn)程執(zhí)行該部分代碼。這部分區(qū)域,被稱(chēng)為"臨界區(qū)"。在多進(jìn)程并發(fā)執(zhí)行中,當(dāng)一個(gè)進(jìn)程進(jìn)入臨界區(qū),因某種原因被掛起時(shí),其他進(jìn)程就有可能也進(jìn)入該區(qū)域。解決辦法——使用信號(hào)量信號(hào)量是一個(gè)特殊的變量,一般取正數(shù)值。它的值代表允許訪問(wèn)的資源數(shù)目。只能對(duì)信號(hào)量執(zhí)行P操作和V操作。P操作:申請(qǐng)資源。如果信號(hào)量的值>0,則把該信號(hào)量-1。

如果信號(hào)量的值=0,則掛起該進(jìn)程(代表沒(méi)有資源可用)。V操作:釋放資源。如果有進(jìn)程因該信號(hào)量而被掛起,則恢復(fù)當(dāng)前進(jìn)程運(yùn)行。

如果沒(méi)有進(jìn)程因該信號(hào)量而被掛起,則把該信號(hào)量+1。信號(hào)量信號(hào)量的操作通常分為以下幾個(gè)步驟。(1)創(chuàng)建信號(hào)量或獲取信號(hào)量;(2)初始化信號(hào)量;(3)進(jìn)行信號(hào)量的PV操作;(4)如果不需要信號(hào)量,從系統(tǒng)中刪除它。1、信號(hào)量創(chuàng)建所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>函數(shù)原型intsemget(key_tkey,intnsems,intsemflg);函數(shù)傳入值key:信號(hào)量鍵值nsems:信號(hào)量個(gè)數(shù)semflg:訪問(wèn)權(quán)限和創(chuàng)建標(biāo)識(shí),可用八進(jìn)制表示,如0666,IPC_CREAT表示創(chuàng)建新信號(hào)量,IPC_EXCL表示如果信號(hào)量已經(jīng)存在則該函數(shù)返回出錯(cuò),防止重復(fù)創(chuàng)建。函數(shù)返回值成功:信號(hào)量ID失敗:-1信號(hào)量2、信號(hào)量操作所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>函數(shù)原型intsemctl(intsemid,intsemnum,intcmd,unionsemunarg);函數(shù)傳入值semid:信號(hào)量IDsemnum:信號(hào)量編號(hào),通常取0,當(dāng)使用信號(hào)量集才用到cmd:對(duì)信號(hào)量的各種操作IPC_STAT:獲取信號(hào)量信息SETVAL:將信號(hào)量值設(shè)置為argGETVAL:獲取信號(hào)量值IPC_RMID:刪除信號(hào)量arg:需要設(shè)置或獲取信號(hào)量的結(jié)構(gòu),是unionsemnn結(jié)構(gòu),要自己定義。結(jié)構(gòu)如下:unionsemun{ intval; structsemid_ds*buf; unsignedshort*array;};函數(shù)返回值IPC_STAT、SETVAL、IPC_RMID:返回0GETVAL:返回信號(hào)量的當(dāng)前值失?。?1(1)控制信號(hào)量信號(hào)量2、信號(hào)量操作(2)操作信號(hào)量所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>函數(shù)原型intsemop(intsemid,structsembuf*sops,size_tnsops);函數(shù)傳入值semid:信號(hào)量IDsops:信號(hào)量結(jié)構(gòu)體structsembuf{shortsem_num;//信號(hào)量編號(hào),使用單個(gè)信號(hào)量時(shí),通常取值為0shortsem_op;//信號(hào)量操作:取值為-1表示P操作,取值為+1表示V操作shortsem_flg;//通常設(shè)為SEM_UNDO。進(jìn)程沒(méi)釋放信號(hào)量時(shí),系統(tǒng)自動(dòng)釋放};nsops:操作數(shù)組sops中的操作個(gè)數(shù),通常為1函數(shù)返回值成功:信號(hào)量標(biāo)識(shí)符失敗:-1操作4.15:sem.c總結(jié):1、無(wú)名管道、有名管道2、消息隊(duì)列3、信號(hào)4、共享內(nèi)存5、信號(hào)量作業(yè):3、思政:

總結(jié)與作業(yè)THANKYOU!網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程的概述網(wǎng)絡(luò)編程基礎(chǔ)網(wǎng)絡(luò)編程實(shí)例

網(wǎng)絡(luò)編程1、什么是網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程就是用來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)互連的不同計(jì)算機(jī)上運(yùn)行的程序間可以進(jìn)行數(shù)據(jù)交換。通俗點(diǎn)也就是讓分布在不同地方的計(jì)算機(jī)通過(guò)網(wǎng)線或其他媒介相互連接在一起,形成網(wǎng)絡(luò),網(wǎng)絡(luò)中每臺(tái)計(jì)算機(jī)相互之間都能進(jìn)行通信。2、Linux網(wǎng)絡(luò)編程的核心概念網(wǎng)絡(luò)編程的核心有:套接字(Sockets)、IP地址、端口號(hào)、傳輸控制協(xié)議(TCP)和用戶(hù)數(shù)據(jù)報(bào)協(xié)議(UDP)等等網(wǎng)絡(luò)編程概述1、網(wǎng)絡(luò)模型網(wǎng)絡(luò)編程基礎(chǔ)1、網(wǎng)絡(luò)模型網(wǎng)絡(luò)編程基礎(chǔ)2、協(xié)議概念:協(xié)議是事先約定好,大家共同遵守的一組規(guī)則。從應(yīng)用程序的角度看,協(xié)議可以理解為數(shù)據(jù)傳輸和數(shù)據(jù)解析的規(guī)則。假設(shè)A、B雙方要傳輸文件,規(guī)定:第一次:傳輸文件名,接收方收到文件名,應(yīng)答OK給傳輸方第二次:發(fā)送文件的尺寸,接收方收到該數(shù)據(jù),再次應(yīng)答一個(gè)OK第三次:傳輸文件內(nèi)容,同樣接收方收到數(shù)據(jù)完成后,應(yīng)答OK表示文件內(nèi)容接收成功。網(wǎng)絡(luò)編程基礎(chǔ)2、協(xié)議2.1IP協(xié)議IP協(xié)議也叫網(wǎng)際協(xié)議,特指為實(shí)現(xiàn)一個(gè)相互連接的網(wǎng)絡(luò)系統(tǒng)上從源地址到目的地址傳輸數(shù)據(jù)包(互聯(lián)網(wǎng)數(shù)據(jù)包)所提供必要功能的協(xié)議。特點(diǎn):不可靠、無(wú)連接網(wǎng)絡(luò)編程基礎(chǔ)2、協(xié)議2.2TCP協(xié)議TCP協(xié)議是一種面向連接的,可靠的傳輸層通信協(xié)議。主要是提供不同主機(jī)上的進(jìn)程通信。特點(diǎn):1.建立連接

使用鏈接

釋放連接(虛電路) 2.TCP數(shù)據(jù)包中包含序號(hào)和確認(rèn)序號(hào)。 3.對(duì)包進(jìn)行排序并檢錯(cuò),而損壞的包可以被重傳。服務(wù)對(duì)象:

需要高度可靠性且面向連接的服務(wù),如HTTP、FTP、SMTP等等網(wǎng)絡(luò)編程基礎(chǔ)2、協(xié)議2.3UDP協(xié)議UDP是一種面向無(wú)連接的傳輸層通信協(xié)議。主要也是提供不同主機(jī)上的進(jìn)程間通信。特點(diǎn):1.發(fā)送數(shù)據(jù)之前不需要建立鏈接。 2.不對(duì)數(shù)據(jù)包的順序進(jìn)行檢查。 3.沒(méi)有錯(cuò)誤檢測(cè)和重傳機(jī)制服務(wù)對(duì)象:

主要用于“查詢(xún)-應(yīng)答”的服務(wù),如NFS、NTP、DNS等。網(wǎng)絡(luò)編程基礎(chǔ)3、MAC地址、IP地址3.1MAC地址 MAC地址,用于表示網(wǎng)絡(luò)設(shè)備,類(lèi)似于身份證,且理論上全球唯一。組成:以太網(wǎng)的MAC地址是一個(gè)48bit的值。網(wǎng)絡(luò)編程基礎(chǔ)3、MAC地址、IP地址、端口號(hào)3.2IP地址

IP地址是一種Internet上的主機(jī)編碼方式,也稱(chēng)為網(wǎng)際協(xié)議地址。它為互聯(lián)網(wǎng)上的每一個(gè)網(wǎng)絡(luò)和每一臺(tái)主機(jī)分配一個(gè)邏輯地址,以此來(lái)屏蔽物理地址的差異。IPV4地址的組成 IPV4一般使用10進(jìn)制字符串標(biāo)識(shí),比如。網(wǎng)絡(luò)編程基礎(chǔ)3、MAC地址、IP地址、端口3.3端口 TCP/IP協(xié)議采用端口標(biāo)識(shí)通信的進(jìn)程,用于區(qū)分一個(gè)系統(tǒng)里面的多個(gè)進(jìn)程。特點(diǎn):1.對(duì)于同一個(gè)端口而言,在不同系統(tǒng)中對(duì)應(yīng)著不同的進(jìn)程 2.對(duì)于同一個(gè)系統(tǒng),一個(gè)端口只能被一個(gè)進(jìn)程擁有 3.一個(gè)進(jìn)程擁有一個(gè)端口后,傳輸層送到該端口的數(shù)據(jù)全部被該進(jìn)程接收,同樣的,進(jìn)程送交傳輸層的數(shù)據(jù)也通過(guò)該端口被送出。網(wǎng)絡(luò)編程基礎(chǔ)3、MAC地址、IP地址、端口3.3端口

端口號(hào),在網(wǎng)絡(luò)程序中,端口號(hào)(port)來(lái)標(biāo)識(shí)一個(gè)運(yùn)行的網(wǎng)絡(luò)程序。特點(diǎn):1.端口號(hào)是一個(gè)無(wú)符號(hào)短整形的類(lèi)型 2.每個(gè)端口都擁有一個(gè)端口號(hào) 3.TCP、UDP維護(hù)各自獨(dú)立的端口號(hào)4.網(wǎng)絡(luò)應(yīng)用程序中,至少要占用一個(gè)端口號(hào),也可以占有多個(gè)端口號(hào)。端口號(hào)分配:知名端口(1-1023)、動(dòng)態(tài)端口(1024-65535)網(wǎng)絡(luò)編程基礎(chǔ)4、字節(jié)序的概述

是指多字節(jié)的存儲(chǔ)順序。分類(lèi):

小端格式:將低位字節(jié)數(shù)據(jù)存儲(chǔ)在低地址。低字節(jié)優(yōu)先

大端格式:將高位字節(jié)數(shù)據(jù)存儲(chǔ)在低地址。高字節(jié)優(yōu)先特點(diǎn):1.一般網(wǎng)絡(luò)協(xié)議指定了通訊字節(jié)序?yàn)榇蠖烁袷?2.只有在多字節(jié)數(shù)據(jù)處理才需要考慮字節(jié)序 3.運(yùn)行同一臺(tái)計(jì)算機(jī)上的進(jìn)程相互通信時(shí),一般不考慮字節(jié)序。 4.異構(gòu)計(jì)算機(jī)之間通訊,需要轉(zhuǎn)換自己的字節(jié)序?yàn)榫W(wǎng)絡(luò)字節(jié)序。網(wǎng)絡(luò)編程基礎(chǔ)4、字節(jié)序的概述字節(jié)序轉(zhuǎn)換函數(shù):頭文件#include<arpa/inet.h>uint32_thtonl

(uint32_thostint32)

功能:將32位的主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序參數(shù):一個(gè)

uint32_t

類(lèi)型的數(shù)值,表示主機(jī)字節(jié)順序的值。返回值:轉(zhuǎn)換后的網(wǎng)絡(luò)字節(jié)順序的

uint32_t

類(lèi)型的值。uint16_thtons

(uint16_thostint16)

功能:將16位的主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序參數(shù):一個(gè)

uint16_t

類(lèi)型的數(shù)值,表示主機(jī)字節(jié)順序的值。返回值:轉(zhuǎn)換后的網(wǎng)絡(luò)字節(jié)順序的

uint16_t

類(lèi)型的值。網(wǎng)絡(luò)編程基礎(chǔ)4、字節(jié)序的概述字節(jié)序轉(zhuǎn)換函數(shù):頭文件#include<arpa/inet.h>uint32_tntohl

(uint32_tnetint32)

功能:將32位的網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機(jī)字節(jié)序參數(shù):一個(gè)

uint32_t

類(lèi)型的數(shù)值,表示網(wǎng)絡(luò)字節(jié)順序的值。返回值:轉(zhuǎn)換后的主機(jī)字節(jié)順序的

uint32_t

類(lèi)型的值。uint16_tntohs

(uint16_tnetint16)

功能:將16位的網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機(jī)字節(jié)序參數(shù):一個(gè)

uint16_t

類(lèi)型的數(shù)值,表示網(wǎng)絡(luò)字節(jié)順序的值。返回值:轉(zhuǎn)換后的主機(jī)字節(jié)順序的

uint16_t

類(lèi)型的值。操作1:byteOrderConvert.c網(wǎng)絡(luò)編程基礎(chǔ)4、地址轉(zhuǎn)換函數(shù)#include<arpe/inet.h>intinet_pton(intfamily,constchar*strptr,void*addrptr);功能:將點(diǎn)分十進(jìn)制的ip地址轉(zhuǎn)化為32位無(wú)符號(hào)整型數(shù)參數(shù): family:協(xié)議族(IPv4地址,使用AF_INET) strptr:點(diǎn)分十進(jìn)制數(shù)串 addrptr:32位無(wú)符號(hào)整型地址

返回值:成功1,失敗其他網(wǎng)絡(luò)編程基礎(chǔ)4、地址轉(zhuǎn)換函數(shù)#include<arpe/inet.h>constchar*inet_ntop(intfamily,void*addrptr,constchar*strptr,size_tlen);功能:將32位無(wú)符號(hào)整型數(shù)轉(zhuǎn)換為點(diǎn)分十進(jìn)制串參數(shù): family:協(xié)議族(IPv4地址,使用AF_INET) addrptr:32位無(wú)符號(hào)整型地址 strptr:點(diǎn)分十進(jìn)制數(shù)串 len:strptr緩存區(qū)長(zhǎng)度返回值:成功:范圍字符串的首地址,失?。悍祷豊ULL網(wǎng)絡(luò)編程基礎(chǔ)4、地址轉(zhuǎn)換函數(shù)操作2:ipaddrConvert.c網(wǎng)絡(luò)編程基礎(chǔ)4、地址轉(zhuǎn)換函數(shù)int

inet_addr(const

char

*cp)功能:將點(diǎn)分十進(jìn)制ip地址轉(zhuǎn)化為整形數(shù)據(jù)

參數(shù)

cp:點(diǎn)分十進(jìn)制ip地址返回值:成功:整型數(shù)據(jù)char*inet_ntoa(structin_addrin)功能:將整型數(shù)據(jù)轉(zhuǎn)換為十進(jìn)制IP地址參數(shù):in:保存IP地址的結(jié)構(gòu)體返回值:成功:點(diǎn)分十進(jìn)制IP地址只能用于IPV4的地址?。?!網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字) Linux中的網(wǎng)絡(luò)編程通過(guò)Socket(套接字)實(shí)現(xiàn),Socket是一種文件描述符。提供不同主機(jī)上的進(jìn)程之間的通信。特點(diǎn): 1.socket也稱(chēng)“套接字” 2.是一種文件描述符,代表了一個(gè)通信管道的一個(gè)端點(diǎn) 3.類(lèi)似文件的操作一樣,可以使用read/write/close等函數(shù)對(duì)socket套接字進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)的收取和發(fā)送等操作。 4.得到socket套接字的方法就是調(diào)用函數(shù)socket();網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)socket的分類(lèi):?流式套接字(SOCK_STREAM)

流式套接字可以提供可靠的、面向連接的通訊流,它使用TCP協(xié)議。TCP保證了數(shù)據(jù)?傳輸?shù)恼_性和順序性。數(shù)據(jù)報(bào)套接字(SOCK_DGRAM)數(shù)據(jù)報(bào)套接字定義了一種無(wú)連接的服務(wù),數(shù)據(jù)通過(guò)相互獨(dú)立的報(bào)文進(jìn)行傳輸,是無(wú)序的,并且不保證可靠,無(wú)差錯(cuò),它使用數(shù)據(jù)報(bào)協(xié)議UDP。?原始套接字(SOCK_RAW)原始套接字允許使用IP協(xié)議,主要用于新的網(wǎng)絡(luò)協(xié)議的測(cè)試等。網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>intsocket(intfamily,inttype,intprotocol)功能:創(chuàng)建一個(gè)用于網(wǎng)絡(luò)通信的socket套接字(文件描述符)參數(shù): family:協(xié)議族(IPv4地址,使用AF_INET) type:套接字類(lèi)型 protocol:協(xié)議類(lèi)別,通常填0返回值:套接字網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>intbind(intsockfd,conststructsockaddr*addr,socklen_taddrlen)功能:用于將套接字與特定的IP地址和端口號(hào)綁定參數(shù):

sockfd:套接字描述符,由socket函數(shù)返回。 addr:指向structsockaddr結(jié)構(gòu)體的指針,該結(jié)構(gòu)體中包含了要綁定的IP地址和端口號(hào)。對(duì)于IPv4地址,通常使用structsockaddr_in結(jié)構(gòu)體。 addrlen:addr結(jié)構(gòu)體的長(zhǎng)度,以字節(jié)為單位。例如,對(duì)于structsockaddr_in,該值應(yīng)為sizeof(structsockaddr_in)。返回值如果綁定成功,返回0。如果綁定失敗,返回-1網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);功能:用于建立與遠(yuǎn)程主機(jī)的連接的函數(shù)參數(shù):

sockfd:套接字描述符,由socket函數(shù)返回。它標(biāo)識(shí)了要進(jìn)行連接操作的套接字。 addr:指向structsockaddr結(jié)構(gòu)體的指針,該結(jié)構(gòu)體中包含了要連接的遠(yuǎn)程主機(jī)的IP地址和端口號(hào)。對(duì)于IPv4地址,通常使用structsockaddr_in結(jié)構(gòu)體。 addrlen:addr結(jié)構(gòu)體的長(zhǎng)度,以字節(jié)為單位返回值:如果連接成功建立,返回0。如果連接失敗,返回-1,網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>intlisten(intsockfd,intbacklog);功能:使服務(wù)器套接字進(jìn)入監(jiān)聽(tīng)狀態(tài)的函數(shù)參數(shù):sockfd:服務(wù)器套接字的文件描述符,通常是由socket函數(shù)創(chuàng)建并返回的。 backlog:指定同時(shí)連接的最大掛起數(shù),即在服務(wù)器開(kāi)始拒絕新的連接請(qǐng)求之前,可以排隊(duì)等待處理的未完成連接的最大數(shù)量。該參數(shù)用于控制并發(fā)連接的數(shù)量。返回值:成功,返回0。失敗,返回-1,網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);功能:接受客戶(hù)端連接的函數(shù)之一參數(shù):sockfd:服務(wù)器端的套接字描述符。 addr:指向structsockaddr結(jié)構(gòu)體的指針,用于存儲(chǔ)客戶(hù)端的地址信息。當(dāng)accept函數(shù)成功返回時(shí),該結(jié)構(gòu)體將被填充客戶(hù)端的地址信息。通常使用structsockaddr_in結(jié)構(gòu)體來(lái)表示IPv4地址。 addrlen:指向socklen_t類(lèi)型的指針,表示addr結(jié)構(gòu)體的長(zhǎng)度。在調(diào)用accept函數(shù)之前,應(yīng)將該值設(shè)置為addr結(jié)構(gòu)體的實(shí)際大小。返回值:成功,它會(huì)返回一個(gè)新的套接字。失敗,返回-1,網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>ssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);功能:在網(wǎng)絡(luò)套接字上進(jìn)行數(shù)據(jù)發(fā)送的函數(shù)參數(shù):sockfd:套接字描述符,表示發(fā)送數(shù)據(jù)的套接字。 buf:指向要發(fā)送數(shù)據(jù)的緩沖區(qū)的指針。 len:要發(fā)送數(shù)據(jù)的字節(jié)數(shù)。 flags:發(fā)送選項(xiàng)的標(biāo)志位,可以是0或者一些特定的選項(xiàng)按位或運(yùn)算的結(jié)果。常用的選項(xiàng)包括MSG_DONTWAIT(非阻塞發(fā)送)等。返回值:成功,返回實(shí)際發(fā)送的字節(jié)數(shù)。失敗,返回-1,網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>ssize_trecv(intsockfd,void*buf,size_tlen,intflags);功能:在網(wǎng)絡(luò)套接字上進(jìn)行數(shù)據(jù)接收的函數(shù)參數(shù):sockfd:套接字描述符,表示接收數(shù)據(jù)的套接字。 buf:指向接收緩沖區(qū)的指針,用于存儲(chǔ)接收到的數(shù)據(jù)。 len:接收緩沖區(qū)的長(zhǎng)度,即最大可接收的字節(jié)數(shù)。 flags:接收選項(xiàng)的標(biāo)志位,可以是0或者一些特定的選項(xiàng)按位或運(yùn)算的結(jié)果。常用的選項(xiàng)包括MSG_DONTWAIT(非阻塞接收)等。返回值:成功:實(shí)際接收的字節(jié)數(shù),失?。?1網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>ssize_tsendto(intsockfd,constvoid*buf,size_tlen,intflags,conststructsockaddr*dest_addr,socklen_taddrlen);功能:用于在網(wǎng)絡(luò)套接字上進(jìn)行數(shù)據(jù)發(fā)送和接收的函數(shù),與send和recv函數(shù)類(lèi)似,但提供了更多的功能參數(shù):sockfd:套接字描述符,表示發(fā)送數(shù)據(jù)的套接字。 buf:指向要發(fā)送數(shù)據(jù)的緩沖區(qū)的指針。 len:要發(fā)送數(shù)據(jù)的字節(jié)數(shù)。 flags:發(fā)送選項(xiàng)的標(biāo)志位 dest_addr:指向目標(biāo)地址的指針,表示數(shù)據(jù)要發(fā)送到的目標(biāo)地址。該地址應(yīng)該是由sockaddr結(jié)構(gòu)體或其兼容類(lèi)型(如sockaddr_in)表示的。 addrlen:目標(biāo)地址的長(zhǎng)度,以字節(jié)為單位。返回值:成功:實(shí)際發(fā)送的字節(jié)數(shù),失敗:-1網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>ssize_trecvfrom(intsockfd,void*buf,size_tlen,intflags,structsockaddr*src_addr,socklen_t*addrlen);功能:用于在網(wǎng)絡(luò)套接字上進(jìn)行數(shù)據(jù)發(fā)送和接收的函數(shù),與send和recv函數(shù)類(lèi)似,但提供了更多的功能參數(shù):sockfd:套接字描述符,表示接收數(shù)據(jù)的套接字。 buf:指向接收緩沖區(qū)的指針,用于存儲(chǔ)接收到的數(shù)據(jù)。 len:接收緩沖區(qū)的長(zhǎng)度,即最大可接收的字節(jié)數(shù)。 flags:接收選項(xiàng)的標(biāo)志位, src_addr:指向源地址的指針,用于存儲(chǔ)發(fā)送端的地址信息。該地址應(yīng)該是由sockaddr結(jié)構(gòu)體或其兼容類(lèi)型(如sockaddr_in)表示的。如果不關(guān)心發(fā)送端的地址信息,可以將該參數(shù)設(shè)置為NULL。 addrlen:指向源地址長(zhǎng)度的指針,表示src_addr結(jié)構(gòu)體的長(zhǎng)度。在調(diào)用函數(shù)之前,應(yīng)將該值設(shè)置為結(jié)構(gòu)體的大小。返回值:成功:實(shí)際接收的字節(jié)數(shù),失?。?1網(wǎng)絡(luò)編程基礎(chǔ)1.TCP網(wǎng)絡(luò)程序的設(shè)計(jì)基于TCP-服務(wù)器1.創(chuàng)建一個(gè)socket,用函數(shù)socket()2.綁定IP地址、端口等信息到socket上,用函

數(shù)bind()3.設(shè)置允許的最大連接數(shù),用函數(shù)listen()4.等待來(lái)自客戶(hù)端的連接請(qǐng)求,用函數(shù)accept()5.收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write()6.關(guān)閉網(wǎng)絡(luò)連接網(wǎng)絡(luò)編程實(shí)例1.TCP網(wǎng)絡(luò)程序的設(shè)計(jì)基于TCP-客戶(hù)端1.創(chuàng)建一個(gè)socket,用函數(shù)socket()2.設(shè)置要連接的服務(wù)器的IP地址和端口等屬性3.連接服務(wù)器,用函數(shù)connect()4.收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write()5.關(guān)閉網(wǎng)絡(luò)連接網(wǎng)絡(luò)編程實(shí)例1.TCP網(wǎng)絡(luò)程序的設(shè)計(jì)網(wǎng)絡(luò)編程實(shí)例2.UDP網(wǎng)絡(luò)程序的設(shè)計(jì)基于UDP-服務(wù)器1.創(chuàng)建一個(gè)socket,用函數(shù)socket()2.綁定IP地址、端口等信息到socket上,

用函數(shù)bind()3.循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom()4.關(guān)閉網(wǎng)絡(luò)連接基于UDP-客戶(hù)端1.創(chuàng)建一個(gè)socket,用函數(shù)socket()2.綁定IP地址、端口等信息到socket上,用函數(shù)bind()3.設(shè)置對(duì)方的IP地址和端口等屬性4.發(fā)送數(shù)據(jù),用函數(shù)sendto()5.關(guān)閉網(wǎng)絡(luò)連接網(wǎng)絡(luò)編程實(shí)例2.UDP網(wǎng)絡(luò)程序的設(shè)計(jì)網(wǎng)絡(luò)編程實(shí)例網(wǎng)絡(luò)程序的實(shí)例實(shí)例:tcp_server.c和tcp_client.c實(shí)例:udp_server.c和udp_client.cTHANKYOU!03PARTTHERE正大氣象厚德載物MinnanUniversityofScienceandTechnology多線程編程線程簡(jiǎn)介線程的基本操作線程的程序編寫(xiě)線程1、什么是線程線程(thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。2、線程和進(jìn)程的比較1)調(diào)度2)擁有資源3)系統(tǒng)開(kāi)銷(xiāo)4)并發(fā)性一、線程簡(jiǎn)介3、多線程多線程(multithreading),是指從軟件或者硬件上實(shí)現(xiàn)多個(gè)線程并發(fā)執(zhí)行的技術(shù)。應(yīng)用:多任務(wù)程序設(shè)計(jì)、并發(fā)程序設(shè)計(jì)、網(wǎng)絡(luò)程序設(shè)計(jì)、共享數(shù)據(jù)……4、線程號(hào)進(jìn)程號(hào)在整個(gè)系統(tǒng)中是唯一的,但線程號(hào)不同,線程號(hào)只在它所屬的進(jìn)程環(huán)境中有效。進(jìn)程號(hào)用pid_t數(shù)據(jù)類(lèi)型表示,是一個(gè)非負(fù)整數(shù)。線程號(hào)則用pthrcad_t數(shù)據(jù)類(lèi)型來(lái)表示。一、線程簡(jiǎn)介5、線程四種狀態(tài)遷移圖一、線程簡(jiǎn)介就緒態(tài)創(chuàng)建被調(diào)度運(yùn)行態(tài)被搶占阻塞態(tài)等待資源條件被滿(mǎn)足終止態(tài)完成或者被取消1、線程的創(chuàng)建#include<pthread.h>int

pthread_create(pthread_t

*thread,

const

pthread_attr_t

*attr, void

*(*start_routine)(void*),

void

*arg);參數(shù): thread:所創(chuàng)建的線程號(hào)

attr:所創(chuàng)建的線程屬性,一般為none

start_routine:即將運(yùn)行的線程函數(shù)。

arg:傳遞給線程函數(shù)的參數(shù)。返回值:

成功:0

失?。悍?二、線程的基本操作線程創(chuàng)建操作1:pthread_create.c操作1:1)設(shè)置一個(gè)全局變量intnumber;默認(rèn)初值為82)在主函數(shù)中創(chuàng)建兩個(gè)線程,線程1創(chuàng)建的時(shí)候,傳遞給線程函數(shù)的參數(shù)為字符串“hellothread_fun1!”,線程2創(chuàng)建的時(shí)候不傳遞參數(shù)。并且在線程創(chuàng)建失敗時(shí)候都打印失敗提示。3)在線程處理函數(shù)1中,打印傳遞進(jìn)來(lái)的參數(shù),并且相隔1S把全局變量number加1,并打印當(dāng)前線程處理函數(shù)名和number的值。在線程處理函數(shù)2中,打印線程處理函數(shù)的名字和number的值。4)編譯程序,驗(yàn)證多線程實(shí)現(xiàn)多任務(wù)及線程間共享全局變量

和線程函數(shù)傳參數(shù)注意:線程函數(shù)的程序在pthead庫(kù)中個(gè),

故鏈接的時(shí)候要加上參數(shù)-lpthread.

2、線程等待

int

pthread_join(pthread_tthread,

void

**value_ptr);

功能:等待子線程結(jié)束,并回收子線程資源

參數(shù): thread:等待退出線程的線程號(hào)。

value_ptr:存儲(chǔ)線程退出狀態(tài)的指針的地址。

返回值:

成功為0,不成功為非0二、線程的基本操作3、線程分離intpthread_detach(pthread_tthread)功能:使調(diào)用線程與當(dāng)前線程分離,使其成為一個(gè)獨(dú)立的線程,該線程終止時(shí),系統(tǒng)將自動(dòng)回收它的資源。參數(shù):thread:線程號(hào)返回值:成功:返回0,失敗返回非0.二、線程的基本操作線程分離操作3:pthread_detach.c操作3:1)編寫(xiě)代碼驗(yàn)證線程分離,并驗(yàn)證分離后是否還可以pthread_join

來(lái)接合它了。注意:線程函數(shù)的程序在pthead庫(kù)中個(gè),

故鏈接的時(shí)候要加上參數(shù)-lpthread.4、線程退出線程的三種退出方式:1、線程從執(zhí)行函數(shù)中返回,return(自然死亡)2、線程調(diào)用pthread_exit退出線程

(自殺)3、線程可以被同一進(jìn)程中的其他線程取消pthread_cancle(他殺)

voidpthread_exit(void*retval)功能:退出調(diào)用線程參數(shù):retval:存儲(chǔ)線程退出狀態(tài)的指針注:一個(gè)進(jìn)程中的多個(gè)線程是共享該進(jìn)程的數(shù)據(jù)段,因此,通常線程退出后占用的資源不會(huì)釋放。二、線程的基本操作線程退出操作4:pthread_exit.c操作4:1)拿剛寫(xiě)的pthread_join.c程序來(lái)更改。2)更改線程1處理函數(shù),i++;當(dāng)i=5的時(shí)候,直接returnNULL,驗(yàn)證線程自然死亡現(xiàn)象。驗(yàn)證完了后再更改為調(diào)用

pthread_exit(pstr);驗(yàn)證線程自殺現(xiàn)象。3)編譯驗(yàn)證結(jié)果。注意:線程函數(shù)的程序在pthead庫(kù)中個(gè),

故鏈接的時(shí)候要加上參數(shù)-lpthread.5、線程取消intpthread_cancel(pthread_tthread)

功能:發(fā)送終止信號(hào)給thread線程返回值:如果成功則返回0,否則為非0值。注:發(fā)送成功并不意味著thread會(huì)終止。pthreadsetcancelstate(intstate,int*old_state);state:PTHREAD_CANCEL_DISABLE,不可以被取消PTHREAD_CANCEL_ENABLE,可以被取消Old_state:保存調(diào)用線程原來(lái)的可取消狀態(tài)的內(nèi)存地址。二、線程的基本操作5、線程取消voidpthread_testcancel(void);設(shè)置取消點(diǎn)當(dāng)別的線程取消調(diào)用此函數(shù)的線程時(shí)候,被取消的線程執(zhí)行到此函數(shù)時(shí)結(jié)束。pthread_setcanceltype(inttype,int*oldtype)設(shè)置取消類(lèi)型tppe:PTHREAD_CANCEL_ASYNCHRONOUS立即取消PTHREAD_CANCEL_DEFERRED不立即取消oldtype:

保存調(diào)用線程原來(lái)的可取消類(lèi)型的內(nèi)存地址。二、線程的基本操作總結(jié):1、線程簡(jiǎn)介2、進(jìn)程創(chuàng)健、等待、分離、退出、取消作業(yè):1、編寫(xiě)程序?qū)崿F(xiàn)創(chuàng)建5個(gè)線程

3、思政:

總結(jié)與作業(yè)THANKYOU!嵌入式系統(tǒng)原理與應(yīng)用第三章文件I/O編程正大氣象厚德載物MinnanUniversityofScienceandTechnology文件I/O編程CONTENTS01.系統(tǒng)調(diào)用---文件訪問(wèn)02.標(biāo)準(zhǔn)I/O---文件訪問(wèn)03.S5P6818文件操作實(shí)例正大氣象厚德載物MinnanUniversityofScienceandTechnology01PARTONE系統(tǒng)調(diào)用---文件訪問(wèn)正大氣象厚德載物MinnanUniversityofScienceandTechnology任務(wù)實(shí)現(xiàn):在廣告屏上顯示“中華人民共和國(guó)成立75周年”宣傳圖Linux中文件編程可以使用兩種方法:Linux系統(tǒng)調(diào)用:依賴(lài)于Linux系統(tǒng)C語(yǔ)言庫(kù)函數(shù):與操作系統(tǒng)是獨(dú)立的,在任何操作系統(tǒng)下,使用C語(yǔ)言庫(kù)函數(shù)操作文件的方法都是相同的。文件編程在數(shù)字世界中,文件不僅是數(shù)據(jù)的載體,更是信息安全的前線,掌握文件操作就像是通往打開(kāi)數(shù)字寶庫(kù)的鑰匙,而Linux下一切皆文件,文件操作尤其重要。

系統(tǒng)調(diào)用---創(chuàng)建文件(creat)filename:要?jiǎng)?chuàng)建的文件名(包含路徑,缺省為當(dāng)前路徑)mode:創(chuàng)建模式,常見(jiàn)創(chuàng)建模式有S_IRUSR 可讀4S_IWUSR 可寫(xiě)2S_IXUSR 可執(zhí)行1S_IRWXU 可讀可寫(xiě)可執(zhí)行7intcreat(constchar*filename, mode_tmode)系統(tǒng)調(diào)用---access功能:判斷文件是否可以進(jìn)行某種操作(讀,寫(xiě),存在等)pathname:文件名稱(chēng)mode:要判斷的訪問(wèn)權(quán)限。可以取以下值或者是他們的組合。R_OK:文件可讀,W_OK:文件可寫(xiě),X_OK:文件可執(zhí)行,F(xiàn)_OK:文件存在。返回值:當(dāng)測(cè)試成功時(shí),函數(shù)返回0,否則如果一個(gè)條件不符時(shí),返回-1。intaccess(constchar*pathname,intmode)系統(tǒng)調(diào)用---打開(kāi)文件(open)pathname:要打開(kāi)的文件名(包含路徑,缺省為當(dāng)前路徑)flags:打開(kāi)標(biāo)志mode:被打開(kāi)文件的權(quán)限返回值:成功為文件描述符,失敗為-1intopen(constchar*pathname,intflags)intopen(constchar*pathname,intflags,mode_tmode)系統(tǒng)調(diào)用---關(guān)閉文件(close)fd:文件描述符返回值:成功為0,失敗為-1intclose(intfd)操作3.1:open_count.c操作3.2:access_creat.c系統(tǒng)調(diào)用---read功能:從文件描述符fd所指定的文件中讀取length個(gè)字節(jié)到buf所指向的緩沖區(qū)中。fd:文件描述符buf:讀出數(shù)據(jù)的緩沖區(qū)length:讀出的字節(jié)數(shù)返回值:成功為實(shí)際讀取的字節(jié)數(shù),到達(dá)文件結(jié)尾為0,失敗為-1。intread(intfd,constvoid*buf,size_tlength)系統(tǒng)調(diào)用---write功能:把length個(gè)字節(jié)從buf指向的緩沖區(qū)中寫(xiě)到文件描述符fd所指向的文件中,返回值為實(shí)際寫(xiě)入的字節(jié)數(shù)。fd:文件描述符buf:寫(xiě)入數(shù)據(jù)的緩沖區(qū)length:寫(xiě)入數(shù)據(jù)的字節(jié)數(shù)返回值:成功已寫(xiě)的字節(jié)數(shù),失敗為-1intwrite(intfd,constvoid*buf,size_tlength)操作3.3:my_copy.c系統(tǒng)調(diào)用---lseek功能:將文件讀寫(xiě)指針相對(duì)whence移動(dòng)offset個(gè)字節(jié)。fd:文件描述符offset:偏移量,負(fù)(向前移),正(向后移)whence:相對(duì)位置SEEK_SET:當(dāng)前位置為文件的開(kāi)頭 SEEK_CUR:當(dāng)前位置為文件指針的位置 SEEK_END:當(dāng)前位置為文件的結(jié)尾返回值:成功為文件的當(dāng)前位移,失敗為-1intlseek(intfd,offset_toffset,intwhence)操作3.4:read_wav.c1、open、close、read、write、creat、lseek、access2、作業(yè)3、思政:在數(shù)字世界中,文件不僅是數(shù)據(jù)的載體,更是信息安全的前線,掌握文件操作就像是通往打開(kāi)數(shù)字寶庫(kù)的鑰匙。

總結(jié)與作業(yè)THANKYOU!02PARTTWO標(biāo)準(zhǔn)I/O---文件訪問(wèn)正大氣象厚德載物MinnanUniversityofScienceandTechnology標(biāo)準(zhǔn)I/O---打開(kāi)文件(fopen)path:要打開(kāi)的文件名(包含路徑,缺省為當(dāng)前路徑)mode:文件打開(kāi)的狀態(tài)返回值:成功為文件指針,失敗為NULLFILE*fopen(constchar*path,constchar*mode)標(biāo)準(zhǔn)I/O---關(guān)閉文件(fclose)stream:已打開(kāi)的文件指針?lè)祷刂担撼晒?,失敗為EOFintfclose(FILE*stream)標(biāo)準(zhǔn)I/O---錯(cuò)誤處理s:在標(biāo)準(zhǔn)錯(cuò)誤流上輸出的信息返回值:無(wú)voidperror(constchar*s);errnum:錯(cuò)誤碼返回值:錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息char*strerror(interrnum);標(biāo)準(zhǔn)I/O---文件定位stream:需要定位的文件指針offset:相對(duì)于基準(zhǔn)值的偏移量whence:基準(zhǔn)值,SEEK_SET:文件起始位置SEEK_CUR:文件當(dāng)前讀寫(xiě)位置SEEK_END:文件結(jié)束位置返回值:成功為0,失敗為EOF。intfseek(FILE*stream,longoffset,intwhence);標(biāo)準(zhǔn)I/O---文件定位stream:需要定位的文件指針?lè)祷刂担撼晒楫?dāng)前讀寫(xiě)位置,失敗為EOF。longftell(FILE*stream);標(biāo)準(zhǔn)I/O(指定大小進(jìn)行讀寫(xiě))---文件讀ptr:存放讀入記錄的緩沖區(qū)size:讀取的記錄大小nmemb:讀取的記錄數(shù)stream:要讀取的文件流返回值:成功為返回實(shí)際讀取到的nmemb數(shù)目

失敗為EOF。size_tfread(void*ptr,size_tsize,size_tnmemb,FILE*stream)標(biāo)準(zhǔn)I/O(指定大小進(jìn)行讀寫(xiě))---文件寫(xiě)ptr:存放寫(xiě)入記錄的緩沖區(qū)size:寫(xiě)入的記錄大小nmemb:寫(xiě)入的記錄數(shù)stream:要寫(xiě)入的文件流返回值:成功為返回實(shí)際寫(xiě)入的nmemb數(shù)目

失敗為EOF。size_tfwrite(void*ptr,size_tsize,size_tnmemb,FILE*stream)操作3.5:fread_fwrite.c標(biāo)準(zhǔn)I/O(按字符(字節(jié))輸入/輸出)---文件讀寫(xiě)stream:要輸入的文件流返回值:成功為下一個(gè)字節(jié)

失敗為EOF。intgetc(FILE*stream)intfgetc(FILE*stream)intgetchar(void)標(biāo)準(zhǔn)I/O(按字符(字節(jié))輸入/輸出)---文件讀寫(xiě)c:需要寫(xiě)的內(nèi)容stream:要寫(xiě)入的文件流返回值:成功為字符

失敗為EOF。intputc(intc,FILE*stream)intfputc(intc,FILE*stream)intputchar(intc)操作3.6:fgetc_fputc.c標(biāo)準(zhǔn)I/O(按行輸入/輸出)---文件讀寫(xiě)s:要輸出的字符串stream:對(duì)應(yīng)的文件流返回值:成功為s;失敗為NULL。intputs(constchar*s)intfputs(constchar*s,FILE*stream)操作3.7:fgets_fputs.cchar*gets(char*s)charfgets(char*s,intsize,FILE*stream)s:要輸入的字符串size:輸入的字符串長(zhǎng)度stream:對(duì)應(yīng)的文件流返回值:成功為s,失敗為NULL。1、fopen、fclose、fread、fwrite、fseek、fgetc/fputc、fgets/fputs2、作業(yè)3、思政:

總結(jié)與作業(yè)THANKYOU!03PARTTHERE正大氣象厚德載物MinnanUniversityofScienceandTechnologyS5P6818文件操作實(shí)例S5P6818顯示圖片---原理在Linux中,一切皆文件,LCD顯示屏對(duì)應(yīng)的設(shè)備文件為/dev/fb0。如果想讓LCD顯示屏顯示顏色,就是把顏色寫(xiě)入到LCD顯示屏對(duì)應(yīng)的設(shè)備文件中,查看LCD設(shè)備文件相關(guān)信息。[root@GEC6818/IOT]#ls-l/dev/fb0crw-rw----1rootroot29,0Jan11970/dev/fb0顏色基于RGB模型,即紅、綠、藍(lán),其范圍是[0,255],每種顏色分量都占一個(gè)字節(jié)。LCD顯示屏顯示接收的顏色信息是aRGB,a為透明度,一般為0,總共4個(gè)字節(jié),正好是int類(lèi)型數(shù)據(jù)。如果要顯示紅色,可以定義一個(gè)變量等于0x00ff0000,綠色為0x0000ff00,藍(lán)色為0x000000ff。10寸LCD顯示屏的大小為1024*600,7寸LCD顯示屏的大小為800*480,寫(xiě)入順序是從左到右,從上到下。圖片的格式有很多,比如bmp、png、gif、jpg等。bmp格式圖片包含54字節(jié)的bmp格式的文件頭和像素值,其像素值以BGR形式排列,每一個(gè)像素占有3字節(jié)。S5P6818顯示圖片操作3.8:bmp.c編譯運(yùn)行結(jié)果[root@GEC6818/IOT]#rxbmp[root@GEC6818/IOT]#

chmod777bmp[root@GEC6818/IOT]#./bmpcw@dell:/mnt/hgfs/share/day1_io$arm-none-linux-gnueabi-gccbmp.c-obmpS5P6818獲取坐標(biāo)值操作3.9:ts.c編譯運(yùn)行結(jié)果cw@dell:/mnt/hgfs/share/day1_io$arm-none-linux-gnueabi-gccts.c-ots[root@GEC6818/IOT]#rxts[root@GEC6818/IOT]#

chmod777ts[root@GEC6818/IOT]#./ts(132,418)[root@GEC6818/IOT]#./ts(103,519)1、編寫(xiě)程序?qū)崿F(xiàn)自動(dòng)播放顯示圖片,時(shí)間間隔可以設(shè)置為1s。2、編寫(xiě)程序?qū)崿F(xiàn)點(diǎn)擊LCD屏幕左邊顯示一張圖片,點(diǎn)擊右邊顯示另一張圖片。作業(yè)嵌入式系統(tǒng)原理與應(yīng)用第五章硬件平臺(tái)正大氣象厚德載物MinnanUniversityofScienceandTechnology硬件平臺(tái)CONTENTS01.Cortex-A53處理器02.GEC6818開(kāi)發(fā)平臺(tái)簡(jiǎn)介03.通用I/O—點(diǎn)亮LED燈04.

外部中斷05.UART串口通信正大氣象厚德載物MinnanUniversityofScienceandTechnology01PARTONECortex-A53處理器正大氣象厚德載物MinnanUniversityofScienceandTechnology正大氣象厚德載物MinnanUniversityofScienceandTechnol

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論