程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 調用exec()後進程在何處終止

調用exec()後進程在何處終止

編輯:C++入門知識

調用exec()後進程在何處終止
[cpp] 
#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <errno.h> 
int main() 

    int a = 1; 
    int pid; 
    char buff[] = "before fork"; 
    if(write(1, buff, sizeof(buff) - 1) != (sizeof(buff) - 1)) 
    { 
        perror("write error"); 
        exit(0); 
    }/* fork之前的代碼不會在子進程中執行 */ 
    if( (pid = fork()) == -1 ) 
    { 
        perror("fork error"); 
        exit(1); 
    } 
    else if(pid == 0) 
    { 
        if( execlp( "./write1", "write1", (char *)0 ) == -1 ) 
        { 
            perror("execlp error"); 
            exit(1); 
        }/* exec函數執行的程序替換了所在進程的進程空間,執行完後進程就終止了了,所以下面兩行代碼不會執行 */ 
        /*********************進程在此處終止*****************************/ 
        a++;    /* 不會執行 */ 
        printf("%d", a);    /* 不會執行 */ 
    } 
    if( execlp( "./write1", "write1", (char *)0 ) == -1 ) 
    { 
        perror("execlp error"); 
        exit(1); 
    } 
    /*********************進程在此處終止*****************************/ 
    printf("%d", a);    /* 同樣,這行代碼也不會執行 */ 
     
    return 0; 

 
/* 上面execlp調用的write1程序 */ 
#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <errno.h> 
int main() 

    char buff[] = "write"; 
    if( write(1, buff, sizeof(buff) - 1) != (sizeof(buff) - 1) ) 
    { 
        perror("write error"); 
        exit(1); 
    }  www.2cto.com
    return 0; 

/*
總結:
1. fork之前的代碼不會在其子進程中執行,原因可能是fork復制的是調用fork那一刻的進程空間,而fork之前的代碼在棧中已經消亡
2. exec函數執行的程序替換了所在進程的進程空間,執行完後進程就終止了了,所以exec之後的代碼就不執行了
*/ 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved