国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Linux > 正文

【Linux】fork()函數(shù)總結(jié),以及fork()引出的一些知識(shí)點(diǎn)

2024-06-28 13:23:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
【linux】fork()函數(shù)總結(jié),以及fork()引出的一些知識(shí)點(diǎn)

1、進(jìn)程相關(guān)概念

  當(dāng)一個(gè)進(jìn)程的時(shí)間片用完后,系統(tǒng)把相關(guān)的寄存器的值保存到該進(jìn)程表相應(yīng)的表項(xiàng)里。同時(shí)把代替該進(jìn)程即將執(zhí)行的進(jìn)程的上下文從進(jìn)程表中讀出,并更新相應(yīng)的寄存器值,這個(gè)過(guò)程稱為上下文交換。上下文交換其實(shí)就是讀出新的進(jìn)程的PC(程序計(jì)數(shù)器),指示當(dāng)前進(jìn)程的下一條將要執(zhí)行的指令。一個(gè)進(jìn)程主要包含以下三個(gè)元素:(1)一個(gè)正在執(zhí)行的程序;(2)與該進(jìn)程相關(guān)聯(lián)的全部數(shù)據(jù)(變量,內(nèi)存,緩沖區(qū));(3)程序上下文(程序計(jì)數(shù)器pc)

2、頭文件:

  #include<unistd.h>

  #include<types.h>

3、函數(shù)原型:

  pid_tfork(void);

  pid_t是一個(gè)宏,其實(shí)質(zhì)是int類型,被定義在#include<sys/types.h>中;

  返回值:1)成功:調(diào)用一次則返回兩個(gè)值:子進(jìn)程返回0,父進(jìn)程返回子進(jìn)程的PID;

    2)失敗:返回-1;

4、獲取進(jìn)程id:

  getpid()、getppid();

5、Fork過(guò)程

  當(dāng)前進(jìn)程(調(diào)用者,父進(jìn)程)調(diào)用fork()創(chuàng)建一個(gè)新的進(jìn)程(子進(jìn)程)。子進(jìn)程是父進(jìn)程的副本,它將獲得父進(jìn)程數(shù)據(jù)空間、堆、棧(上下文)等資源的副本(注意:(1)子進(jìn)程copy父進(jìn)程的變量,內(nèi)存與緩沖區(qū),即整個(gè)的數(shù)據(jù)空間的內(nèi)容,但數(shù)據(jù)空間是獨(dú)立的,即父子進(jìn)程并不共享這些存儲(chǔ)空間。(2)父子進(jìn)程對(duì)打開(kāi)文件的共享:fork之后,子進(jìn)程會(huì)繼承父進(jìn)程所打開(kāi)的文件表,即父子進(jìn)程共享文件表,該文件表是由內(nèi)核維護(hù)的,兩個(gè)進(jìn)程共享文件狀態(tài),偏移量等。這一點(diǎn)很重要,當(dāng)在父進(jìn)程中關(guān)閉文件時(shí),子進(jìn)程的文件描述符仍然有用,相應(yīng)的文件表也不會(huì)被釋放。(3)為了提高效率,fork后并不立即復(fù)制父進(jìn)程空間,采用了COW(Copy-On-Write);當(dāng)父子進(jìn)程任意之一,要修改數(shù)據(jù)段、堆、棧時(shí),進(jìn)行復(fù)制操作,但僅復(fù)制修改區(qū)域;)。父子進(jìn)程間共享的存儲(chǔ)空間只有代碼段(只讀的,且僅共享fork()后面的代碼段)。子進(jìn)程和父進(jìn)程繼續(xù)執(zhí)行fork調(diào)用之后的指令。(4)fork之后,這兩個(gè)進(jìn)程執(zhí)行沒(méi)有固定的先后順序,哪個(gè)進(jìn)程先執(zhí)行要看系統(tǒng)的進(jìn)程調(diào)度策略。

6、看一個(gè)程序:

#include<unistd.h>#include<stdio.h>int glob = 6;char buf[] = "a write to stdout/n";int  main(void){        int var = 88;        pid_t   pid;        if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)        {                        PRintf("write error”);        return 0;    }        printf("before fork/n"); //注意這一行        if ( (pid = fork()) < 0)      {                printf("fork error");       return 0;    }        else if (pid == 0)     {                glob++;                var++;        }    else    {                sleep(2);    }        printf("pid = %d, glob = %d, var = %d/n", getpid(), glob, var);    return 0;}//fork_test.c

