




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、本系列文章中的前兩部分,我們探討管道及信號兩種通信機制,本文將深入第三部分,介紹系統 v 消息隊列及其相應 api。消息隊列(也叫做報文隊列)能夠克服早期unix通信機制的一些缺點。作為早期unix通信機制之一的信號能夠傳送的信息量有限,后來雖然posix 1003.1b在信號的實時性方面作了拓廣,使得信號在傳遞信息量方面有了相當程度的改進,但是信號這種通信方式更像即時的通信方式,它要求接受信號的進程在某個時間范圍內對信號做出反應,因此該信號最多在接受信號進程的生命周期內才有意義,信號所傳遞的信息是接近于隨進程持續的概念(process-persistent),見附錄 1;管道及有名管道及有名
2、管道則是典型的隨進程持續ipc,并且,只能傳送無格式的字節流無疑會給應用程序開發帶來不便,另外,它的緩沖區大小也受到限制。消息隊列就是一個消息的鏈表??梢园严⒖醋饕粋€記錄,具有特定的格式以及特定的優先級。對消息隊列有寫權限的進程可以向中按照一定的規則添加新消息;對消息隊列有讀權限的進程則可以從消息隊列中讀走消息。消息隊列是隨內核持續的(參見附錄 1)。目前主要有兩種類型的消息隊列:posix消息隊列以及系統v消息隊列,系統v消息隊列目前被大量使用??紤]到程序的可移植性,新開發的應用程序應盡量使用posix消息隊列。在本系列專題的序(深刻理解linux進程間通信(ipc)中,提到對于消息隊列、
3、信號燈、以及共享內存區來說,有兩個實現版本:posix的以及系統v的。linux內核(內核2.4.18)支持posix信號燈、posix共享內存區以及posix消息隊列,但對于主流linux發行版本之一redhad8.0(內核2.4.18),還沒有提供對posix進程間通信api的支持,不過應該只是時間上的事。因此,本文將主要介紹系統v消息隊列及其相應api。在沒有聲明的情況下,以下討論中指的都是系統v消息隊列。一、消息隊列基本概念1. 系統v消息隊列是隨內核持續的,只有在內核重起或者顯示刪除一個消息隊列時,該消息隊列才會真正被刪除。因此系統中記錄消息隊列的數據結構(struct ipc_id
4、s msg_ids)位于內核中,系統中的所有消息隊列都可以在結構msg_ids中找到訪問入口。 2. 消息隊列就是一個消息的鏈表。每個消息隊列都有一個隊列頭,用結構struct msg_queue來描述(參見附錄 2)。隊列頭中包含了該消息隊列的大量信息,包括消息隊列鍵值、用戶id、組id、消息隊列中消息數目等等,甚至記錄了最近對消息隊列讀寫進程的id。讀者可以訪問這些信息,也可以設置其中的某些信息。 3. 下圖說明了內核與消息隊列是怎樣建立起聯系的:其中:struct ipc_ids msg_ids是內核中記錄消息隊列的全局數據結構;struct msg_queue是每個消息隊列的隊列頭。
5、從上圖可以看出,全局數據結構 struct ipc_ids msg_ids 可以訪問到每個消息隊列頭的第一個成員:struct kern_ipc_perm;而每個struct kern_ipc_perm能夠與具體的消息隊列對應起來是因為在該結構中,有一個key_t類型成員key,而key則唯一確定一個消息隊列。kern_ipc_perm結構如下:struct kern_ipc_perm /內核中記錄消息隊列的全局數據結構msg_ids能夠訪問到該結構; key_t key; /該鍵值則唯一對應一個消息隊列 uid_t uid; gid_t gid;uid_t cuid;gid_t cgid;m
6、ode_t mode;unsigned long seq;二、操作消息隊列對消息隊列的操作無非有下面三種類型:1、 打開或創建消息隊列消息隊列的內核持續性要求每個消息隊列都在系統范圍內對應唯一的鍵值,所以,要獲得一個消息隊列的描述字,只需提供該消息隊列的鍵值即可;注:消息隊列描述字是由在系統范圍內唯一的鍵值生成的,而鍵值可以看作對應系統內的一條路經。2、 讀寫操作消息讀寫操作非常簡單,對開發人員來說,每個消息都類似如下的數據結構:struct msgbuflong mtype;char mtext1;mtype成員代表消息類型,從消息隊列中讀取消息的一個重要依據就是消息的類型;mtext是消息
7、內容,當然長度不一定為1。因此,對于發送消息來說,首先預置一個msgbuf緩沖區并寫入消息類型和內容,調用相應的發送函數即可;對讀取消息來說,首先分配這樣一個msgbuf緩沖區,然后把消息讀入該緩沖區即可。3、 獲得或設置消息隊列屬性:消息隊列的信息基本上都保存在消息隊列頭中,因此,可以分配一個類似于消息隊列頭的結構(struct msqid_ds,見附錄 2),來返回消息隊列的屬性;同樣可以設置該數據結構。消息隊列api1、文件名到鍵值#include #include key_t ftok (char*pathname, char proj);它返回與路徑pathname相對應的一個鍵值。
8、該函數不直接對消息隊列操作,但在調用ipc(msgget,)或msgget()來獲得消息隊列描述字前,往往要調用該函數。典型的調用代碼是: key=ftok(path_ptr, a); ipc_id=ipc(msgget, (int)key, flags,0,null,0); 2、linux為操作系統v進程間通信的三種方式(消息隊列、信號燈、共享內存區)提供了一個統一的用戶界面:int ipc(unsigned int call, int first, int second, int third, void *ptr, long fifth);第一個參數指明對ipc對象的操作方式,對消息隊列而
9、言共有四種操作:msgsnd、msgrcv、msgget以及msgctl,分別代表向消息隊列發送消息、從消息隊列讀取消息、打開或創建消息隊列、控制消息隊列;first參數代表唯一的ipc對象;下面將介紹四種操作。 int ipc(msgget, int first, int second, int third, void *ptr, long fifth);與該操作對應的系統v調用為:int msgget( (key_t)first,second)。 int ipc(msgctl, int first, int second, int third, void *ptr, long fifth)
10、與該操作對應的系統v調用為:int msgctl( first,second, (struct msqid_ds*) ptr)。 int ipc(msgsnd, int first, int second, int third, void *ptr, long fifth);與該操作對應的系統v調用為:int msgsnd( first, (struct msgbuf*)ptr, second, third)。 int ipc(msgrcv, int first, int second, int third, void *ptr, long fifth);與該操作對應的系統v調用為:int m
11、sgrcv( first,(struct msgbuf*)ptr, second, fifth,third), 注:本人不主張采用系統調用ipc(),而更傾向于采用系統v或者posix進程間通信api。原因如下: 雖然該系統調用提供了統一的用戶界面,但正是由于這個特性,它的參數幾乎不能給出特定的實際意義(如以first、second來命名參數),在一定程度上造成開發不便。 正如ipc手冊所說的:ipc()是linux所特有的,編寫程序時應注意程序的移植性問題; 該系統調用的實現不過是把系統v ipc函數進行了封裝,沒有任何效率上的優勢; 系統v在ipc方面的api數量不多,形式也較簡潔。 3.
12、系統v消息隊列api系統v消息隊列api共有四個,使用時需要包括幾個頭文件:#include #include #include 1)int msgget(key_t key, int msgflg)參數key是一個鍵值,由ftok獲得;msgflg參數是一些標志位。該調用返回與健值key相對應的消息隊列描述字。在以下兩種情況下,該調用將創建一個新的消息隊列: 如果沒有消息隊列與健值key相對應,并且msgflg中包含了ipc_creat標志位; key參數為ipc_private; 參數msgflg可以為以下:ipc_creat、ipc_excl、ipc_nowait或三者的或結果。調用返回
13、:成功返回消息隊列描述字,否則返回-1。注:參數key設置成常數ipc_private并不意味著其他進程不能訪問該消息隊列,只意味著即將創建新的消息隊列。2)int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);該系統調用從msgid代表的消息隊列中讀取一個消息,并把消息存儲在msgp指向的msgbuf結構中。msqid為消息隊列描述字;消息返回后存儲在msgp指向的地址,msgsz指定msgbuf的mtext成員的長度(即消息內容的長度),msgtyp為請求讀取的消息類型;讀消息標志msg
14、flg可以為以下幾個常值的或: ipc_nowait 如果沒有滿足條件的消息,調用立即返回,此時,errno=enomsg ipc_except 與msgtyp0配合使用,返回隊列中第一個類型不為msgtyp的消息 ipc_noerror 如果隊列中滿足條件的消息內容大于所請求的msgsz字節,則把該消息截斷,截斷部分將丟失。 msgrcv手冊中詳細給出了消息類型取不同值時(0; 0; =0),調用將返回消息隊列中的哪個消息。msgrcv()解除阻塞的條件有三個:1. 消息隊列中有了滿足條件的消息; 2. msqid代表的消息隊列被刪除; 3. 調用msgrcv()的進程被信號中斷; 調用返回
15、:成功返回讀出消息的實際字節數,否則返回-1。3)int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);向msgid代表的消息隊列發送一個消息,即將發送的消息存儲在msgp指向的msgbuf結構中,消息的大小由msgze指定。對發送消息來說,有意義的msgflg標志為ipc_nowait,指明在消息隊列沒有足夠空間容納要發送的消息時,msgsnd是否等待。造成msgsnd()等待的條件有兩種: 當前消息的大小與當前消息隊列中的字節數之和超過了消息隊列的總容量; 當前消息隊列的消息數(單位個)不小于消息隊列的總容量(單
16、位字節數),此時,雖然消息隊列中的消息數目很多,但基本上都只有一個字節。 msgsnd()解除阻塞的條件有三個: 1. 不滿足上述兩個條件,即消息隊列中有容納該消息的空間; 2. msqid代表的消息隊列被刪除; 3. 調用msgsnd()的進程被信號中斷; 調用返回:成功返回0,否則返回-1。4)int msgctl(int msqid, int cmd, struct msqid_ds *buf);該系統調用對由msqid標識的消息隊列執行cmd操作,共有三種cmd操作:ipc_stat、ipc_set 、ipc_rmid。1. ipc_stat:該命令用來獲取消息隊列信息,返回的信息存貯
17、在buf指向的msqid結構中; 2. ipc_set:該命令用來設置消息隊列的屬性,要設置的屬性存儲在buf指向的msqid結構中;可設置屬性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同時,也影響msg_ctime成員。 3. ipc_rmid:刪除msqid標識的消息隊列; 調用返回:成功返回0,否則返回-1。三、消息隊列的限制每個消息隊列的容量(所能容納的字節數)都有限制,該值因系統不同而不同。在后面的應用實例中,輸出了redhat 8.0的限制,結果參見附錄 3。另一個限制是每個消息隊列所能容納的最大消息數:在redh
18、ad 8.0中,該限制是受消息隊列容量制約的:消息個數要小于消息隊列的容量(字節數)。注:上述兩個限制是針對每個消息隊列而言的,系統對消息隊列的限制還有系統范圍內的最大消息隊列個數,以及整個系統范圍內的最大消息數。一般來說,實際開發過程中不會超過這個限制。四、消息隊列應用實例消息隊列應用相對較簡單,下面實例基本上覆蓋了對消息隊列的所有操作,同時,程序輸出結果有助于加深對前面所講的某些規則及消息隊列限制的理解。#include #include #include void msg_stat(int,struct msqid_ds );main()int gflags,sflags,rflags;
19、key_t key;int msgid;int reval;struct msgsbuf int mtype; char mtext1; msg_sbuf;struct msgmbuf int mtype; char mtext10; msg_rbuf;struct msqid_ds msg_ginfo,msg_sinfo;char* msgpath=/unix/msgqueue;key=ftok(msgpath,a);gflags=ipc_creat|ipc_excl;msgid=msgget(key,gflags|00666);if(msgid=-1) printf(msg create
20、errorn); return;/創建一個消息隊列后,輸出消息隊列缺省屬性msg_stat(msgid,msg_ginfo);sflags=ipc_nowait;msg_sbuf.mtype=10;msg_sbuf.mtext0=a;reval=msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);if(reval=-1) printf(message send errorn);/發送一個消息后,輸出消息隊列屬性msg_stat(msgid,msg_ginfo);rflags=ipc_nowait|msg_noerror;reval=msg
21、rcv(msgid,&msg_rbuf,4,10,rflags);if(reval=-1) printf(read msg errorn);else printf(read from msg queue %d bytesn,reval);/從消息隊列中讀出消息后,輸出消息隊列屬性msg_stat(msgid,msg_ginfo);msg_sinfo.msg_perm.uid=8;/just a trymsg_sinfo.msg_perm.gid=8;/msg_sinfo.msg_qbytes=16388;/此處驗證超級用戶可以更改消息隊列的缺省msg_qbytes/注意這里設置的值大于缺省值r
22、eval=msgctl(msgid,ipc_set,&msg_sinfo);if(reval=-1) printf(msg set info errorn); return;msg_stat(msgid,msg_ginfo);/驗證設置消息隊列屬性reval=msgctl(msgid,ipc_rmid,null);/刪除消息隊列if(reval=-1) printf(unlink msg queue errorn); return;void msg_stat(int msgid,struct msqid_ds msg_info)int reval;sleep(1);/只是為了后面輸出時間的方便
23、reval=msgctl(msgid,ipc_stat,&msg_info);if(reval=-1) printf(get msg info errorn); return;printf(n);printf(current number of bytes on queue is %dn,msg_info.msg_cbytes);printf(number of messages in queue is %dn,msg_info.msg_qnum);printf(max number of bytes on queue is %dn,msg_info.msg_qbytes);/每個消息隊列的容
24、量(字節數)都有限制msgmnb,值的大小因系統而異。在創建新的消息隊列時,/msg_qbytes的缺省值就是msgmnbprintf(pid of last msgsnd is %dn,msg_info.msg_lspid);printf(pid of last msgrcv is %dn,msg_info.msg_lrpid);printf(last msgsnd time is %s, ctime(&(msg_info.msg_stime);printf(last msgrcv time is %s, ctime(&(msg_info.msg_rtime);printf(last cha
25、nge time is %s, ctime(&(msg_info.msg_ctime);printf(msg uid is %dn,msg_info.msg_perm.uid);printf(msg gid is %dn,msg_info.msg_perm.gid);程序輸出結果見附錄 3。小結:消息隊列與管道以及有名管道相比,具有更大的靈活性,首先,它提供有格式字節流,有利于減少開發人員的工作量;其次,消息具有類型,在實際應用中,可作為優先級使用。這兩點是管道以及有名管道所不能比的。同樣,消息隊列可以在幾個進程間復用,而不管這幾個進程是否具有親緣關系,這一點與有名管道很相似;但消息隊列是隨內
26、核持續的,與有名管道(隨進程持續)相比,生命力更強,應用空間更大。附錄 1:在參考文獻1中,給出了ipc隨進程持續、隨內核持續以及隨文件系統持續的定義:1. 隨進程持續:ipc一直存在到打開ipc對象的最后一個進程關閉該對象為止。如管道和有名管道; 2. 隨內核持續:ipc一直持續到內核重新自舉或者顯示刪除該對象為止。如消息隊列、信號燈以及共享內存等; 3. 隨文件系統持續:ipc一直持續到顯示刪除該對象為止。 附錄 2:結構msg_queue用來描述消息隊列頭,存在于系統空間:struct msg_queue struct kern_ipc_perm q_perm; time_t q_sti
27、me; /* last msgsnd time */ time_t q_rtime; /* last msgrcv time */ time_t q_ctime; /* last change time */ unsigned long q_cbytes; /* current number of bytes on queue */ unsigned long q_qnum; /* number of messages in queue */ unsigned long q_qbytes; /* max number of bytes on queue */ pid_t q_lspid; /*
28、 pid of last msgsnd */ pid_t q_lrpid; /* last receive pid */ struct list_head q_messages; struct list_head q_receivers; struct list_head q_senders;結構msqid_ds用來設置或返回消息隊列的信息,存在于用戶空間;struct msqid_ds struct ipc_perm msg_perm; struct msg *msg_first; /* first message on queue,unused */ struct msg *msg_las
29、t; /* last message in queue,unused */ _kernel_time_t msg_stime; /* last msgsnd time */ _kernel_time_t msg_rtime; /* last msgrcv time */ _kernel_time_t msg_ctime; /* last change time */ unsigned long msg_lcbytes; /* reuse junk fields for 32 bit */ unsigned long msg_lqbytes; /* ditto */ unsigned short
30、 msg_cbytes; /* current number of bytes on queue */ unsigned short msg_qnum; /* number of messages in queue */ unsigned short msg_qbytes; /* max number of bytes on queue */ _kernel_ipc_pid_t msg_lspid; /* pid of last msgsnd */ _kernel_ipc_pid_t msg_lrpid; /* last receive pid */;/可以看出上述兩個結構很相似。附錄 3:消
31、息隊列實例輸出結果:current number of bytes on queue is 0number of messages in queue is 0max number of bytes on queue is 16384pid of last msgsnd is 0pid of last msgrcv is 0last msgsnd time is thu jan 1 08:00:00 1970last msgrcv time is thu jan 1 08:00:00 1970last change time is sun dec 29 18:28:20 2002msg uid
32、is 0msg gid is 0/上面剛剛創建一個新消息隊列時的輸出current number of bytes on queue is 1number of messages in queue is 1max number of bytes on queue is 16384pid of last msgsnd is 2510pid of last msgrcv is 0last msgsnd time is sun dec 29 18:28:21 2002last msgrcv time is thu jan 1 08:00:00 1970last change time is sun
33、dec 29 18:28:20 2002msg uid is 0msg gid is 0待添加的隱藏文字內容2read from msg queue 1 bytes/實際讀出的字節數current number of bytes on queue is 0number of messages in queue is 0max number of bytes on queue is 16384 /每個消息隊列最大容量(字節數)pid of last msgsnd is 2510pid of last msgrcv is 2510last msgsnd time is sun dec 29 18:
34、28:21 2002last msgrcv time is sun dec 29 18:28:22 2002last change time is sun dec 29 18:28:20 2002msg uid is 0msg gid is 0current number of bytes on queue is 0number of messages in queue is 0max number of bytes on queue is 16388 /可看出超級用戶可修改消息隊列最大容量pid of last msgsnd is 2510pid of last msgrcv is 2510
35、 /對操作消息隊列進程的跟蹤last msgsnd time is sun dec 29 18:28:21 2002last msgrcv time is sun dec 29 18:28:22 2002last change time is sun dec 29 18:28:23 2002 /msgctl()調用對msg_ctime有影響msg uid is 8msg gid is 8參考文獻: unix網絡編程第二卷:進程間通信,作者:w.richard stevens,譯者:楊繼張,清華大學出版社。對posix以及系統v消息隊列都有闡述,對linux環境下的程序開發有極大的啟發意義。 l
36、inux內核源代碼情景分析(上),毛德操、胡希明著,浙江大學出版社,給出了系統v消息隊列相關的源代碼分析。 /a4/b2/20010508/113315.html,主要闡述linux下對文件的操作,詳細介紹了對文件的存取權限位,對ipc對象的存取權限同樣具有很好的借鑒意義。 msgget、msgsnd、msgrcv、msgctl手冊employment tribunals sort out disagreements between employers and employees.you may need to make a claim to an
37、employment tribunal if: you dont agree with the disciplinary action your employer has taken against you your employer dismisses you and you think that you have been dismissed unfairly.for more information about dismissal and unfair dismissal, seedismissal.you can make a claim to an employment tribun
38、al, even if you haventappealedagainst the disciplinary action your employer has taken against you. however, if you win your case, the tribunal may reduce any compensation awarded to you as a result of your failure to appeal.remember that in most cases you must make an application to an employment tr
39、ibunal within three months of the date when the event you are complaining about happened. if your application is received after this time limit, the tribunal will not usually accept it.if you are worried about how the time limits apply to you, take advice from one of the organisations listed underfu
40、rther help.employment tribunals are less formal than some other courts, but it is still a legal process and you will need to give evidence under an oath or affirmation.most people find making a claim to an employment tribunal challenging. if you are thinking about making a claim to an employment tri
41、bunal, you should get help straight away from one of the organisations listed underfurther help.if you are being represented by a solicitor at the tribunal, they may ask you to sign an agreement where you pay their fee out of your compensation if you win the case. this is known as adamages-based agr
42、eement. in england and wales, your solicitor cant charge you more than 35% of your compensation if you win the case.if you are thinking about signing up for a damages-based agreement, you should make sure youre clear about the terms of the agreement. it might be best to get advice from an experience
43、d adviser, for example, at a citizens advice bureau. to find your nearest cab, including those that give advice by e-mail, click onnearest cab.for more information about making a claim to an employment tribunal, seeemployment tribunals.the (lack of) air up there watch mcayman islands-based webb, the
44、 head of fifas anti-racism taskforce, is in london for the football associations 150th anniversary celebrations and will attend citys premier league match at chelsea on sunday.i am going to be at the match tomorrow and i have asked to meet yaya toure, he told bbc sport.for me its about how he felt a
45、nd i would like to speak to him first to find out what his experience was.uefa hasopened disciplinary proceedings against cskafor the racist behaviour of their fans duringcitys 2-1 win.michel platini, president of european footballs governing body, has also ordered an immediate investigation into th
46、e referees actions.cska said they were surprised and disappointed by toures complaint. in a statement the russian side added: we found no racist insults from fans of cska.age has reached the end of the beginning of a word. may be guilty in his seems to passing a lot of different life became the appe
47、arance of the same day; may be back in the past, to oneself the paranoid weird belief disillusionment, these days, my mind has been very messy, in my mind constantly. always feel oneself should go to do something, or write something. twenty years of life trajectory deeply shallow, suddenly feel some
48、thing, do it.一字開頭的年齡已經到了尾聲。或許是愧疚于自己似乎把轉瞬即逝的很多個不同的日子過成了同一天的樣子;或許是追溯過去,對自己那些近乎偏執的怪異信念的醒悟,這些天以來,思緒一直很凌亂,在腦海中不斷糾纏??傆X得自己自己似乎應該去做點什么,或者寫點什么。二十年的人生軌跡深深淺淺,突然就感覺到有些事情,非做不可了。the end of our life, and can meet many things really do?而窮盡我們的一生,又能遇到多少事情是真正地非做不可?during my childhood, think lucky money and new clothes
49、 are necessary for new year, but as the advance of the age, will be more and more found that those things are optional; junior high school, thought to have a crush on just means that the real growth, but over the past three years later, his writing of alumni in peace, suddenly found that isnt really
50、 grow up, it seems is not so important; then in high school, think dont want to give vent to out your inner voice can be in the high school children of the feelings in a period, but was eventually infarction when graduation party in the throat, later again stood on the pitch he has sweat profusely,
51、looked at his thrown a basketball hoops, suddenly found himself has already cant remember his appearance.童年時,覺得壓歲錢和新衣服是過年必備,但是隨著年齡的推進,會越來越發現,那些東西根本就可有可無;初中時,以為要有一場暗戀才意味著真正的成長,但三年過去后,自己心平氣和的寫同學錄的時候,突然就發現是不是真正的成長了,好像并沒有那么重要了;然后到了高中,覺得非要吐露出自己的心聲才能為高中生涯里的懵懂情愫劃上一個句點,但畢業晚會的時候最終還是被梗塞在了咽喉,后來再次站在他曾經揮汗如雨的球場,看
52、著他投過籃球的球框時,突然間發現自己已經想不起他的容顏。originally, this world, can produce a chemical reaction to an event, in addition to resolutely, have to do, and time.原來,這個世界上,對某個事件能產生化學反應的,除了非做不可的堅決,還有,時間。a persons time, your ideas are always special to clear. want, want, line is clear, as if nothing could shake his. al
53、so once seemed to be determined to do something, but more often is he backed out at last. dislike his cowardice, finally found that there are a lot of love, there are a lot of miss, like shadow really have been doomed. those who do, just green years oneself give oneself an arm injection, or is a sel
54、f-righteous spiritual.一個人的時候,自己的想法總是特別地清晰。想要的,不想要的,界限明確,好像沒有什么可以撼動自己。也曾經好像已經下定了決心去做某件事,但更多的時候是最后又打起了退堂鼓。嫌惡過自己的怯懦,最終卻發現有很多緣分,有很多錯過,好像冥冥之中真的已經注定。那些曾經所謂的非做不可,只是青蔥年華里自己給自己注射的一支強心劑,或者說,是自以為是的精神寄托罷了。at the moment, the sky is dark, the air is fresh factor after just rained. suddenly thought of blue plaid s
55、hirt; those were broken into various shapes of stationery; from the corner at the beginning of deep friendship; have declared the end of the encounter that havent start planning. those years, those days of do, finally, like youth, will end in our life.此刻,天空是陰暗的,空氣里有著剛下過雨之后的清新因子。突然想到那件藍格子襯衫;那些被折成各種各樣形狀的信紙;那段從街角深巷伊始的友誼;還有那場還沒有開始就宣告了終結的邂逅計劃那些年那些天的非做不可,終于和青春一樣,都將在我們的人生中謝幕。baumgartner the disappointing news: mission aborted. r plays an important role in this mission. starting at the ground, conditions have to be very calm - winds less than 2 mph, with no precipitation or humidity
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業管道安全監控系統的設計與實施
- 工業自動化與機器人的未來趨勢
- 工業自動化技術的發展
- 工業設計與產品創新關系探討
- 工作壓力管理方法與情緒調節能力培訓教程
- 工程中質量管理與控制方法
- 工作場合中的公眾講話藝術
- 工廠自動化的家居智能化策略與實踐
- 工程機械中的數控技術應用研究
- 工程造價在綠色機房建設中的應用
- 2025年Z世代消費行為與品牌社群營銷研究報告
- 2025年春季《中華民族共同體概論》第二次平時作業-國開(XJ)-參考資料
- 《流行性感冒辨證論治》課件
- JJG(交通) 208-2024 車貨外廓尺寸動態現場檢測設備
- 工廠精細化管理全案
- 鍍鋁技能考試試題及答案
- 天津公務員考試真題2024
- 重點人口管理工作規定
- 腎挫傷患者護理查房
- 山東省煙臺市、龍口市2025屆中考生物考試模擬沖刺卷含解析
- 2024-2025學年安徽省蕪湖無為市六年級下學期小升初招生數學試卷含解析
評論
0/150
提交評論