歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux fork返回值

Linux創建進程函數fork()正確調用一次的時候有兩個返回值:

子進程返回:0
父進程返回:>0的整數(返回子進程ID號)

而錯誤的時候返回-1

而在介紹fork()函數時的應用例子一般都為以下結構:如下例:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
        pid_t result;
        /*調用fork函數,其返回值為result*/
        result = fork();
        /*通過result的值來判斷fork函數的返回情況,首先進行出錯處理*/
        if(result == -1)
        {
                perror("fork");
                exit;
        }
        else if(result == 0)/*返回值為0代表子進程*/
        {
                printf("The return value is %d\nIn child process!!\nMy PID is %d\n",result,getpid());
        }
        else /*返回值大於0代表父進程*/
        {
                printf("The return value is %d\nIn father process!!\nMy PID is
                %d\n",result,getpid());
        }
}

程序運行結果:
The return valud s 76
In father process!!
My PID is 75
The return value is :0
In child process!!
My PID is 76


不理解的地方:
inux中fork()函數用法詳解:
先看下面代碼:
#include ;
main ()
{
pid_t pid;
pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %d\n",getpid());
else
printf("i am the parent process, my process id is %d\n",getpid());
}
要搞清楚fork的執行過程,就必須先講清楚操作系統中的“進程(process)”概念。一個進程,主要包含三個元素:
o. 一個可以執行的程序;
o. 和該進程相關聯的全部數據(包括變量,內存空間,緩沖區等等);
o. 程序的執行上下文(execution context)。
不妨簡單理解為,一個進程表示的,就是一個可執行程序的一次執行過程中的一個狀態。操作系統對進程的管理,典型的情況,是通過進程表完成的。進程表中的每一個表項,記錄的是當前操作系統中一個進程的情況。對於單 CPU的情況而言,每一特定時刻只有一個進程占用 CPU,但是系統中可能同時存在多個活動的(等待執行或繼續執行的)進程。
一個稱為“程序計數器(program counter, pc)”的寄存器,指出當前占用 CPU的進程要執行的下一條指令的位置。
當分給某個進程的 CPU時間已經用完,操作系統將該進程相關的寄存器的值,保存到該進程在進程表中對應的表項裡面;把將要接替這個進程占用 CPU的那個進程的上下文,從進程表中讀出,並更新相應的寄存器(這個過程稱為“上下文交換(process context switch)”,實際的上下文交換需要涉及到更多的數據,那和fork無關,不再多說,主要要記住程序寄存器pc指出程序當前已經執行到哪裡,是進程上下文的重要內容,換出 CPU的進程要保存這個寄存器的值,換入CPU的進程,也要根據進程表中保存的本進程執行上下文信息,更新這個寄存器)。
好了,有這些概念打底,可以說fork了。當你的程序執行到下面的語句:
pid=fork();
操作系統創建一個新的進程(子進程),並且在進程表中相應為它建立一個新的表項。新進程和原有進程的可執行程序是同一個程序;上下文和數據,絕大部分就是 原進程(父進程)的拷貝,但它們是兩個相互獨立的進程!此時程序寄存器pc,在父、子進程的上下文中都聲稱,這個進程目前執行到fork調用即將返回(此 時子進程不占有CPU,子進程的pc不是真正保存在寄存器中,而是作為進程上下文保存在進程表中的對應表項內)。問題是怎麼返回,在父子進程中就分道揚 镳。

父進程繼續執行,操作系統對fork的實現,使這個調用在父進程中返回剛剛創建的子進程的pid(一個正整數),所以下面的if語句中pid<0, pid==0的兩個分支都不會執行。所以輸出i am the parent process...

看man手冊,關於fork的說明如下:

FORK(2)                    Linux Programmer's Manual                  FORK(2)
 
NAME:作用是創建一個子進程。
      fork - create a child process
 
SYNOPSIS:簡介

        使用的頭文件
      #include <sys/types.h>
      #include <unistd.h>
      函數原型:
      pid_t fork(void);


RETURN VALUE:返回值
      On success, the PID of the child process is returned  in  the  parent's

      如果函數成功創建子進程,在父進程中會返回子進程的PID,並在子進程中返回一個0。
      thread  of execution, and a 0 is returned in the child's thread of exe-
      cution.  On failure, a -1 will be returned in the parent's context,  no

                    如果失敗,則在父進程中,返回一個-1的值。
      child process will be created, and errno will be set appropriately.
 相應的驗證程序如下:

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

int main()

{

          pid_t pid;

          pid=fork();

          if(pid<0) printf("failure in creating child process.\n");

          else if(pid==0)  printf("This is in child process.\n");

          else

                      printf("This is in parent process.\n");

          return 0;       

}

說明:

子進程是父進程的副本,它將獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味著父子進程間不共享這些存儲空間,它們之間共享的存儲空間只有代碼段。

Copyright © Linux教程網 All Rights Reserved