選擇輸出的方式不同,會(huì)有不同的輸出結(jié)果。

直接輸出到控制臺(tái):awritetostdoutbeforeforkpid=1867,glob=7,var=89pid=1866,glob=6,var=88使用重定向:./fork_test>fork_test.txt,fork_test.txt內(nèi)容如下:

awritetostdoutbeforeforkpid=1939,glob=7,var=89beforeforkpid=1938,glob=6,var=88

  為什么會(huì)有這么大的不同?我們先來(lái)看看stdout與STDOUT_FILENO的區(qū)別(OS和C++的區(qū)別)。

  stdin類型為FILE*;STDIN_FILENO類型為int。使用stdin的函數(shù)主要有:fread、fwrite、fclose等,基本上都以f開(kāi)頭;使用STDIN_FILENO的函數(shù)有:read、write、close等。操作系統(tǒng)一級(jí)提供的文件API都是以文件描述符來(lái)表示文件,STDIN_FILENO就是標(biāo)準(zhǔn)輸入設(shè)備(一般是鍵盤(pán))的文件描述符。標(biāo)準(zhǔn)C++一級(jí)提供的文件操作函數(shù)庫(kù)都是用FILE*來(lái)表示文件,stdin就是指向標(biāo)準(zhǔn)輸入設(shè)備文件的FILE*。

  通過(guò)manstdin可以查看到:stdin,stdout,stderr-standardI/Ostreams(具體自行man)。

  stdin/stdout/stderr分別是指向stream的FILE型的指針變量。當(dāng)程序啟動(dòng)時(shí),與其結(jié)合的整型文件描述符(fd)分別是0,1,2。STDIN_FILENO/STDOUT_FILENO/STDERR_FILENO是在<unistd.h>文件中定義的預(yù)編譯macro。其值是0,1,2。(通過(guò)freopen(3),可以改變與這3個(gè)文件描述符(fd)結(jié)合的stream值)。也就是說(shuō),程序啟動(dòng)時(shí):FILE*stdin/stdout/stderr對(duì)應(yīng)的文件描述符(fd)分別是STDIN_FILENO(0)/STDOUT_FILENO(1)/STDERR_FILENO(2)。但是,可以通過(guò)FILE*freopen(constchar*path,constchar*mode,FILE*stream);來(lái)改變,使文件描述符(fd)對(duì)應(yīng)到其他的stream上。(結(jié)合到哪個(gè)文件stream上,那個(gè)文件stream就是變成標(biāo)準(zhǔn)輸入輸出)。(標(biāo)準(zhǔn)輸入stdin/標(biāo)準(zhǔn)輸出stdout/error輸出stderr要分別改變。)

總結(jié)一句話:STDOUT_FILENO是OS提供的,定義在頭文件<unistd.h>中,沒(méi)有buffer(直接的系統(tǒng)調(diào)用);FILE*stdout是標(biāo)準(zhǔn)C++提供的,定義在頭文件<stdio.h>中,有buffer。

使用stdin/stdout/stderr的函數(shù)主要有:fread、fwrite、fclose等,基本上都以f開(kāi)頭。

使用STDIN_FILENO/STDOUT_FILENO/STDERR_FILENO的函數(shù)有:read、write、close等。

上程序:

#include<stdio.h>#include<unistd.h>#include<string.h>#include<errno.h>#define CHANGE_BY_FREOPEN /* 需要注釋掉,進(jìn)行切換 */int main(int argc,char**argv){        char buf[]="hello,world/n";#ifdef CHANGE_BY_FREOPENfreopen("stdout_text.txt","w",stdout);//freopen("stderr_text.txt","w",stderr);/* stderr*/#endifprintf("%s",buf);fwrite(buf,strlen(buf), 1,stdout);write(STDOUT_FILENO,&buf,strlen(buf));perror("error out");/* stderr*/return 0;}/*stdouttest.c */    

編譯命令:gcc-ostdoutteststdouttest.c①當(dāng)#defineCHANGE_BY_FREOPEN被注釋掉的時(shí)候:終端輸出的結(jié)果是:

hello,world

hello,world

hello,world

errorout:Sucess

②當(dāng)#defineCHANGE_BY_FREOPEN有效的時(shí)候:終端輸出的結(jié)果是:

errorout:Sucess

