linux进程管理fork,Linux -- 进程管理之 fork() 函数
一個進程調(diào)用fork()函數(shù)后,系統(tǒng)先給新的進程分配資源,例如存儲數(shù)據(jù)和代碼的空間。然后把原來的進程的所有值都復(fù)制到新的新進程中,只有少數(shù)值與原來的進程的值不同。相當(dāng)于克隆了一個自己。
Test1
for(int i = 0; i<2; i++)
{
if(fork() == 0)
printf("A\n");
else
printf("B\n");
}
上述代碼中,fork() 執(zhí)行后會出現(xiàn)兩個進程,子進程中的 fork() 返回值為 0,父進程中 fork() 返回值則是子進程的 pid
執(zhí)行結(jié)果如下圖
Test2
將上述代碼稍微修改一下
for(int i = 0; i<2; i++)
{
if(fork() == 0)
printf("A");
else
printf("B");
}
該循環(huán)中打印沒有字符 "\n",無法刷新緩沖區(qū)
每一次 fork() 會復(fù)制之前進程中緩沖區(qū)的字符
最后執(zhí)行結(jié)果為
BBBAABAA
(取決于兩個進程執(zhí)行的順序)
Test3
if(fork() && fork())
printf("A\n");
else
printf("B\n");
該 if 塊中第一個 fork() 生成一個子進程,返回 0,所以第二個 fork() 不會執(zhí)行
父進程返回 pid,執(zhí)行第二個 fork(),再次產(chǎn)生一個子進程
所以最終 printf 調(diào)用了三次,最后執(zhí)行結(jié)果為
A
B
B
Test4
#include
#include
// 測試棧空間的變量
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;
// 測試全局變量
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);
}
// 測試堆區(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);
}
通過在 main 分別執(zhí)行以上三個函數(shù),輸出中父進程與子進程打印的 tmp 值均不相同
可以發(fā)現(xiàn),fork() 后生成新的子進程與父進程是相互獨立的,擁有獨立的 VMA
進程管理之fork函數(shù)
fork函數(shù)的定義 #include #include pid_t fork(void); fork函數(shù)在父進程中返回子進程的 ...
UNIX環(huán)境編程學(xué)習(xí)筆記(19)——進程管理之fork 函數(shù)的深入學(xué)習(xí)
lienhua342014-10-07 在“進程控制三部曲”中,我們學(xué)習(xí)到了 fork 是三部曲的第一部,用于創(chuàng)建一個新進程.但是關(guān)于 fork 的更深入的一些的東西我們還沒有涉及到,例如,fork ...
【Linux編程】進程標識符與fork函數(shù)
ID為0的進程一般是調(diào)度進程.常被稱為交換進程(swapper),是內(nèi)核中的系統(tǒng)進程. ID為1的進程叫做init進程,是一個普通用戶進程,不屬于內(nèi)核,由內(nèi)核調(diào)用. 一個現(xiàn)有進程能夠調(diào)用fork函數(shù)創(chuàng) ...
Linux進程管理知識整理
Linux進程管理知識整理 1.進程有哪些狀態(tài)?什么是進程的可中斷等待狀態(tài)?進程退出后為什么要等待調(diào)度器刪除其task_struct結(jié)構(gòu)?進程的退出狀態(tài)有哪些? TASK_RUNNING(可運行狀態(tài)) ...
Linux性能及調(diào)優(yōu)指南(翻譯)之Linux進程管理
總結(jié)
以上是生活随笔為你收集整理的linux进程管理fork,Linux -- 进程管理之 fork() 函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟山羊怎么解锁欢呼羊(MuMu模拟器官
- 下一篇: linux的安装组和管理组的区别吗,Li