当前位置: 首页 > news >正文

fork系统调用

基本概念:

在操作系统里,进程是正在运行的程序的实例。fork() 函数的作用是复制当前进程,生成一个新的进程,这个新进程被称作子进程,而原本的进程则是父进程。这两个进程(父进程和子进程)会从 fork() 调用处开始,并发执行后续代码。

使用 fork() 创建子进程时:

        代码段:父子进程共享,因其只读,可节省内存。

        内存:初始时数据段、堆、栈物理页共享;有写操作时,执行写操作的进程会复制物理页,保证进程数据独立。

头文件:

#include <sys/types.h>
#include <unistd.h>

函数原型:

pid_t fork(void);

返回类型:

        子进程为0;父进程中为子进程ID

        出错为-1 

示例:

#include <iostream>
#include <sys/types.h>
#include <unistd.h>

using namespace std;

// main函数启动,程序主进程
int main()
{
	// fork作用:创建新的子进程
	// 一次调用 ,两次返回
	pid_t pid = fork();

	if (pid == 0)
	{
		while (1)
		{
			cout << "I am a child process with PID: " << pid << " getpid=" << getpid() << endl;
			sleep(1);
		}
	}
	else if (pid > 0)
	{
		while (1)
		{
			cout << "I am a parent process with PID: " << pid << " getpid=" << getpid() << endl;
			sleep(1);
		}
	}

	return 0;
}

注意事项:

        资源复制fork() 会复制父进程的大部分资源,例如内存空间、文件描述符等。这可能会带来较大的开销。

        僵尸进程和孤儿进程:若子进程先于父进程结束,且父进程没有正确处理子进程的退出状态,子进程会变成僵尸进程;若父进程先结束,子进程会变成孤儿进程,被 init 进程(进程 ID 为 1)收养。

相关文章:

  • 总结ExecutorService和CountDownLatch的作用、用法和场景
  • 第十四届蓝桥杯真题
  • 基于JavaWeb的图书管理系统(SSM框架)
  • 【AI学习】Transformer 模型
  • 【leetcode刷题记录】(java)数组 链表 哈希表
  • 高速电路中的存储器应用与设计一
  • 命名实体识别
  • nt!IopCompleteReques函数分析之IopUpdateOtherTransferCount和IopDequeueThreadIrp
  • 【Pandas】pandas Series to_excel
  • 串口USART
  • vue3中watch 函数参数说明
  • db_join连接语句
  • Ubuntu 22.04 安装向日葵远程控制
  • 电路租用和专线
  • [Linux]从零开始的STM32MP157 Linux内核移植
  • 只出现一次的数字
  • 为AI聊天工具添加一个知识系统 之150 设计重审 之15 完整方案及评估 之3
  • 【mybatis使用小知识合集持续更新】
  • 283.移动零解题记录
  • 深入解析 MyBatis-Plus 批量操作:原理、实现与性能优化
  • 泽连斯基表示将在土耳其“等候”普京
  • 四姑娘山一游客疑因高反身亡,镇卫生院:送到时已很严重
  • 印度外交秘书:印巴军方将于12日再次对话
  • 智利观众也喜欢上海的《好东西》
  • 涨知识|没想到吧,体育老师强调的运动恢复方法是错的?
  • 晶圆销量上升,中芯国际一季度营收增长近三成,净利增超1.6倍