fork()函數

函數原型:pid_t fork(void);
system,popen,exec都是通過運行指定進程,含路徑
fork沒有參數,是賦制進程,子進程和父進程執行位置和執行狀態都一樣。

fork:創建一個子程序,子進程執行當前程序的副本,返回值爲子程序的PID
fork函數的特點:調用一次,返回”兩次”
fork函數創建子進程後,父子進程併發執行

子進程是在fork()執行過程中產生,再接着子進程和父進程都執行完,都返回PID,但父子進程返回值不同,父進程返回子進程pid,子進程返回0,這是區分父子進程的原理。

一個父親,多個孩子進程的框架結構

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
    int i;
    pid_t pid;//一個父親,多個孩子
    for(i=0;i<3;i++)//i爲幾就產生幾個進程//每個子進程i值不同
    {
        pid=fork();
        if(pid<0)
            perror("fork");
        if(pid==0)//只有父進程能產生子進程,子進程不能產生子進程
            break;
    }
    //***************************************************************
    //給不同子進程派任務
    switch(i)//0-4爲子進程,5爲父進程,共6個進程
    {
            case 0:  //0號子進程
                    {
                        sleep(3);
                        printf("i am 0\n");
                    }
                    break;
            case 1:  //1號子進程
                    {
                            sleep(5);
                            printf("i am 1\n");
                    }
            case 2: //父進程
                    {
                            int ret;
                            pid_t pid1;
                            for(i=0;i<5;i++)//等5個子進程結束
                            {
                                    //  wait(NULL);
                                    pid1=wait(&ret);//獲取子進程的pid和返回值
                                    printf("%d號子進程(PID:%d)執行完畢\n",WEXITSTATUS(ret),pid1);
                            }
                    }
                    break;
    }
    return i;//返回編號
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章