1

废话不多说,先上代码

 #include<unistd.h>
 #include<stdio.h>
int main()
{
    pid_t pid;
    int i;
    for(i = 0; i < 3; i++){
        pid = fork();
        if(0 == pid || -1 == pid){
            break;
        }
    }

    if(0 < pid){
        printf("我是父进程,进程id号:%d\n",getpid());
        return 0;
    }

    if(0 == pid){
        printf("我是子进程,进程id号:%d,所属父进程:%d\n",getpid(),getppid());
        return 0;
    }

    if(-1 == pid){
        printf("进程创建失败\n");
        return 0;
    }
    return 0;
}

输出结果:
我是子进程,进程id号:1249,所属父进程:1248
我是子进程,进程id号:1250,所属父进程:1248
我是父进程,进程id号:1248
我是子进程,进程id号:1251,所属父进程:1248

一开始初学看这段代码的时候,我是很不解的,原因是下面的代码:

for(i = 0; i < 3; i++){
            pid = fork();
            if(0 == pid || -1 == pid){
                break;
            }
        }

pid的返回有三个值,0表示子进程,大于0表示父进程,-1表示进程创建失败,按代码逻辑看的话不就是执行了一次然后通过break停止循环了吗?这样怎么创建多个进程呢?

unix环境高级编程关于fork是这样说的,fork函数调用一次,返回两个值,这两个值有两种情况,分别是pid = 0,pid > 0和pid > 0和pid = -1.当fork完成后,子进程和父进程继续执行fork后面的指令,子进程是父进程的副本,子进程获得父进程数据空间,堆和栈的副本。

从上面的话我们得知,当执行fork的时候,系统将程序分裂成两个进程,两个进程运行状态独立了,子进程和父进程的执行位置是用一样的,换句话说子进程和父进程的执行位置就是pid = fork();,正在等待系统返回pid的值。从父进程的角度,pid > 0 ,此时不满足if条件,从而会继续循环。子进程的pid = 0;满足if语句的条件,跳出循环,执行循环外的if语句,子进程不会继续创建进程。从而满足一个父进程,多个子进程。


搞怪者
26 声望0 粉丝