fork的具体使用

本文详细介绍了`fork`系统调用,包括子进程如何完美复制父进程资源,子进程从fork后开始执行,通过返回值判断进程状态,以及父子进程地址空间独立和执行次序的不确定性。
摘要由CSDN通过智能技术生成
功能:创建一个进程
参数:无参
返回值:pid_t是int的别名,含义:
小于0,代表创建子进程失败,可以打印错误码查看原因
等于0,是在子进程中返回的
大于0,是在父进程中返回的,且含义为子进程的ID号(PID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
	pid_t pid =fork();
	if(pid < 0)
	{
		perror("创建失败\n");
		return -1;
	}
	if(pid ==0)
	{
		while(1)
		{
		printf("目前在子进程中\n");
		sleep(1);
		}
	}
	else
	{
		while(1)
		{
		printf("目前在父进程中\n");
		printf("子进程的PID是:%d \n",pid);
		sleep(1);
		}
	}
	return 0;
}

代码演示用fork系统调用,子进程和父进程空间是独立的

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
	int i=0;
	pid_t pid =fork();
	if(pid < 0)
	{
		perror("创建失败\n");
		return -1;
	}
	if(pid ==0)
	{
		while(1)
		{
			i++;
		printf("目前在子进程中\n");
		printf("子进程的i=%d\n",i);
		sleep(1);
		}
	}
	else
	{
		while(1)
		{
		printf("目前在父进程中\n");
		printf("父进程的i=%d\n",i);
		printf("子进程的PID是:%d \n",pid);
		sleep(1);
		}
	}
	return 0;
}

验证fork之前,子进程会悉数拷贝父进程的所有内容:fork之前父进程有的,子进程都会拷贝一份

总结fork()

fork 创建的子进程:
1 、会完美拷贝父进程中的所有资源(堆栈段,代码段,数据段 ...
2 、子进程从 fork 的下一句话开始,会存在父子进程,为了区分两个进程到底谁在执行?
--- 》通过返回值来判断:等于 0 (子进程在执行)。大于 0 (父进程在执行)
3 、子进程永远都是在 fork 的下一句开始执行的!(会用到 fork 之前父进程定义过的一些资源。)、
4 、父子进程的执行次序不确定的!
5 、父子进程的地址空间独立,互不影响,父子进程可以被 CPU 进行调度。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值