fork的作用是根據一個現有的進程復制出一個新 進程,原來的進程稱為父進程(Parent Process) ,新進程稱為子進程(Child Process)。系統中 同時運行著很多進程,這些進程都是從最初只有一個進程開始一個一個復制出來的。在Shell下輸入 命令可以運行一個程序,是因為Shell進程在讀取用戶輸入的命令之後會調用fork復制出一個新 的Shell進程,然後新的Shell進程調用exec執行新的程序。
例如:在Shell提示符下輸入命令ls,首先fork創建子進程,這時父進程仍在執行/bin/bash程序,然後子進程調用exec執行新的程序/bin/ls
除了子進程和父進程的進程ID不同,其他資源一模一樣。
——創建子進程
函數原型:
#include<sys/types.h>
#include <unistd.h>
pid_t fork(void);
返回值信息:(一次調用兩次返回的性質)
fork調用失敗則返回-1,
成功調用後父進程中返回值為子進程的pid,在子進程中返回值為1
其執行順序不定!
特點:調用一次,返回兩次。
命令設置gdb
setfollow-fork-mode child 在fork之後跟蹤子進程
set follow-fork-mode parent 則是跟蹤父進程,然後用run命令,看到的現象是父進程一直在運行
demo:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <erron.h>
int main(int argc, char **argv)
{
pid_t m_pid;
m_pid = fork();
if (pid < 0){
perror("fork failed");
exit(1);
}
if (m_pid == 0){
printf("i am child! \n");
}
else {
printf("i am parent! \n");
}
return 0;
}