同時(shí),會(huì)創(chuàng)建一個(gè)名為stdout_text.txt的文件,該文件中的內(nèi)容是:

hello,world

hello,world

hello,world//freopen("stderr_text.txt","w",stderr);/*stderr*/如果有效的話():①shell中,什么也不輸出。②stdout_text.txt中,輸出3個(gè)(hello,world+換行符)。③stderr_text.txt中,輸出1個(gè)(errorout:Success)。

接著stdout與STDOUT_FILENO的區(qū)別后,下面看下關(guān)于"printf"/"write"和緩沖的說(shuō)明:

printf是在stdio.h中聲明的函數(shù),而標(biāo)準(zhǔn)IO都是帶緩沖的,所以printf是帶緩沖的。而write則是不帶緩沖的。

標(biāo)準(zhǔn)IO在輸入或輸出到終端設(shè)備時(shí),它們是行緩沖的,否則(文件)它們是全緩沖的。而標(biāo)準(zhǔn)錯(cuò)誤流stderr是不使用緩沖的。更為準(zhǔn)確的描述是:當(dāng)且僅當(dāng)標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出并不涉及交互式設(shè)備使,他們才是全緩沖的。標(biāo)準(zhǔn)出錯(cuò)流不使用緩沖。下列情況會(huì)引發(fā)緩沖區(qū)的刷新(清空緩沖區(qū)):

1、緩沖區(qū)滿時(shí);2、執(zhí)行flush語(yǔ)句;3、執(zhí)行endl語(yǔ)句(printf是"/n");4、關(guān)閉文件。

綜上所述:write的內(nèi)容在父進(jìn)程直接輸出到了設(shè)備,“beforefork”在主線程輸出到終端后因?yàn)閾Q行符而清空了緩沖區(qū),所以也只輸出了一次。而重定向到"a.txt"時(shí),printf使用的是全緩沖,所以“beforefork”并未輸出到設(shè)備,而是隨著fork()而被復(fù)制了一份到子進(jìn)程的空間中,所以輸出了兩次。

注意:在重定向父進(jìn)程輸出時(shí),子進(jìn)程也被重定向了。

另外:為什么父進(jìn)程要等待2秒?在fork時(shí),父進(jìn)程所有打開(kāi)的文件描述符都被復(fù)制一份到子進(jìn)程中,然而他們共享文件描述符所指向的文件對(duì)象(FILE結(jié)構(gòu):描述文件讀寫(xiě)指針,偏移量,標(biāo)志等)。如果不等待,文件偏移量被交替修改,很可能產(chǎn)生混亂的輸出。(實(shí)際上,這么小的程序,進(jìn)程執(zhí)行是很快的,經(jīng)過(guò)實(shí)際測(cè)試,這部分可以不用,不會(huì)產(chǎn)生混亂輸出。)

再看一個(gè)例子:

#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>#include <sys/wait.h>#include <unistd.h>#include <fcntl.h>#include <stdlib.h>int main(){pid_t childpid;char buf[100]={0};int status;//供wait使用的參數(shù)int f;//定義文件標(biāo)識(shí)符f=open("text",O_CREAT|O_RDWR,0664);if(f==-1)//文件標(biāo)識(shí)符{perror("create file failed!");return 1;}strcpy(buf,"father process’s data/n");printf("%d/n",15);//此時(shí)創(chuàng)建子進(jìn)程childpid=fork();printf("childpid=%d",childpid);if(childpid==0){strcpy(buf,"child process’s data/n");printf("%s",buf);puts("child process is working");printf("child process’s PID is: %d/n",getpid());printf("father process’s PID is: %d/n",getppid());int n1= write(f,buf,strlen(buf));//把buf的數(shù)據(jù)輸出重定向到文件中去close(f);exit(0);//子進(jìn)程調(diào)用exit函數(shù)進(jìn)入僵死狀態(tài),參數(shù)0表示正常退出}else {wait(&status);//wait函數(shù)是一個(gè)等待子進(jìn)程退出的函數(shù),其參數(shù)是一個(gè)int類型的指針,保存子進(jìn)程退出的一些信息printf("%s/",buf);puts("father process is working");printf("father process’s PID is: %d/n",getpid());printf("child process’s PID is: %d/n",childpid);int n=write(f,buf,strlen(buf));close(f);}return 0;}

程序運(yùn)行結(jié)果如下:

