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;//返回编号
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章