第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

1. 前言

之前的小節(jié)中介紹了操作系統(tǒng)的進(jìn)程,操作系統(tǒng)中有個(gè)創(chuàng)建進(jìn)程的重要方法就是 fork 函數(shù),當(dāng)需要執(zhí)行和本進(jìn)程相關(guān)的獨(dú)立任務(wù)時(shí),一般需要?jiǎng)?chuàng)建一個(gè)有血緣關(guān)系的子進(jìn)程。

2. fork 函數(shù)

面試官提問(wèn): Linux 系統(tǒng)中的 fork 函數(shù)是什么,有什么用途?

題目解析:

首先從定義上看,fork 函數(shù)的作用是在一個(gè)進(jìn)程的基礎(chǔ)上創(chuàng)建新的進(jìn)程,原有的進(jìn)程被定義為父進(jìn)程,新的進(jìn)程被定義為子進(jìn)程。

在 C 語(yǔ)言中調(diào)用 fork() 函數(shù)即實(shí)現(xiàn) fork 功能,示例:

#include<unistd.h>	//包含fork函數(shù)的頭文件
pid_t fork(void);	  //fork的返回類型為pid_t,我們可以看成int類型

認(rèn)識(shí)一個(gè)函數(shù),需要從函數(shù)的定義入手,了解函數(shù)做了什么事情,入?yún)⑹鞘裁?,出參是什么。我們?C 語(yǔ)言實(shí)現(xiàn)的一個(gè)典型的 fork 的程序入手,示例:

#include <unistd.h>
#include <stdio.h>
 
int main ()
{
    pid_t fpid; 
    int count = 0;
    fpid = fork();
    if (fpid == 0) { //返回值是0,說(shuō)明是子進(jìn)程
        printf("i am the child process, process id is %d\n", getpid());
        count++;
    } else if(fpid > 0) { //返回值>0,說(shuō)明是父進(jìn)程
        printf("i am the parent process, process id is %d\n", getpid());
        count++;
    } else { //返回值<0,說(shuō)明fork發(fā)生異常
    	printf("fork encounter exception, process id is %d\n", getpid());
    }
    //打印計(jì)數(shù)器
    printf("after fork, counting result : %d\n", count);
    return 0;
}

在 MacOS 系統(tǒng)上編譯運(yùn)行案例示例代碼,運(yùn)行結(jié)果如下圖。

圖片描述

test.c 編譯執(zhí)行結(jié)果

如果是不了解函數(shù)原理的前提下,僅僅從代碼層面分析,在調(diào)用 fork() 函數(shù)之后,代碼會(huì)進(jìn)入 if-else 判斷邏輯,在控制臺(tái)輸出一條語(yǔ)句,然后在控制臺(tái)打印計(jì)數(shù)器的數(shù)值。但是從真正執(zhí)行的結(jié)果來(lái)看,這兩個(gè)打印動(dòng)作都分別執(zhí)行了兩次,并不符合我們的預(yù)期。fork 之后的代碼邏輯被執(zhí)行了兩次,而且兩次進(jìn)入的不同的分支,所以重點(diǎn)在于 fork 函數(shù)到底有啥作用。

按照定義、入?yún)⒑统鰠⑷阶叩目蚣?,首先是分析函?shù)的定義,調(diào)用 fork 函數(shù)之后發(fā)生了什么事情:

(1)分配內(nèi)存:分配新的內(nèi)存空間給子進(jìn)程;
(2)拷貝數(shù)據(jù):拷貝父進(jìn)程的數(shù)據(jù)結(jié)構(gòu)給子進(jìn)程;
(3)加入列表:將新生成的子進(jìn)程添加到操作系統(tǒng)的進(jìn)程列表;
(4)返回結(jié)果:fork 函數(shù)調(diào)度并且返回。

然后是分析 fork 函數(shù)的入?yún)?,fork 函數(shù)入?yún)⑹?void,也就是自動(dòng)同步進(jìn)程的上下文,不需要手動(dòng)聲明。

最后是分析 fork 函數(shù)的出參,fork 函數(shù)和程序員日常接觸的函數(shù)不同,我們?cè)?C 或者 Java 中定義的函數(shù)只會(huì)有一個(gè)返回值,fork 函數(shù)則是調(diào)用一次,返回二次。調(diào)用方(例如上述案例的 main 函數(shù))根據(jù)返回值的不同判斷處于父進(jìn)程還是子進(jìn)程。

(1)返回值 < 0:調(diào)用失敗,一般是因?yàn)椴僮飨到y(tǒng)中的進(jìn)程個(gè)數(shù)達(dá)到上限或者內(nèi)存不足以分配給新的進(jìn)程;
(2)返回值 = 0:調(diào)用成功,并且處于子進(jìn)程;
(3)返回值 > 0:調(diào)用成功,并且處于父進(jìn)程。

現(xiàn)在就不難理解,從調(diào)用 fork() 函數(shù),代碼實(shí)際上是被父子進(jìn)程分別執(zhí)行了一次,父進(jìn)程的進(jìn)程 id 是 52331,子進(jìn)程的進(jìn)程 id 是 52332。

在掌握原理之后,我們繼續(xù)探究 fork 函數(shù)的應(yīng)用場(chǎng)景。fork 函數(shù)的本質(zhì)在原有的進(jìn)程基礎(chǔ)上創(chuàng)建一個(gè)新的進(jìn)程,所以在網(wǎng)絡(luò)通信中使用較多,例如在客戶端發(fā)送一個(gè) HTTP 請(qǐng)求打到服務(wù)器時(shí),服務(wù)器進(jìn)程 fork 出一個(gè)子進(jìn)程用于處理單個(gè)請(qǐng)求,父進(jìn)程則繼續(xù)等待其他的請(qǐng)求。

3. 小結(jié)

本章節(jié)介紹了 Linux 的 fork 函數(shù),fork 如同其英文名,就是進(jìn)程的分叉。fork 函數(shù)簡(jiǎn)化了操作系統(tǒng)的進(jìn)程管理,又提供了一個(gè)簡(jiǎn)單的多進(jìn)程生成方案,在操作系統(tǒng)中的地位非常核心,候選人需要注意 fork 函數(shù)調(diào)用 1 次,返回 2 次的核心特性以及返回值。