精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是進(jìn)程

科技綠洲 ? 來(lái)源:Linux開發(fā)架構(gòu)之路 ? 作者:Linux開發(fā)架構(gòu)之路 ? 2023-11-08 15:21 ? 次閱讀

在探討這個(gè)問題之前,我們先來(lái)弄清什么是進(jìn)程。

進(jìn)程(Process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。程序是指令、數(shù)據(jù)及其組織形式的描述,進(jìn)程是程序的實(shí)體。進(jìn)程是一個(gè)具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。它可以申請(qǐng)和擁有系統(tǒng)資源,是一個(gè)動(dòng)態(tài)的概念,是一個(gè)活動(dòng)的實(shí)體。它不只是程序的代碼,還包括當(dāng)前的活動(dòng),通過(guò)程序計(jì)數(shù)器的值和處理寄存器的內(nèi)容來(lái)表示。通俗點(diǎn)講,進(jìn)程是一段程序的執(zhí)行過(guò)程,是個(gè)動(dòng)態(tài)概念。

一:進(jìn)程狀態(tài)

圖片

程序運(yùn)行必須加載在內(nèi)存中,當(dāng)有過(guò)多的就緒態(tài)或阻塞態(tài)進(jìn)程在內(nèi)存中沒有運(yùn)行,因?yàn)閮?nèi)存很小,有可能不足。系統(tǒng)需要把他們移動(dòng)到內(nèi)存外磁盤中,稱為掛起狀態(tài)。就緒狀態(tài)的進(jìn)程掛起就是掛起就緒狀態(tài),阻塞進(jìn)程掛起就稱為阻塞掛起狀態(tài)。

每個(gè)進(jìn)程的產(chǎn)生都有自己的唯一的ID號(hào)(pid),并且附帶有一個(gè)它父進(jìn)程的ID號(hào)(ppid)。進(jìn)程死亡時(shí),ID被回收。

進(jìn)程間靠?jī)?yōu)先級(jí)獲得CPU資源,時(shí)間片段輪換來(lái)更新優(yōu)先級(jí),以保證不會(huì)一個(gè)進(jìn)程占據(jù)CPU時(shí)間過(guò)長(zhǎng)。每個(gè)進(jìn)程都得到輪換運(yùn)行,因?yàn)檫@個(gè)時(shí)間非常短,所以給我們就好像是系統(tǒng)在同時(shí)運(yùn)行好多進(jìn)程。

二:僵尸進(jìn)程

圖片

那么什么稱為僵尸進(jìn)程呢?

即子進(jìn)程先于父進(jìn)程退出后,子進(jìn)程的PCB需要其父進(jìn)程釋放,但是父進(jìn)程并沒有釋放子進(jìn)程的PCB,這樣的子進(jìn)程就稱為僵尸進(jìn)程,僵尸進(jìn)程實(shí)際上是一個(gè)已經(jīng)死掉的進(jìn)程。我們用代碼來(lái)看一下

#include
#include
#include
#include
#include
#include

int main()
{
pid_t pid=fork();

if(pid==0) //子進(jìn)程
{
printf("child id is %dn",getpid());
printf("parent id is %dn",getppid());
}
else //父進(jìn)程不退出,使子進(jìn)程成為僵尸進(jìn)程
{
while(1)
{}
}
exit(0);
}

我們將它掛在后臺(tái)執(zhí)行,可以看到結(jié)果,用ps可以看到子進(jìn)程后有一個(gè) ,defunct是已死的,僵尸的意思,可以看出這時(shí)的子進(jìn)程已經(jīng)是一個(gè)僵尸進(jìn)程了。因?yàn)樽舆M(jìn)程已經(jīng)結(jié)束,而其父進(jìn)程并未釋放其PCB,所以產(chǎn)生了這個(gè)僵尸進(jìn)程。

圖片

我們也可以用ps -aux | grep pid 查看進(jìn)程狀態(tài)