15//父進(jìn)程打印出來(lái)的

Childprocess’sdata

Childprocessisworking

Childprocess’sPIDis:4850

Fatherprocess’sPIDis:4849

Fatherprocess’sdata

Fatherprocessisworking

Fatherprocess’sPIDis:4849

Childprocess’sPIDis:4850如果把printf("%d/n",15);改為printf("%d",15);,那么運(yùn)行的結(jié)果為:

15Childprocess’sdata//15是子進(jìn)程打印出來(lái)的

Childprocessisworking

Childprocess’sPIDis:4850

Fatherprocess’sPIDis:4849

15Fatherprocess’sdata//15是父進(jìn)程打印出來(lái)的

Fatherprocessisworking

Fatherprocess’sPIDis:4849

Childprocess’sPIDis:4850

分析如下:

1.wait()函數(shù)阻塞父進(jìn)程,直到子進(jìn)程返回。因此,子進(jìn)程先執(zhí)行,直到退出為止。(當(dāng)然,這里也可以用sleep(10)來(lái)完成同樣的功能)

函數(shù)說(shuō)明:wait()會(huì)暫時(shí)停止目前進(jìn)程的執(zhí)行,直到有信號(hào)來(lái)到或子進(jìn)程結(jié)束.如果在調(diào)用wait()時(shí)子進(jìn)程已經(jīng)結(jié)束,則wait()會(huì)立即返回子進(jìn)程結(jié)束狀態(tài)值.子進(jìn)程的結(jié)束狀態(tài)值會(huì)由參數(shù)status返回,而子進(jìn)程的進(jìn)程識(shí)別碼也會(huì)一快返回.如果不在意結(jié)束狀態(tài)值,則參數(shù)status可以設(shè)成NULL.子進(jìn)程的結(jié)束狀態(tài)值請(qǐng)參考waitpid().

2.為什么printf("%d/n",15);與printf("%d",15);打印的結(jié)果不相同?

printf("%d/n",15);與printf("%d",15);區(qū)別:前者將數(shù)據(jù)已經(jīng)輸出到終端上了,后者的數(shù)據(jù)還在緩沖區(qū)內(nèi)。當(dāng)創(chuàng)建子進(jìn)程時(shí),子進(jìn)程要copy父進(jìn)程的數(shù)據(jù),包括copy緩沖區(qū),所以,第一個(gè)程序只打印出一個(gè)15,而第二個(gè)程序打印出兩個(gè)15.還要注意一點(diǎn),第一個(gè)結(jié)果的15是由父進(jìn)程打印出來(lái)的,而第二個(gè)結(jié)果由于子進(jìn)程先執(zhí)行,復(fù)制緩沖區(qū),所以子進(jìn)程先打印出15,而后父進(jìn)程才打印出15.

3.close(f),當(dāng)子進(jìn)程已經(jīng)關(guān)閉了文件,父進(jìn)程怎么還能將數(shù)據(jù)寫(xiě)入?

在前面的分析中得知,父子進(jìn)程共享同一個(gè)文件表,共享文件表的狀態(tài),偏移位置等信息。所以在子進(jìn)程關(guān)閉文件描述符后,在父進(jìn)程中仍然是有效的,而父進(jìn)程寫(xiě)數(shù)據(jù)也從文件的當(dāng)前位置開(kāi)始寫(xiě)。

而linux系統(tǒng)文件流,緩沖及文件描述符與進(jìn)程之間的關(guān)系,可參考http://topic.csdn.net/u/20090309/18/3aba9e11-c8a8-492b-9fe7-29043974a102.html

再來(lái)幾個(gè)fork的小題目:

#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>int main(){    pid_t   pid1;    pid_t   pid2;    pid1 = fork();    pid2 = fork();    printf("pid1=%d,pid2=%d/n",pid1,pid2);    exit(0);}

要求如下:已知從這個(gè)程序執(zhí)行到這個(gè)程序的所有進(jìn)程結(jié)束這個(gè)時(shí)間段內(nèi),沒(méi)有其它進(jìn)程執(zhí)行。1、請(qǐng)說(shuō)出執(zhí)行這個(gè)程序后,一共運(yùn)行了幾個(gè)進(jìn)程。2、如果其中一個(gè)進(jìn)程的輸出結(jié)果是“pid1=1001,pid2=1002”,寫(xiě)出其他進(jìn)程的輸出結(jié)果(不考慮進(jìn)程執(zhí)行順序)。

