【Linux系统编程】vfork() 函数详解
生活随笔
收集整理的這篇文章主要介紹了
【Linux系统编程】vfork() 函数详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. vfork函數
- 02. fork和vfork區別
- 03. 父子進程地址空間
- 04. 附錄
01. vfork函數
函數分析
#include <sys/types.h> #include <unistd.h>pid_t vfork(void); 功能:vfork()函數和fork()函數一樣都是在已有的進程中創建一個新的進程,但它們創建的子進程是有區別的。參數:無返回值:成功:子進程中返回 0,父進程中返回子進程 ID。pid_t為無符號整型。失敗:返回 -1。02. fork和vfork區別
1)fork(): 父子進程的執行次序不確定。
vfork():保證子進程先運行,在它調用 exec(進程替換) 或 exit(退出進程)之后父進程才可能被調度運行。
2)fork(): 子進程拷貝父進程的地址空間,子進程是父進程的一個復制品。
vfork():子進程共享父進程的地址空間(準確來說,在調用 exec(進程替換) 或 exit(退出進程) 之前與父進程數據是共享的)
下面我們寫一個例子來測試,通過 vfork() 創建的子進程會執行完后,才到父進程執行:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h>int main(void) {pid_t pid = -1;int i = 0;//創建一個子進程 阻塞父進程pid = vfork();if (-1 == pid){perror("vfork"); goto err0;}//子進程else if (0 == pid){for (i = 0; i < 10; i++) {printf("child do thing%d\n", i + 1); sleep(1);}exit(0);}else{printf("parent process do thing...\n"); printf("parent exit....\n");}return 0; err0:return -1; }測試結果
03. 父子進程地址空間
子進程共享父進程的地址空間
測試代碼如下:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h>int main(void) {pid_t pid = -1;int i = 0;int val = 88;//創建一個子進程 阻塞父進程pid = vfork();if (-1 == pid){perror("vfork"); goto err0;}//子進程else if (0 == pid){for (i = 0; i < 10; i++) {printf("child do thing%d\n", i + 1); //sleep(1);}val++;printf("child process val = %d\n", val);//_Exit(0);//_exit(0);//不能使用return返回//return 0;exit(0);}else{printf("parent process val = %d\n", val);printf("parent process do thing...\n"); printf("parent exit....\n");}return 0; err0:return -1; }測試結果:
vfork() 保證子進程先運行,在它調用 exec(進程替換) 或 exit(退出進程)之后父進程才可能被調度運行。如果子進程沒有調用 exec, exit, 程序則會導致死鎖,程序是有問題的程序,沒有意義,測試代碼如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h>int main(int argc, char *argv[]) {pid_t pid;pid = vfork(); // 創建進程if(pid < 0){ // 出錯perror("vfork");}if(0 == pid){ // 子進程printf("i am son\n");sleep(1);// 子進程沒有調用 exec 或 exit}else if(pid > 0){ // 父進程printf("i am father\n");sleep(1);}return 0; }執行結果:
deng@itcast:/mnt/hgfs/LinuxHome/code.bak2/4sys/3rd/code$ gcc test.c deng@itcast:/mnt/hgfs/LinuxHome/code.bak2/4sys/3rd/code$ ./a.out i am son i am father 段錯誤 (核心已轉儲) deng@itcast:/mnt/hgfs/LinuxHome/code.bak2/4sys/3rd/code$所以,用 vfork() 創建進程,子進程里一定要調用 exec(進程替換) 或 exit(退出進程),否則,程序會出問題,沒有意義。
04. 附錄
4.1 參考博客:【Linux系統編程】vfork() 函數詳解
總結
以上是生活随笔為你收集整理的【Linux系统编程】vfork() 函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux系统编程】fork()函数详
- 下一篇: 【Linux系统编程】特殊进程之僵尸进程