91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

fork和vfork函數

發布時間:2020-07-21 00:47:09 來源:網絡 閱讀:454 作者:PlayWithYou 欄目:編程語言

fork:

    fork用于派生一個進程。如果成功,父進程返回子進程的ID,子進程中返回0,若出錯則返回-1。

主要用途:

    一個進程希望復制自身,從而子父進程能同時執行不同的代碼段。

    進程想要執行另一個程序

例如:

#include<stdio.h>
#include<sys/types.h>
#include<stdio.h>
int main()
{
        int count=0;
        pid_t pid;
        pid=fork();     // 創建一個子進程
        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;
}

輸出結果:

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

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

    父進程中,返回新建子進程的ID

    子進程中,返回0

    若出錯,則返回一個負值。

fork出錯的原因有兩種:

   1. 當前的進程數已經達到系統規定的上限,

    2.系統內存不足,

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

vfork與fork相同,父進程返回子進程的ID,子進程中返回0,若出錯則返回-1。

不同的是:

    fork要拷貝父進程的數據段;而vfork則不需要完全拷貝父進程的數據段,在子進程沒有調用exec或exit之前,子進程與父進程共享數據段。

    fork不對父子進程的執行次序進行任何限制,而在vfork調用中,子進程先運行,父進程掛起,直到子進程調用了exec或exit之后,父進程的執行次序才不再有限制。

例如:

#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();  //創建了一個新的進程,此時有兩個進程在運行
        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;
}

運行結果:

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

從運行結果中,我們可以看出,在子進程中修改了count的值,但是父進程中輸出了修改后的值2,而不是初始值1.說明子進程和父進程是共享count的,也就是說,由vfork創建出來的子進程與父進程之間是共享內存區的。另外,有vfork創建的子進程還會導致父進程的掛起,除非子進程執行了exit或者execve才會喚醒父進程。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西藏| 泾川县| 隆子县| 远安县| 贵德县| 富阳市| 兴安盟| 左贡县| 沈丘县| 兴义市| 驻马店市| 绥棱县| 芦山县| 延边| 常宁市| 牟定县| 化隆| 嘉黎县| 垦利县| 天峨县| 高要市| 竹山县| 增城市| 石屏县| 宁乡县| 东至县| 漠河县| 浮山县| 宽甸| 安康市| 高台县| 屯昌县| 惠来县| 赤峰市| 会宁县| 湘潭县| 台中市| 乐业县| 扎赉特旗| 贵州省| 全南县|