Linux vfork()
轉自:https://blog.csdn.net/jianchi88/article/details/6985326
1.vfork()建立子程式,在呼叫exec()之前或exit()之前,子程式與父程式共享資料段(與fork()不同,fork要拷貝父程式的資料段,堆疊段)
2.呼叫vfork()後,子程式先執行,父程式被掛起,直到子程式呼叫了exec或exit之後,父程式才執行。
例子1:
fork()
#include <unistd.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
int cnt = 1;
pid_t pid = fork();
if(pid<0){
printf("process error!!\n");
return 1;
}
else if(pid==0){
printf("this is a child process, id = %d, count =%d \n",getpid(),cnt++);
}
else
printf("this is the parent process, id = %d, count =%d \n",getpid(),cnt++);
return 0;
}
子程式拷貝父程式的資料段,堆疊段。處於不同的記憶體位置,所以cnt都是1
輸出:
this is the parent process, id = 2661, count =1
this is a child process, id = 2664, count =1
例子2:
使用vfork(),但子程式不呼叫exit()或exec(),父程式一直掛起
導致死鎖!
#include <unistd.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
int cnt = 1;
pid_t pid = vfork();
if(pid<0){
printf("process error!!\n");
return 1;
}
else if(pid==0){
printf("this is a child process, id = %d, count =%d \n",getpid(),cnt++);
}
else
printf("this is the parent process, id = %d, count =%d \n",getpid(),cnt++);
return 0;
}
輸出:
this is a child process, id = 3248, count =1
this is the parent process, id = 3247, count =4195584
vfork: cxa_atexit.c:100: __new_exitfn: Assertion `l != NULL' failed.
已放棄 (核心已轉儲)
例子3:
使用vfork(),並且子程式呼叫exit()或exec()
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int cnt = 1;
pid_t pid = vfork();
if(pid<0){
printf("process error!!\n");
return 1;
}
else if(pid==0){
printf("this is a child process, id = %d, count =%d \n",getpid(),cnt++);
exit(1);
}
else
printf("this is the parent process, id = %d, count =%d \n",getpid(),cnt++);
return 0;
}
子程式執行exit(1)退出後,父程式開始執行,由於共享資料段,所以cnt在子程式加1的基礎上再加1 =2
this is a child process, id = 3497, count =1
this is the parent process, id = 3496, count =2
相關文章
- fork()與vfork()函式函式
- 程式中fork和vfork的區別
- 【Linux】常用linux操作Linux
- 【LINUX】LINUX PHP搭建LinuxPHP
- 【linux】Linux作業系統Linux作業系統
- 【Linux基礎】Linux目錄Linux
- Linux小白如何快速上手Linux?Linux
- 【Linux】Linux安全加固指令碼Linux指令碼
- Linux安裝之Linux mintLinux
- linuxLinux
- Linux啟用 “啟用 Linux” 水印Linux
- Linux 3.11正式命名為Linux For WorkgroupsLinux
- 【Linux】 Linux網路程式設計Linux程式設計
- Linux系統管理——Linux簡介Linux
- Linux發行版 vs Linux核心Linux
- Linux 筆記分享三:Linux 命令Linux筆記
- 【Linux】Linux檔案之/etc/fstabLinux
- Linux學習方法_Linux介紹_Linux發行版組成Linux
- 認識linux核心(linux核心的作用)Linux
- 在Linux中,什麼是Linux shell?Linux
- Linux之父: Rust 將進入 Linux 6.1LinuxRust
- Linux是什麼?Linux有哪些版本?Linux
- 【Linux】萬字總結Linux常用指令Linux
- 【linux專案】lichee nano linux燒寫LinuxNaN
- 【Linux天梯】第一話·初見LinuxLinux
- linux命令大全-linux命令使用和管理Linux
- 【Linux】Linux開啟snmp及查詢Linux
- Linux 筆記分享一:Linux 簡介Linux筆記
- Linux命令Linux
- [Linux]管道Linux
- Linux ShellLinux
- linux opensshLinux
- linux timezoneLinux
- linux trapLinux
- Linux程序Linux
- Linux: GRUBLinux
- Linux LVMLinuxLVM
- linux ncLinux