免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

fork和vfork函數(shù)

fork:

成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)與策劃設(shè)計(jì),旌德網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:旌德等地區(qū)。旌德做網(wǎng)站價(jià)格咨詢:028-86922220

    fork用于派生一個(gè)進(jìn)程。如果成功,父進(jìn)程返回子進(jìn)程的ID,子進(jìn)程中返回0,若出錯(cuò)則返回-1。

主要用途:

    一個(gè)進(jìn)程希望復(fù)制自身,從而子父進(jìn)程能同時(shí)執(zhí)行不同的代碼段。

    進(jìn)程想要執(zhí)行另一個(gè)程序

例如:

#include<stdio.h>
#include<sys/types.h>
#include<stdio.h>
int main()
{
        int count=0;
        pid_t pid;
        pid=fork();     // 創(chuàng)建一個(gè)子進(jìn)程
        if(pid<0)
        {
                printf("error in fork!");
                exit(1);
        }
        else if(pid==0)
        {
                printf("I am the child process,the count is %d,my process ID %d,pid=%d\n",++count,getpid(),pid);
                exit(0);
        }
        else
                printf("I am the parent process,the count is %d,my process ID %d,pid=%d\n",count,getpid(),pid);
        return 0;
}

輸出結(jié)果:

I am the parent process,the count is 0,my process ID 13981,pid=13982
I am the child process,the count is 1,my process ID 13982,pid=0

從中可以看出,兩個(gè)進(jìn)程中,原先就存在的那個(gè)被稱為父進(jìn)程,新出現(xiàn)的那個(gè)被稱為子進(jìn)程。父子進(jìn)程的區(qū)別除了進(jìn)程標(biāo)識(shí)符(ID)不同外,變量pid的值也不同,pid存放的是fork的返回值。fork調(diào)用的一個(gè)奇妙之處就是它僅僅被調(diào)用一次,卻能返回兩次,它可能有三中不同的返回值

    父進(jìn)程中,返回新建子進(jìn)程的ID

    子進(jìn)程中,返回0

    若出錯(cuò),則返回一個(gè)負(fù)值。

fork出錯(cuò)的原因有兩種:

   1. 當(dāng)前的進(jìn)程數(shù)已經(jīng)達(dá)到系統(tǒng)規(guī)定的上限,

    2.系統(tǒng)內(nèi)存不足,

fork出錯(cuò)的可能性很小,一般為第一種情況

vfork與fork相同,父進(jìn)程返回子進(jìn)程的ID,子進(jìn)程中返回0,若出錯(cuò)則返回-1。

不同的是:

    fork要拷貝父進(jìn)程的數(shù)據(jù)段;而vfork則不需要完全拷貝父進(jìn)程的數(shù)據(jù)段,在子進(jìn)程沒有調(diào)用exec或exit之前,子進(jìn)程與父進(jìn)程共享數(shù)據(jù)段。

    fork不對(duì)父子進(jìn)程的執(zhí)行次序進(jìn)行任何限制,而在vfork調(diào)用中,子進(jìn)程先運(yùn)行,父進(jìn)程掛起,直到子進(jìn)程調(diào)用了exec或exit之后,父進(jìn)程的執(zhí)行次序才不再有限制。

例如:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(void)
{
        int count=1;
        int child;
        printf("Before create son, the father's count is %d\n",count);
        child=vfork();  //創(chuàng)建了一個(gè)新的進(jìn)程,此時(shí)有兩個(gè)進(jìn)程在運(yùn)行
        if(child < 0)
        {
                printf("error in vfork!\n");
                exit(1);
        }
        if(child==0)
        {
                printf("This is son,his pid id %d and the count is %d\n",getpid(),++count);
                exit(1);
        }
        else
        {
                printf("After son, This is father,his pid is %d and the count is %d, and the child is %d\n",getpid(),count,child);
        }
        return 0;
}

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

Before create son, the father's count is 1
This is son,his pid id 14049 and the count is 2
After son, This is father,his pid is 14048 and the count is 2, and the child is 14049

從運(yùn)行結(jié)果中,我們可以看出,在子進(jìn)程中修改了count的值,但是父進(jìn)程中輸出了修改后的值2,而不是初始值1.說明子進(jìn)程和父進(jìn)程是共享count的,也就是說,由vfork創(chuàng)建出來的子進(jìn)程與父進(jìn)程之間是共享內(nèi)存區(qū)的。另外,有vfork創(chuàng)建的子進(jìn)程還會(huì)導(dǎo)致父進(jìn)程的掛起,除非子進(jìn)程執(zhí)行了exit或者execve才會(huì)喚醒父進(jìn)程。

文章名稱:fork和vfork函數(shù)
當(dāng)前地址:http://m.newbst.com/article44/jheihe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器微信公眾號(hào)品牌網(wǎng)站制作服務(wù)器托管網(wǎng)站改版響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)