圖片

一個(gè)進(jìn)程在調(diào)用exit命令結(jié)束自己的生命的時(shí)候,其實(shí)它并沒有真正的被銷毀,而是留下一個(gè)稱為僵尸進(jìn)程(Zombie)的數(shù)據(jù)結(jié)構(gòu)(系統(tǒng)調(diào)用exit,它的作用是使進(jìn)程退出,但也僅僅限于將一個(gè)正常的進(jìn)程變成一個(gè)僵尸進(jìn)程,并不能將其完全銷毀)。在Linux進(jìn)程的狀態(tài)中,僵尸進(jìn)程是非常特殊的一種,它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個(gè)位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不再占有任何內(nèi)存空間。這個(gè)僵尸進(jìn)程需要它的父進(jìn)程來(lái)為它收尸,如果他的父進(jìn)程沒有處理這個(gè)僵尸進(jìn)程的措施,那么它就一直保持僵尸狀態(tài),如果這時(shí)父進(jìn)程結(jié)束了,那么init進(jìn)程自動(dòng)會(huì)接手這個(gè)子進(jìn)程,為它收尸,它還是能被清除的。但是如果如果父進(jìn)程是一個(gè)循環(huán),不會(huì)結(jié)束,那么子進(jìn)程就會(huì)一直保持僵尸狀態(tài),這就是為什么系統(tǒng)中有時(shí)會(huì)有很多的僵尸進(jìn)程。

試想一下,如果有大量的僵尸進(jìn)程駐在系統(tǒng)之中,必然消耗大量的系統(tǒng)資源。但是系統(tǒng)資源是有限的,因此當(dāng)僵尸進(jìn)程達(dá)到一定數(shù)目時(shí),系統(tǒng)因缺乏資源而導(dǎo)致奔潰。所以在實(shí)際編程中,避免和防范僵尸進(jìn)程的產(chǎn)生顯得尤為重要。

三:孤兒進(jìn)程

一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由init進(jìn)程對(duì)它們完成狀態(tài)收集工作。

子進(jìn)程死亡需要父進(jìn)程來(lái)處理,那么意味著正常的進(jìn)程應(yīng)該是子進(jìn)程先于父進(jìn)程死亡。當(dāng)父進(jìn)程先于子進(jìn)程死亡時(shí),子進(jìn)程死亡時(shí)沒父進(jìn)程處理,這個(gè)死亡的子進(jìn)程就是孤兒進(jìn)程。

但孤兒進(jìn)程與僵尸進(jìn)程不同的是,由于父進(jìn)程已經(jīng)死亡,系統(tǒng)會(huì)幫助父進(jìn)程回收處理孤兒進(jìn)程。所以孤兒進(jìn)程實(shí)際上是不占用資源的,因?yàn)樗K究是被系統(tǒng)回收了。不會(huì)像僵尸進(jìn)程那樣占用ID,損害運(yùn)行系統(tǒng)。

下來(lái)我們上代碼看看:

#include
#include
#include
#include
#include
#include

int main()
{
pid_t pid=fork();

if(pid==0)
{
printf("child ppid is %dn",getppid());
sleep(10); //為了讓父進(jìn)程先結(jié)束
printf("child ppid is %dn",getppid());
}
else
{
printf("parent id is %dn",getpid());
}

exit(0);
}

圖片

從執(zhí)行結(jié)果來(lái)看,此時(shí)由pid == 4168父進(jìn)程創(chuàng)建的子進(jìn)程,其輸出的父進(jìn)程pid == 1,說(shuō)明當(dāng)其為孤兒進(jìn)程時(shí)被init進(jìn)程回收,最終并不會(huì)占用資源,這就是為什么要將孤兒進(jìn)程分配給init進(jìn)程。

四:僵尸進(jìn)程處理方式

