日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux进程管理fork,Linux -- 进程管理之 fork() 函数

發(fā)布時(shí)間:2023/12/19 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux进程管理fork,Linux -- 进程管理之 fork() 函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一個(gè)進(jìn)程調(diào)用fork()函數(shù)后,系統(tǒng)先給新的進(jìn)程分配資源,例如存儲(chǔ)數(shù)據(jù)和代碼的空間。然后把原來(lái)的進(jìn)程的所有值都復(fù)制到新的新進(jìn)程中,只有少數(shù)值與原來(lái)的進(jìn)程的值不同。相當(dāng)于克隆了一個(gè)自己。

Test1

for(int i = 0; i<2; i++)

{

if(fork() == 0)

printf("A\n");

else

printf("B\n");

}

上述代碼中,fork() 執(zhí)行后會(huì)出現(xiàn)兩個(gè)進(jìn)程,子進(jìn)程中的 fork() 返回值為 0,父進(jìn)程中 fork() 返回值則是子進(jìn)程的 pid

執(zhí)行結(jié)果如下圖

Test2

將上述代碼稍微修改一下

for(int i = 0; i<2; i++)

{

if(fork() == 0)

printf("A");

else

printf("B");

}

該循環(huán)中打印沒(méi)有字符 "\n",無(wú)法刷新緩沖區(qū)

每一次 fork() 會(huì)復(fù)制之前進(jìn)程中緩沖區(qū)的字符

最后執(zhí)行結(jié)果為

BBBAABAA

(取決于兩個(gè)進(jìn)程執(zhí)行的順序)

Test3

if(fork() && fork())

printf("A\n");

else

printf("B\n");

該 if 塊中第一個(gè) fork() 生成一個(gè)子進(jìn)程,返回 0,所以第二個(gè) fork() 不會(huì)執(zhí)行

父進(jìn)程返回 pid,執(zhí)行第二個(gè) fork(),再次產(chǎn)生一個(gè)子進(jìn)程

所以最終 printf 調(diào)用了三次,最后執(zhí)行結(jié)果為

A

B

B

Test4

#include

#include

// 測(cè)試棧空間的變量

void f0()

{

int tmp = 0;

int pid = fork();

if(pid == 0)

{

tmp++;

printf("son\n");

}

else if(pid > 0)

{

printf("parents\n");

}

else

{

return;

}

printf("%d\n",tmp);

}

int tmp1 = 5;

// 測(cè)試全局變量

void f1()

{

int pid = fork();

if(pid == 0)

{

tmp1++;

printf("son\n");

}

else if(pid > 0)

{

printf("parents\n");

}

else

{

return;

}

printf("%d\n",tmp1);

}

// 測(cè)試堆區(qū)變量

void f2()

{

int *tmp2 = (int*)malloc(sizeof(int));

*tmp2 = 0;

int pid = fork();

if(pid == 0)

{

(*tmp2)++;

printf("son\n");

}

else if(pid > 0)

{

printf("parents\n");

}

else

{

return;

}

printf("%d\n",*tmp2);

}

通過(guò)在 main 分別執(zhí)行以上三個(gè)函數(shù),輸出中父進(jìn)程與子進(jìn)程打印的 tmp 值均不相同

可以發(fā)現(xiàn),fork() 后生成新的子進(jìn)程與父進(jìn)程是相互獨(dú)立的,擁有獨(dú)立的 VMA

進(jìn)程管理之fork函數(shù)

fork函數(shù)的定義 #include #include pid_t fork(void); fork函數(shù)在父進(jìn)程中返回子進(jìn)程的 ...

UNIX環(huán)境編程學(xué)習(xí)筆記(19)——進(jìn)程管理之fork 函數(shù)的深入學(xué)習(xí)

lienhua342014-10-07 在“進(jìn)程控制三部曲”中,我們學(xué)習(xí)到了 fork 是三部曲的第一部,用于創(chuàng)建一個(gè)新進(jìn)程.但是關(guān)于 fork 的更深入的一些的東西我們還沒(méi)有涉及到,例如,fork ...

【Linux編程】進(jìn)程標(biāo)識(shí)符與fork函數(shù)

ID為0的進(jìn)程一般是調(diào)度進(jìn)程.常被稱為交換進(jìn)程(swapper),是內(nèi)核中的系統(tǒng)進(jìn)程. ID為1的進(jìn)程叫做init進(jìn)程,是一個(gè)普通用戶進(jìn)程,不屬于內(nèi)核,由內(nèi)核調(diào)用. 一個(gè)現(xiàn)有進(jìn)程能夠調(diào)用fork函數(shù)創(chuàng) ...

Linux進(jìn)程管理知識(shí)整理

Linux進(jìn)程管理知識(shí)整理 1.進(jìn)程有哪些狀態(tài)?什么是進(jìn)程的可中斷等待狀態(tài)?進(jìn)程退出后為什么要等待調(diào)度器刪除其task_struct結(jié)構(gòu)?進(jìn)程的退出狀態(tài)有哪些? TASK_RUNNING(可運(yùn)行狀態(tài)) ...

Linux性能及調(diào)優(yōu)指南(翻譯)之Linux進(jìn)程管理

總結(jié)

以上是生活随笔為你收集整理的linux进程管理fork,Linux -- 进程管理之 fork() 函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。