日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【Linux系统编程】vfork() 函数详解

發布時間:2024/4/24 linux 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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() 函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。