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()函式函式
- fork與vfork函式函式
- fork與vfork詳解
- fork函式與vfork函式函式
- Linux中fork和exec是什麼?有何區別?Linux
- Linux vfork()Linux
- fork 和 vfork 使用的注意事項和 system() 函式的替代函式
- linux shell 中 printf 與 echo的區別Linux
- Linux free中buffer與cache區別Linux
- Linux中檔案與目錄的區別Linux
- Javascript中“==”與“===”的區別JavaScript
- js中“==”與"==="的區別JS
- linux 指令碼 for 與while實際中的區別Linux指令碼While
- 1程式與執行緒以及Linux中fork()的運用執行緒Linux
- Linux中fork的使用注意事項Linux
- linux cache與buffer的區別Linux
- Linux su與sudo的區別Linux
- Java中(==)與equals的區別Java
- numpy中dot與*的區別
- Python中 ‘==‘ 與‘is‘的區別Python
- Linux 中的 fork() 函式例項解析Linux函式
- linux中fork()函式詳解Linux函式
- js中!和!!的區別與用法JS
- js中 let 與 var 的區別JS
- HTTP中GET與POST的區別HTTP
- ruby中的\z與\Z區別
- 陣列中&a與&a[0]的區別陣列
- MySQL語法中=與:=的區別MySql
- CSS中PX與EM的區別CSS
- perl中my與local的區別
- HTML中ID與NAME的區別HTML
- vue中sass與SCSS的區別VueCSS
- Linux fork 炸彈解析,Linux Fork BombLinux
- jQuery中hover與mouseover與mouseenter的區別jQuery
- Linux 中 fcntl()、lockf、flock 的區別Linux
- Linux系統中rpm與yum的區別是什麼?Linux
- Android中 @和?區別以及?attr/**與@style/**等的區別Android