任何一個(gè)子進(jìn)程(init除外)在exit()之后,并非馬上就消失掉,而是留下一個(gè)稱為僵尸進(jìn)程(Zombie)的數(shù)據(jù)結(jié)構(gòu),等待父進(jìn)程處理。這是每個(gè)子進(jìn)程在結(jié)束時(shí)都要經(jīng)過(guò)的階段。如果子進(jìn)程在exit()之后,父進(jìn)程沒有來(lái)得及處理,這時(shí)用ps命令就能看到子進(jìn)程的狀態(tài)是“defunct”。如果父進(jìn)程能及時(shí)處理,可能用ps命令就來(lái)不及看到子進(jìn)程的僵尸狀態(tài),但這并不等于子進(jìn)程不經(jīng)過(guò)僵尸狀態(tài)。如果父進(jìn)程在子進(jìn)程結(jié)束之前退出,則子進(jìn)程將由init接管。init將會(huì)以父進(jìn)程的身份對(duì)僵尸狀態(tài)的子進(jìn)程進(jìn)行處理。所以孤兒進(jìn)程不會(huì)占資源,僵尸進(jìn)程會(huì)占用資源危害系統(tǒng)。我們應(yīng)當(dāng)避免僵尸進(jìn)程的出現(xiàn)。

解決方式如下:

1):一種比較暴力的做法是將其父進(jìn)程殺死,那么它的子進(jìn)程,即僵尸進(jìn)程會(huì)變成孤兒進(jìn)程,由系統(tǒng)來(lái)回收。但是這種做法在大多數(shù)情況下都是不可取的,如父進(jìn)程是一個(gè)服務(wù)器程序,如果為了回收其子進(jìn)程的資源,而殺死服務(wù)器程序,那么將導(dǎo)致整個(gè)服務(wù)器崩潰,得不償失。顯然這種回收進(jìn)程的方式是不可取的,但其也有一定的存在意義。

2):SIGCHLD信號(hào)處理

我們都知道wait函數(shù)是用來(lái)處理僵尸進(jìn)程的,但是進(jìn)程一旦調(diào)用了wait,就立即阻塞自己,由wait自動(dòng)分析是否當(dāng)前進(jìn)程的某個(gè)子進(jìn)程已經(jīng)退出,如果讓它找到了這樣一個(gè)已經(jīng)變成僵尸的子進(jìn)程,wait就會(huì)收集這個(gè)子進(jìn)程的信息,并把它徹底銷毀后返回;如果沒有找到這樣一個(gè)子進(jìn)程,wait就會(huì)一直阻塞在這里,直到有一個(gè)出現(xiàn)為止。我們先來(lái)看看wait函數(shù)的定義

#include /* 提供類型pid_t的定義,實(shí)際就是int型 */

#include

pid_t wait(int *status)

參數(shù)status用來(lái)保存被收集進(jìn)程退出時(shí)的一些狀態(tài),它是一個(gè)指向int類型的指針。但如果我們對(duì)這個(gè)子進(jìn)程是如何死掉的毫不在意,只想把這個(gè)僵尸進(jìn)程消滅掉,(事實(shí)上絕大多數(shù)情況下,我們都會(huì)這樣想),我們就可以設(shè)定這個(gè)參數(shù)為NULL,就象下面這樣:pid=wait(NULL);如果成功,wait會(huì)返回被收集的子進(jìn)程的進(jìn)程ID,如果調(diào)用進(jìn)程沒有子進(jìn)程,調(diào)用就會(huì)失敗,此時(shí)wait返回-1,同時(shí)errno被置為ECHILD。

由于調(diào)用wait之后,就必須阻塞,直到有子進(jìn)程結(jié)束,所以,這樣來(lái)說(shuō)是非常不高效的,我們的父進(jìn)程難道要一直等待你子進(jìn)程完成,最后才能執(zhí)行自己的代碼嗎?難道就不能我父進(jìn)程執(zhí)行自己的代碼,你子進(jìn)程什么時(shí)候完成我就什么時(shí)候去處理你,不用一直等你?當(dāng)然是有這種方式了。

