php fork 相关函数,C语言fork函数创建进程详解

在linux下,C语言创建进程用fork函数,接下来我们通过代码来一步步了解fork函数的各个知识点。

1、依赖的头文件#include 

2、fork的原理和概念

fork子进程就是从父进程拷贝一个新的进程出来,子进程和父进程的进程ID不同,但用户数据一样。

在C语言中,创建一个子进程代码如下:pid_t pid; //pid_t 从底层来看,实际上是int类型。

pid = fork();

3、父进程和子进程

执行fork函数后有2种返回值:对于父进程,返回的是子进程的PID(即返回一个大于0的数字);对于子进程,则返回0,所以我们可以通过pid这个返回值来判断当前进程是父进程还是子进程。如下代码所示:

if(pid > 0)

{

printf("im parent process, pid: %d\n", getpid());

}

else if(pid == 0)

{

printf("im child process, pid: %d, parent pid: %d\n", getpid(), getppid());

}

else

{

printf("fork failed\n");

}

温馨提示:

getpid() -获取当前进程的pid

getppid() -获取当前进程的父进程的pid

4、完整例子&子进程代码执行位置

了解这些之后,我们来看一个创建子进程的完整代码示例:

#include    

#include    

int main(int argc, char *argv[])

{

printf("========== before fork =============\n");

pid_t pid;

pid = fork();

printf("========== after fork =============\n");

if(pid > 0)

{

printf("im parent process, pid: %d\n", getpid());

}

else if(pid == 0)

{

printf("im child process, pid: %d, parent pid: %d\n", getpid(), getppid());

}

else

{

printf("fork failed\n");

}

printf("========== process end =============\n");

sleep(1);

return 0;

}

运行结果如下图:

ce639f91a4ef81a2f6ba28b019e63e49.png

从上图可以看出,程序只输出了1个“before fork”,但输出了2个“after fork”,所以我们可以得出:子进程的代码执行是从fork()位置之后开始的。事实也确实是如此。

5、循环创建子进程

有时候,我们需要创建多个子进程,可以通过for循环来实现,代码如下:

#include    

#include    

int main(int argc, char *argv[])

{

int i = 0;

pid_t pid;

for(i = 0; i 

{

pid = fork();

}

if (pid == 0)

{

printf("im child process, pid: %d, parent pid: %d\n", getpid(), getppid());

}

else

{

printf("im parent process, pid: %d\n", getpid());

}

sleep(1);

return 0;

}

运行结果如下图:

f3ecdffc79c96dabbd72ed6d7d50cc6d.png

咦,我们不是循环创建3个子进程吗,怎么输出了这么多次parent process和child process呢?

这是因为子进程也创建了子进程,大家可以观察一下图中的pid。数了一下,共输出了8次,刚好是2的3次方。

我画了一个fork步骤图,便于大家更好的理解,如下:

2021a70f530ad80b1b00e04bd5e9b742.png

如上图所示,子进程在第2轮、3轮,也会相当于父进程一样继续fork子进程,所以for循环3次后,刚好得到共8个进程。

那如果我们就想通过循环3次,得到3个子进程,要怎么办呢?

思路:不让子进程fork出新的子进程。

代码片段如下:for(i = 0; i 

{

pid = fork();

if (pid == 0)

{

break;

}

}

运行结果:

4a38be0b41a8ef29c4f9240bfe600cf7.png

至此,fork函数创建子进程介绍完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值