3.4.4.fork创建子进程
拿老进程 来复制 一个 新进程
3.4.4.1、为什么要创建子进程
(1)每一次程序的运行都需要一个进程
(2)多进程实现宏观上的并行
3.4.4.2、fork的内部原理
(1)进程的分裂生长模式。如果操作系统需要一个新进程来运行一个程序,那么操作系统会用一个现有的进程来复制生成一个新进程。老进程叫父进程,复制生成的新进程叫子进程。
(2)fork的演示
代码:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t p1 = -1;
p1 = fork(); //fork 函数返回 2 次 : 等于0 是子进程, 大于0是父进程
if(0 == p1)
{
/* 这里一定是 子进程 */
}
if (p1 > 0)
{
/* 这里一定是 父进程 */
}
if (p1 < 0)
{
/* 这里一定是 fock出错了 */
}
/* 在这里 所做的 操作, 父进程和 子进程 都有的,所以会打印 两次 printf */
printf("hello word, pid = %d \n",getpid()); //getpid() 打印进程 ID 号
return 0;
}
(3)fork函数调用一次会返回2次,返回值等于0的就是子进程,而返回值大于0的就是父进程。
运行结果:
(4)典型的使用fork的方法:使用fork后然后用if判断返回值,并且返回值大于0时就是父进程,等于0时就是子进程。
代码:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t p1 = -1;
p1 = fork(); //fork 函数返回 2 次 : 等于0 是子进程, 大于0是父进程
if(0 == p1)
{
/* 这里一定是 子进程 */
printf(" 子进程 hello word, pid = %d \n",getpid()); //getpid() 打印进程 ID 号
printf("子进程 : 你好 \n");
}
if (p1 > 0)
{
/* 这里一定是 父进程 */
printf(" 父进程 hello word, pid = %d \n",getpid()); //getpid() 打印进程 ID 号
}
if (p1 < 0)
{
/* 这里一定是 fock出错了 */
}
/* 在这里 所做的 操作, 父进程和 子进程 都有的,所以会打印 两次 printf */
//printf("hello word, pid = %d \n",getpid()); //getpid() 打印进程 ID 号
return 0;
}
运行结果:
(5)fork的返回值在子进程中等于0,在父进程中等于本次fork创建的子进程的进程ID。
代码:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t p1 = -1;
p1 = fork(); //fork 函数返回 2 次 : 等于0 是子进程, 大于0是父进程
if(0 == p1)
{
/* 这里一定是 子进程 */
printf("子进程 的 父进程id = %d \n",getppid());
printf(" 子进程 hello word, pid = %d \n",getpid()); //getpid() 打印进程 ID 号
printf("子进程 : 你好 \n");
}
if (p1 > 0)
{
/* 这里一定是 父进程 */
printf(" 父进程 hello word, pid = %d \n",getpid()); //getpid() 打印进程 ID 号
printf("父进程 p1 = %d \n",p1);
}
if (p1 < 0)
{
/* 这里一定是 fock出错了 */
}
/* 在这里 所做的 操作, 父进程和 子进程 都有的,所以会打印 两次 printf */
//printf("hello word, pid = %d \n",getpid()); //getpid() 打印进程 ID 号
return 0;
}
运行结果:
fork 建立成功以后,
子进程 和 父进程都是一个独立的个体
子进程也有单独的 PCB结构体
子进程、和父进程都会 被调度系统 调用
代码:来自朱老师物联网大讲堂