實(shí)際上當(dāng)子進(jìn)程終止時(shí),內(nèi)核就會(huì)向它的父進(jìn)程發(fā)送一個(gè)SIGCHLD信號(hào),父進(jìn)程可以選擇忽略該信號(hào),也可以提供一個(gè)接收到信號(hào)以后的處理函數(shù)。對(duì)于這種信號(hào)的系統(tǒng)默認(rèn)動(dòng)作是忽略它。我們不希望有過(guò)多的僵尸進(jìn)程產(chǎn)生,所以當(dāng)父進(jìn)程接收到SIGCHLD信號(hào)后就應(yīng)該調(diào)用 wait 或 waitpid 函數(shù)對(duì)子進(jìn)程進(jìn)行善后處理,釋放子進(jìn)程占用的資源。

下面是一個(gè)處理僵尸進(jìn)程的簡(jiǎn)單的例子:

#include
#include
#include
#include
#include
#include
#include
#include

void deal_child(int num)
{
printf("deal_child inton");
wait(NULL);
}

int main()
{
signal(SIGCHLD,deal_child);
pid_t pid=fork();
int i;

if(pid==0)
{
printf("child is runningn");
sleep(2);
printf("child will endn");
}
else
{
sleep(1); //讓子進(jìn)程先執(zhí)行
printf("parent is runningn");
sleep(10); //一旦被打斷就不能再進(jìn)入睡眠
printf("sleep 10 s overn");
sleep(5);
printf("sleep 5s overn");
}

exit(0);
}

進(jìn)行測(cè)試后確定了是在父進(jìn)程睡眠10s時(shí)子進(jìn)程結(jié)束,父進(jìn)程接收到了SIGCHLD信號(hào),調(diào)用了deal_child函數(shù),釋放了子進(jìn)程的PCB后又回到自己本身的代碼中執(zhí)行。我們看看運(yùn)行結(jié)果

圖片

說(shuō)到這里,我們?cè)賮?lái)看看signal函數(shù)(不是阻塞函數(shù))

signal(參數(shù)1,參數(shù)2);

參數(shù)1:我們要進(jìn)行處理的信號(hào)。系統(tǒng)的信號(hào)我們可以再終端鍵入 kill -l查看(共64個(gè))。其實(shí)這些信號(hào)是系統(tǒng)定義的宏。

參數(shù)2:我們處理的方式(是系統(tǒng)默認(rèn)還是忽略還是捕獲)。

eg: signal(SIGINT ,SIG_ING ); //SIG_ING 代表忽略SIGINT信號(hào)

eg:signal(SIGINT,SIG_DFL); //SIGINT信號(hào)代表由InterruptKey產(chǎn)生,通常是CTRL +C或者是DELETE。發(fā)送給所有ForeGroundGroup的進(jìn)程。SIG_DFL代表執(zhí)行系統(tǒng)默認(rèn)操作,其實(shí)對(duì)于大多數(shù)信號(hào)的系統(tǒng)默認(rèn)動(dòng)作是終止該進(jìn)程。這與不寫此處理函數(shù)是一樣的。

我們也可以給參數(shù)2傳遞一個(gè)信號(hào)處理函數(shù)的地址,但是這個(gè)信號(hào)處理函數(shù)需要其返回值為void,并且默認(rèn)自帶一個(gè)int類型參數(shù)

這個(gè)int就是你所傳遞的第一個(gè)信號(hào)參數(shù)的值(你用kill -l可以查看)

我們測(cè)試了一下,如果創(chuàng)建了5個(gè)子進(jìn)程,但是銷毀的時(shí)候仍然有兩個(gè)仍是僵尸進(jìn)程,這又是為什么呢?

