歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

linux下系統調用之fork()和vfork()探索

fork函數和vfork()都可以用來創建進程
fork()一個現有進程可以調用fork函數創建一個新進程。由fork創建的新進程被稱為子進程(child process)。fork函數被調用一次但返回兩次。兩次返回的唯一區別是子進程中返回0值而父進程中返回子進程ID。子進程是父進程的副本,它將獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味著父子進程間不共享這些存儲空間。 vfork()會產生一個新的子進程.但是vfork創建的子進程與父進程共享數據段(參考百度文庫,其實還共享了堆,運行結果表明),而且由vfork創建的子進程將先於父進程運行 示例一:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
    pid_t pid;
      int  _num=8; 
    if ((pid = vfork()) < 0) {  //創建子進程失敗
        perror("vfork is failed");
        exit(1);
    } else if (pid == 0) {  //運行時子進程
        printf("this is child process\n");
        _num++;
        printf("the num is :%d\n",_num);
        exit(0);
    } else {  //  >0 vfork()返回值是子進程pid
        printf("this is parent process\n");
        _num++;
        printf("the num is :%d\n",_num);
      }   
    return 0;
}


運行結果:




\

第二個示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
    pid_t pid;
      int  _num=8; 
    if ((pid = fork()) < 0) {
        perror("fork is failed");
        exit(1);
    } else if (pid == 0) {
        printf("this is child process\n");
        _num++;
        printf("the num is :%d\n",_num);
        exit(0);
    } else {
        printf("this is parent process\n");
        _num++;
        printf("the num is :%d\n",_num);
      }   
    return 0;
}
運行結果:



Copyright © Linux教程網 All Rights Reserved