答案:

1、一共執(zhí)行了四個(gè)進(jìn)程。(P0,P1,P2,P3)

2、另外幾個(gè)進(jìn)程的輸出分別為:

pid1:1001,pid2:0

pid1:0,pid2:1003

pid1:0,pid2:0

#include <unistd.h>#include <stdio.h> int main () { pid_t fpid; //fpid表示fork函數(shù)返回的值int count=0;fpid=fork(); if (fpid < 0) printf("error in fork!"); else if (fpid == 0) {printf("i am the child process, my process id is %d/n",getpid()); printf("我是爹的兒子/n");//對(duì)某些人來(lái)說(shuō)中文看著更直白。count++;}else {printf("i am the parent process, my process id is %d/n",getpid()); printf("我是孩子他爹/n");count++;}printf("統(tǒng)計(jì)結(jié)果是: %d/n",count);return 0;}

運(yùn)行結(jié)果是:iamthechildprocess,myprocessidis5574我是爹的兒子統(tǒng)計(jì)結(jié)果是:1iamtheparentprocess,myprocessidis5573我是孩子他爹統(tǒng)計(jì)結(jié)果是:1

#include <unistd.h>#include <stdio.h>int main(void){   int i=0;   for(i=0;i<2;i++){       pid_t fpid=fork();       if(fpid==0)       printf("%d child  %4d %4d %4d/n",i,getppid(),getpid(),fpid);       else       printf("%d father%4d %4d %4d/n",i,getppid(),getpid(),fpid);   }   return 0;}

程序運(yùn)行結(jié)果:

0 father 1958 4982 4983 第一行 (P0當(dāng)i=0時(shí)執(zhí)行fork()后進(jìn)入else產(chǎn)生的)

1 father 1958 4982 4984 第二行 (P0當(dāng)i=1時(shí)執(zhí)行fork()后進(jìn)入else產(chǎn)生的)

0 child 4982 4983 0 第三行 (P0當(dāng)i=0時(shí)執(zhí)行fork()后進(jìn)入if產(chǎn)生的)

1 child 4982 4984 0 第四行 (P0當(dāng)i=1時(shí)執(zhí)行fork()后進(jìn)入if產(chǎn)生的)

1 father 4982 4983 4985 第五行 (P1當(dāng)i=1時(shí)執(zhí)行fork()后進(jìn)入else產(chǎn)生的)

1 child 1 4985 0 第六行 (P1當(dāng)i=1時(shí)執(zhí)行fork()后進(jìn)入if產(chǎn)生的)

分析如下:

假設(shè)主程序原來(lái)的進(jìn)程為P0。

當(dāng)i=0時(shí),程序進(jìn)入循環(huán),P0調(diào)用fork(),隨后產(chǎn)生出P1,在P0中fork()返回的fpid是子進(jìn)程的PID,所以fpid不為0,此時(shí)判斷語(yǔ)句進(jìn)入else,所以會(huì)有第一行;在P1中fork()返回的fpid是0,此時(shí)判斷語(yǔ)句進(jìn)入if,所以會(huì)有第三行。

當(dāng)i=1時(shí),(以下P0與P1沒(méi)有先后順序,主要看OS的策略)P0再次調(diào)用fork(),隨后產(chǎn)生出P2,在P0中fork()返回fpid!=0,進(jìn)入else,所以會(huì)有第二行;在P2中fork()返回fpid=0,進(jìn)入if,所以會(huì)有第四行。另外,i=0時(shí)產(chǎn)生的P1也會(huì)調(diào)用fork(),隨后產(chǎn)生出P3,在P1中fork()返回fpid!=0,進(jìn)入else,所以會(huì)有第五行;在P2中fork()返回fpid=0,進(jìn)入if,所以會(huì)有第六行。

上面值得注意的是第六行中的getppid()值為1。按照上面的分析,按說(shuō)4985的父進(jìn)程應(yīng)該4983嗎?怎么會(huì)是1呢?這里得講到進(jìn)程的創(chuàng)建和死亡的過(guò)程,進(jìn)程4983執(zhí)行完第二個(gè)循環(huán)后,main函數(shù)就該退出了,也即進(jìn)程該死亡了,因?yàn)樗呀?jīng)做完所有事情了。4983死亡后,4985就沒(méi)有父進(jìn)程了,這在操作系統(tǒng)是不被允許的,所以4985的父進(jìn)程就被置為init了,init是永遠(yuǎn)不會(huì)死亡的。看下面的linux父子進(jìn)程終止的先后順序不同產(chǎn)生不同的結(jié)果:

1)父進(jìn)程先于子進(jìn)程終止:

此種情況就是孤兒進(jìn)程。當(dāng)父進(jìn)程先退出時(shí),系統(tǒng)會(huì)讓init進(jìn)程接管子進(jìn)程。2)子進(jìn)程先于父進(jìn)程終止,而父進(jìn)程又沒(méi)有調(diào)用wait或waitpid函數(shù)

此種情況子進(jìn)程進(jìn)入僵死狀態(tài),且會(huì)一直保持下去直到系統(tǒng)重啟。子進(jìn)程處于僵死狀態(tài)時(shí),內(nèi)核只保存進(jìn)程的一些必要信息以備父進(jìn)程所需。此時(shí)子進(jìn)程始終占有著資源,同時(shí)也減少了系統(tǒng)可以創(chuàng)建的最大進(jìn)程數(shù)。

僵死狀態(tài):一個(gè)已經(jīng)終止、但是其父進(jìn)程尚未對(duì)其進(jìn)行善后處理(獲取終止子進(jìn)程的有關(guān)信息,釋放它仍占有的資源)的進(jìn)程被稱為僵死進(jìn)程(zombie)。ps命令將僵死進(jìn)程的狀態(tài)打印為Z。3)子進(jìn)程先于父進(jìn)程終止,而父進(jìn)程調(diào)用了wait或waitpid函數(shù)此時(shí)父進(jìn)程會(huì)等待子進(jìn)程結(jié)束。

那么有人可能會(huì)問(wèn):4983執(zhí)行完后結(jié)束了,從而導(dǎo)致4985沒(méi)有了父進(jìn)程;同樣,4982在第二次循環(huán)執(zhí)行完后也結(jié)束了,不是也應(yīng)該導(dǎo)致4984沒(méi)有了父進(jìn)程了嗎?為什么第四行中的getppid()不是1?這其實(shí)在上面提到過(guò),就是因?yàn)椴僮飨到y(tǒng)調(diào)度的問(wèn)題。理論上來(lái)說(shuō),第四行和第六行的getppid()“都有可能為1”。

#include <unistd.h>#include <stdio.h>int main(void){   int i=0;   for(i=0;i<N;i++){       pid_t fpid=fork();       if(fpid==0)       printf("son/n");       else       printf("father/n");   }   return 0;}

上面程序的循環(huán)中有個(gè)N,總結(jié)一下規(guī)律:對(duì)于這種N次循環(huán)的情況,執(zhí)行printf函數(shù)的次數(shù)為2*(2^N-1)次,創(chuàng)建的子進(jìn)程數(shù)為2^N-1個(gè)。

最后再上一份代碼:

#include <stdio.h>#include <unistd.h>int main(int argc, char* argv[]){   fork();   fork() && fork() || fork();   fork();   return 0;   //printf(“+ /n”);}

問(wèn)題:不算main這個(gè)進(jìn)程自身,程序到底創(chuàng)建了多少個(gè)進(jìn)程?

答案:答案是總共20個(gè)進(jìn)程,除去main進(jìn)程,還有19個(gè)進(jìn)程。

參考文章:

http://hi.baidu.com/passerryan/item/bbe792245816c61209750821

http://www.CUOXin.com/lq0729/archive/2011/10/24/2222536.html

http://blog.csdn.net/xiaoxi2xin/archive/2010/04/24/5524769.aspx

http://blog.csdn.net/chenjin_zhong/article/details/6099228

http://blog.csdn.net/jason314/article/details/5640969


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 江阴市| 阿鲁科尔沁旗| 南康市| 洪湖市| 民权县| 深泽县| 隆化县| 新泰市| 偃师市| 万盛区| 佛坪县| 千阳县| 育儿| 福海县| 尼勒克县| 大关县| 肇源县| 积石山| 双峰县| 台北市| 雷州市| 石阡县| 和林格尔县| 玉环县| 新泰市| 且末县| 汝城县| 桂平市| 东阿县| 建湖县| 镇赉县| 柞水县| 万宁市| 勃利县| 山丹县| 宁夏| 白沙| 通辽市| 寿阳县| 抚远县| 弥勒县|