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