linux中fork()與vfork()的區別
一、fork
1. 呼叫方法
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
正確返回:在父程式中返回子程式的程式號,在子程式中返回0
錯誤返回:-1
子程式是父程式的一個拷貝。即,子程式從父程式得到了資料段和堆疊段的拷貝,這些需要分配新的記憶體;而對於只讀的程式碼段,通常使用共享記憶體的方式訪問。fork返回後,子程式和父程式都從呼叫fork函式返回處開始執行。
父程式與子程式的不同之處在於:fork的返回值不同——父程式中的返回值為子程式的程式號,而子程式為0
2. fork函式呼叫的用途
⑴ 一個程式希望複製自身,從而父子程式能同時執行不同段的程式碼。
⑵ 程式想執行另外一個程式
二、vfork
1. 呼叫方法
與fork函式完全相同
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
正確返回:在父程式中返回子程式的程式號,在子程式中返回0
錯誤返回:-1
2. vfork函式呼叫的用途
用vfork建立的程式主要目的是用exec函式執行另外的程式,與fork的第二個用途相同
三、fork與vfork的區別
1. fork要拷貝父程式的資料段;而vfork則不需要完全拷貝父程式的資料段,在子程式沒有呼叫exec和exit之前,子程式與父程式共享資料段
2. fork不對父子程式的執行次序進行任何限制;而在vfork呼叫中,子程式先執行,父程式掛起,直到子程式呼叫了exec或exit之後,父子程式的執行次序才不再有限制
四、結束子程式
結束子程式不用exit(0),而使用_exit(0)。這是因為_exit(0)在結束程式時,不對標準I/O流進行任何操作。而exit(0)則會關閉程式的所有標準I/O流。
相關文章
- 程式中fork和vfork的區別
- fork()與vfork()函式函式
- Linux中fork和exec是什麼?有何區別?Linux
- Linux vfork()Linux
- Linux中檔案與目錄的區別Linux
- Linux中“>”和“>>”的區別Linux
- Linux的優缺點,Linux與windows的區別LinuxWindows
- Javascript中“==”與“===”的區別JavaScript
- Python中 ‘==‘ 與‘is‘的區別Python
- Linux系統中rpm與yum的區別是什麼?Linux
- Linux fork程式的用法Linux
- Linux程式與執行緒的區別Linux執行緒
- Linux執行緒與程式的區別Linux執行緒
- Java中(==)與equals的區別Java
- Linux中wget、yum與apt-get用法及區別Linuxwgetapt-get
- js中 let 與 var 的區別JS
- vue中sass與SCSS的區別VueCSS
- js中!和!!的區別與用法JS
- JavaScript 中substr與 substring 的區別JavaScript
- Vue 中ref()與 reactive() 的區別VueReact
- 【Linux學習教程】Linux中tcp與tcp6區別是什麼?LinuxTCP
- spring中的FactoryBean與ObjectFactory的區別SpringBeanObject
- Linux中rmdir和rm命令的主要區別!Linux
- 【linux】free命令中cached和buffers的區別Linux
- Linux 中 awk指令 sub和substr的區別Linux
- Linux free 命令中cached 和 buffers 的區別Linux
- 初學linux的fork筆記Linux筆記
- 轉載_Linux程式與執行緒的區別Linux執行緒
- Linux中程式與程式、執行緒的區別!Linux執行緒
- Linux下su與su -命令的本質區別Linux
- Linux中什麼是打包?與歸檔有什麼區別?Linux
- Linux中open與fopen區別主要體現在哪些方面?Linux
- Java中類與物件的關係與區別Java物件
- vue中 lang="ts"與js的區別VueJS
- StringUtils類中isEmpty與isBlank的區別
- Vue的mode中 hash 與 history 的區別Vue
- ??與?:的區別
- Linux中的管道是什麼?管道與共享記憶體的區別有哪些?Linux記憶體
- 在Linux中,Linux核心和Shell有何區別?Linux