程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> fork函數實例

fork函數實例

編輯:C++入門知識

下面是一個fork函數的實例


[cpp]
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
 
int     glob = 6; 
char buf[] = "a write to stdout\n"; 
 
int main(void) 

        int     var; 
        pid_t   pid; 
 
        var = 88; 
 
        if(write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) -1) 
                printf("error: write error\n"); 
        printf("before fork\n"); 
 
        if((pid = fork()) < 0) { 
                printf("error: fork error\n"); 
        } else if(pid == 0) { 
                glob ++; 
                var ++; 
        } else { 
                sleep(2); 
        } 
 
        printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var); 
        exit(0); 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int     glob = 6;
char buf[] = "a write to stdout\n";

int main(void)
{
        int     var;
        pid_t   pid;

        var = 88;

        if(write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) -1)
                printf("error: write error\n");
        printf("before fork\n");

        if((pid = fork()) < 0) {
                printf("error: fork error\n");
        } else if(pid == 0) {
                glob ++;
                var ++;
        } else {
                sleep(2);
        }

        printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
        exit(0);
}

然後執行輸出

jay@jay-vibox:~/workspace/UNIX/8-1$ cc main.c
jay@jay-vibox:~/workspace/UNIX/8-1$ ./a.out
a write to stdout
before fork
pid = 2917, glob = 7, var = 89
pid = 2916, glob = 6, var = 88


------------------------------------------------

jay@jay-vibox:~/workspace/UNIX/8-1$ ./a.out > tmp.out
jay@jay-vibox:~/workspace/UNIX/8-1$
jay@jay-vibox:~/workspace/UNIX/8-1$
jay@jay-vibox:~/workspace/UNIX/8-1$ cat tmp.out
a write to stdout
before fork
pid = 2925, glob = 7, var = 89
before fork
pid = 2924, glob = 6, var = 88


-----------------------------------------------------------

一般說來fork之後先執行父進程還是子進程是不確定的。

當寫道標准輸出時,我們將buf長度減去1作為輸出字節數,這是為了避免終止null字符寫出。strlen計算不包括終止null字符的字符串長度,而sizeof則計算包括終止null字節的緩沖區長度。兩者之間的另一個差別是,使用strlen需進行一次函數調用,而對於sizeof而言,因為緩沖區一用一直字符串進行了初始化,其長度是固定的,所以sizeof在編譯時計算緩沖區長度。

當一交互方式運行該程序時,只得到該printf輸出的行一次,其原因是標准輸出緩沖區由換行符沖洗。

但是當標准輸出重定向到一個文件時,卻得到printf輸出兩次。其原因是,當fork之前調用了printf一次,但當調用fork時,該行數據仍在緩沖區中,然後再將父進程數據空間復制到子進程中時,該緩沖區也被復制到子進程中。於是那時父子進程各自有了帶改行內容的標准IO緩沖區。

 


作者:zhangjie201412

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