這是因?yàn)楫?dāng)5個(gè)進(jìn)程同時(shí)終止的時(shí)候,內(nèi)核都會(huì)向父進(jìn)程發(fā)送SIGCHLD信號(hào),而父進(jìn)程此時(shí)有可能仍然處于信號(hào)處理的deal_child函數(shù)中,那么在處理完之前,中間接收到的SIGCHLD信號(hào)就會(huì)丟失,內(nèi)核并沒有使用隊(duì)列等方式來(lái)存儲(chǔ)同一種信號(hào)

所以為了解決這一問題,我們需要調(diào)用waitpid函數(shù)來(lái)清理子進(jìn)程。

void deal_child(int sig_no)

{

for (;;) {

if (waitpid(-1, NULL, WNOHANG) == 0)

break;

}

}

這樣的話,只有檢驗(yàn)沒有僵尸進(jìn)程,他才會(huì)返回0,這樣就可以確保所有的僵尸進(jìn)程都被殺死了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7421

    瀏覽量

    87715
  • 程序
    +關(guān)注

    關(guān)注

    116

    文章

    3777

    瀏覽量

    80851
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1205

    瀏覽量

    24643
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    202

    瀏覽量

    13947
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux 查看進(jìn)程和刪除進(jìn)程

    ps 命令用于查看當(dāng)前正在運(yùn)行的進(jìn)程。grep 是搜索例如: ps -ef | grep java表示查看所有進(jìn)程里 CMD 是 java 的進(jìn)程信息ps -aux | grep java-aux 顯示
    發(fā)表于 04-24 00:04

    【Linux學(xué)習(xí)雜談】之父進(jìn)程回收子進(jìn)程

    進(jìn)程用wait函數(shù)回收子進(jìn)程wait的工作原理:(1)子進(jìn)程結(jié)束時(shí),系統(tǒng)向其父進(jìn)程發(fā)送SIGCHILD信號(hào)(2)父進(jìn)程調(diào)用wait函數(shù)之后
    發(fā)表于 09-08 13:13

    孤兒進(jìn)程和僵尸進(jìn)程

    前段時(shí)間,由于研究經(jīng)典面試題,把孤兒進(jìn)程和僵尸進(jìn)程也總結(jié)了一下。我們有這樣一個(gè)問題:孤兒進(jìn)程和僵尸進(jìn)程,怎么產(chǎn)生的?有什么危害?怎么去預(yù)防?下面是針對(duì)此問題的總結(jié)與概括。一.產(chǎn)生的原因
    發(fā)表于 11-29 14:08

    怎么區(qū)別父進(jìn)程和子進(jìn)程

    怎么區(qū)別父進(jìn)程和子進(jìn)程? 各位大神
    發(fā)表于 01-11 17:15

    Linux下的進(jìn)程結(jié)構(gòu)

    進(jìn)程不但包括程序的指令和數(shù)據(jù),而且包括程序計(jì)數(shù)器和處理器的所有寄存器及存儲(chǔ)臨時(shí)數(shù)據(jù)的進(jìn)程堆棧,因此正在執(zhí)行的進(jìn)程包括處理器當(dāng)前的一切活動(dòng)。 因?yàn)長(zhǎng)inux是一個(gè)多進(jìn)程的操作系統(tǒng),所以其
    發(fā)表于 05-27 09:24

    什么是僵尸進(jìn)程和孤兒進(jìn)程

    在UNIX里,除了進(jìn)程0(即PID=0的交換進(jìn)程,Swapper Process)以外的所有進(jìn)程都是由其他進(jìn)程使用系統(tǒng)調(diào)用fork創(chuàng)建的,這里調(diào)用fork創(chuàng)建新
    發(fā)表于 08-02 08:36

    詳解linux進(jìn)程管理

    進(jìn)程需要了解 進(jìn)程,父進(jìn)程進(jìn)程組,會(huì)話和控制終端的相關(guān)概念。進(jìn)程和父進(jìn)程:每個(gè)
    發(fā)表于 08-07 08:28

    【工程源碼】Linux 查看進(jìn)程和刪除進(jìn)程

    (前提是要有這個(gè)東西,例如在裝了 tomcat 的前提下, 輸入 tomcat 的 to 按 tab)。ps 命令用于查看當(dāng)前正在運(yùn)行的進(jìn)程。grep 是搜索例如: ps -ef | grep
    發(fā)表于 02-23 20:05

    什么是進(jìn)程

    什么是進(jìn)程進(jìn)程可以理解為正在運(yùn)行的程序。我們編寫好的代碼,經(jīng)過(guò)編譯后生成一個(gè)可執(zhí)行的文件,我們稱作一個(gè)程序。當(dāng)運(yùn)行可執(zhí)行文件后,操作系統(tǒng)會(huì)執(zhí)行可執(zhí)行文件中的代碼,在CPU上運(yùn)行的這組代碼被稱做進(jìn)程
    發(fā)表于 12-14 08:26

    進(jìn)程是什么?進(jìn)程與程序的區(qū)別在哪

    進(jìn)程是什么?進(jìn)程與程序的區(qū)別在哪?進(jìn)程的狀態(tài)有哪幾種?
    發(fā)表于 12-23 06:27

    進(jìn)程有幾種狀態(tài)?

    文章目錄操作系統(tǒng)進(jìn)程和線程什么是進(jìn)程?什么是線程?進(jìn)程和線程有什么區(qū)別?何時(shí)使用多進(jìn)程,何時(shí)使用多線程?進(jìn)程有幾種狀態(tài)?畫一下
    發(fā)表于 12-24 07:16

    Linux進(jìn)程管理

    Linux進(jìn)程管理 本章主要介紹進(jìn)程的概念、狀態(tài)、構(gòu)成以及Linux進(jìn)程的相關(guān)知識(shí)。 掌握進(jìn)程的概念 掌握進(jìn)程的描述、狀態(tài)及轉(zhuǎn)換 理
    發(fā)表于 04-28 14:57 ?0次下載

    Linux進(jìn)程管理:什么是進(jìn)程進(jìn)程的生命周期

    所有運(yùn)行在Linux操作系統(tǒng)中的進(jìn)程都被task_struct結(jié)構(gòu)管理,該結(jié)構(gòu)同時(shí)被叫作進(jìn)程描述。一個(gè)進(jìn)程描述包含一個(gè)運(yùn)行進(jìn)程所有的必要信息,例如進(jìn)
    的頭像 發(fā)表于 02-15 14:29 ?7923次閱讀
    Linux<b class='flag-5'>進(jìn)程</b>管理:什么是<b class='flag-5'>進(jìn)程</b>?<b class='flag-5'>進(jìn)程</b>的生命周期

    Linux進(jìn)程基礎(chǔ)

    進(jìn)程(process)的區(qū)別又是什么呢?進(jìn)程是程序的一個(gè)具體實(shí)現(xiàn)。只有食譜沒什么用,我們總要按照食譜的指點(diǎn)真正一步步實(shí)行,才能做出菜肴。進(jìn)程是執(zhí)行程序的過(guò)程,類似于按照食譜,真正去做菜的過(guò)程。同一個(gè)程序
    發(fā)表于 04-02 14:50 ?271次閱讀

    fork出的進(jìn)程的父進(jìn)程是從哪來(lái)的

    一、粉絲提問fork出的進(jìn)程的父進(jìn)程是從哪來(lái)的?粉絲提問,一口君必須滿足粉絲提問二、解答這個(gè)問題看上去很簡(jiǎn)單,但是要想把進(jìn)程的父進(jìn)程相關(guān)的所有知識(shí)點(diǎn)搞清楚,還是有點(diǎn)難度的,下面我們稍微
    的頭像 發(fā)表于 12-24 18:41 ?867次閱讀