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
相關文章
- Linux程式建立函式vfork簡介Linux函式
- linux中fork()與vfork()的區別Linux
- vfork()函式函式
- fork()與vfork()函式函式
- fork與vfork函式函式
- fork與vfork詳解
- vfork函式例項函式
- fork函式與vfork函式函式
- 程式中fork和vfork的區別
- vfork函式建立出的父子程式函式
- fork 和 vfork 使用的注意事項和 system() 函式的替代函式
- 【Linux】常用linux操作Linux
- 【LINUX】LINUX PHP搭建LinuxPHP
- [linux]重拾linuxLinux
- Linux module(Linux 模組)Linux
- 【LINUX】linux ulimit調優LinuxMIT
- Linux知識--初始linuxLinux
- LINUX(十七)Linux其它命令Linux
- LINUX(十四)Linux磁碟管理Linux
- Linux1:Linux概述Linux
- 【Linux】Linux安全加固指令碼Linux指令碼
- 【linux】Linux作業系統Linux作業系統
- Linux小白如何快速上手Linux?Linux
- Linux安裝之Linux mintLinux
- 【Linux基礎】Linux目錄Linux
- 【Linux】linux時區設定Linux
- Linux技術——常用 linux 命令Linux
- [linux]linux下安裝mysqlLinuxMySql
- LINUX(十三)Linux程式排程Linux
- LINUX(十二) Linux程式檢視Linux
- [linux]linux傳送郵件Linux
- Linux教程-Turbo Linux Shell(轉)Linux
- linux: atLinux
- LinuxLinux
- Linux系統管理——Linux簡介Linux
- 【Linux】 Linux網路程式設計Linux程式設計
- Linux 筆記分享三:Linux 命令Linux筆記
- Linux發行版 vs Linux核心Linux