2.2创建进程函数fork的使用(第二阶段)

2.2创建进程函数fork的使用(第二阶段)

使用fork函数创建一个进程
pid_t fork(void);

fork函数调用成功,返回两次
返回值为0,代表当前进程是子进程
返回值非负数,代表当前进程为父进程
调用失败,返回-1

代码展示

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

int main()
{
	pid_t pid;
	
	pid = getpid();
		
	printf("my pid is %d\n",pid);

	while(1);

	return 0;
}
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
	pid_t pid;
	
	pid = getpid();
		
	fork();
	
	printf("my pid is %d\n",pid);


	return 0;
}
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
	pid_t pid;
	
	pid = getpid();
		
	fork();
	
	printf("my pid is %d , current pro id:%d\n",pid,getpid());


	return 0;
}
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
	pid_t pid;
	pid_t pid2;	

	pid = getpid();
	
	printf("before fork:pid = %d\n",pid);
		
	fork();


	pid2 = getpid();
	
	printf("after fork:pid = %d\n",pid2);
	
	
	if(pid == pid2){

		printf("this is father print\n");
	}else{

		printf("this is child print,child pid = %d\n",getpid());
	}


	return 0;
}
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
	pid_t pid;
	pid_t pid2;	

	printf("father id:%d\n",getpid());

	pid = fork();
	
	
	if(pid > 0){

		printf("this is father print:%d\n",getpid());
	}else if(pid == 0){

		printf("this is child print,child pid = %d\n",getpid());//当pid等于0时为子进程
	}


	return 0;
}
课题任务描述 1.1 设计的目的和意义 本课题旨在深入探究Linux操作系统下进程间通信(IPC)的核心机制,掌握管道、消息队列及信号的协同使用方法,提升嵌入式Linux系统编程的实践能力。进程间通信是操作系统并发编程的基础,广泛应用于服务器开发、嵌入式系统等领域,其中管道适用于有血缘关系进程的轻量通信,消息队列满足无血缘关系进程的结构化数据传输需求,信号则为进程间提供高效的异步通知方式。 当前,Linux系统在工业控制、智能设备等场景中应用广泛,掌握多机制协同的进程通信技术,能够解决实际开发中“数据传输”“状态同步”“资源回收”等核心问题。本课题通过实现有血缘/无血缘进程的双向通信,强化系统调用的灵活运用与异常处理思维,为后续复杂系统开发奠定基础,具有重要的实践价值与应用意义。 1.2 主要内容 本项目设计开发的核心内容主要包括以下方面: (1)明确实验需求与技术选型,确定基于管道、消息队列、信号的混合通信方案,规划有血缘/无血缘进程的通信流程。 (2)基础环境搭建,包括Ubuntu系统配置、Vim编辑器使用、GCC编译器调试,确保开发环境满足编译与运行要求。 (3)软件架构设计,划分信号处理模块、有血缘进程通信模块、无血缘进程通信模块、异常处理模块,明确各模块的功能边界与交互逻辑。 (4)程序开发与编码,基于C语言编写核心代码,实现管道创建与读写、消息队列创建与销毁、信号注册与处理、进程创建与资源回收等功能。 (5)系统调试与测试,验证通信功能完整性、时序正确性、异常处理有效性,确保程序无报错、无僵尸进程残留。 (6)优化与完善,针对调试中发现的同步冲突、资源泄漏等问题,优化代码逻辑,提升程序健壮性与稳定性。 1.3 报告的结构 第1章:课题任务描述,阐述研究背景、设计目的、主要内容与报告结构,明确课题核心目标。 第2章:课题的核心技术,介绍开发工具、硬件环境、核心通信协议(机制)的原理与应用,为系统实现提供技术支撑。 第3章:功能设计,搭建系统总体架构,绘制程序流程图,明确各模块的设计思想与实现路径。 第4章:程序(系统)详细设计,描述核心模块的代码实现逻辑,展示关键代码片段,说明功能实现细节。 第5章:程序测试,明确测试目的、测试用例与测试方法,呈现测试结果,验证系统是否满足设计要求。 第6章:分析与讨论,总结课题解决的核心问题,分析现有方案的不足,提出未来优化方向。 第7章:结束语,对课题设计与实现过程进行全面总结,提炼经验教训。 2. 课题的核心技术 2.1 开发工具与硬件配置清单 2.1.1 项目开发和测试工具 (1)Ubuntu操作系统:基于Linux内核的开源操作系统,提供完善的命令行环境与系统调用支持,是Linux编程的标准开发平台。其内置的进程管理、文件系统、IPC机制,能够精准模拟实际运行场景,确保程序的兼容性与可移植性。 (2)Vim编辑器:Linux环境下的高效文本编辑器,支持语法高亮、多窗口编辑、快捷键操作,能够快速完成代码编写与修改。通过配置相关插件,可提升代码可读性与编辑效率,适配C语言开发需求。 (3)GCC编译器:GNU编译器集合,支持C语言等多种编程语言的编译、链接与优化。能够将源代码转换为可执行程序,同时提供错误提示、警告信息,帮助开发者定位语法错误与逻辑问题,是Linux编程的核心编译工具。 (4)终端工具:Ubuntu系统自带的命令行终端,用于执行文件创建、目录切换、编译运行、进程查看等操作,是开发与调试的核心交互界面。通过 ps   kill 等命令,可实时监控进程状态,辅助解决僵尸进程进程阻塞等问题。 2.1.2 系统主要硬件组成 (1)计算机主机:作为开发与运行载体,需满足Ubuntu系统运行要求,具备基本的CPU运算能力与内存容量,确保进程创建、通信等操作的流畅执行。 (2)键盘与显示器:用于代码编写、命令输入、运行结果查看,是人机交互的核心硬件设备。 表 2-1 硬件清单 表格 硬件名称 作用 计算机主机 运行Ubuntu系统,承载程序开发、编译与运行 键盘 输入命令、编写代码 显示器 显示编辑内容、程序运行结果、调试信息 2.2 调试及开发中的通信协议及用处 2.2.1 管道(Pipe)机制 管道是Linux中最基础的IPC机制,本质是内核维护的临时缓冲区,采用“半双工”通信模式,仅支持有血缘关系进程(父子、兄弟进程)间通信。通过 pipe() 系统调用创建两个文件描述符: pipe_fd[0] (读端)和 pipe_fd[1] (写端),子进程继承父进程的文件描述符表,关闭无关端后即可实现单向数据传输。 管道的核心优势是简单高效、无需手动销毁(进程退出后内核自动释放资源),适用于数据量小、通信频繁的有血缘进程场景。本课题中,管道用于父子进程的双向数据交互,配合信号机制解决“读-写”时序同步问题。 2.2.2 消息队列(Message Queue)机制 消息队列是System V IPC的核心机制,本质是内核中的结构化消息链表,通过唯一键值(key)标识,支持无血缘关系进程间通信。其核心特性包括:结构化存储(消息包含类型字段)、可按类型读取、非阻塞通信支持,无需进程同步等待。 通过 ftok() 生成键值、 msgget() 创建队列、 msgsnd() 发送消息、 msgrcv() 接收消息、 msgctl() 销毁队列,完成全生命周期管理。消息队列的优势是解耦进程依赖、支持大数据量传输,本课题中用于无血缘进程的结构化消息交互,通信结束后手动销毁队列避免内核资源泄漏。 2.2.3 信号(Signal)机制 信号是Linux进程间异步通知的核心方式,用于传递“事件发生”的消息(如进程终止、用户自定义通知)。本课题选用 SIGUSR1 和 SIGUSR2 两个用户自定义信号,分别用于“数据写入完成通知”和“数据读取完成通知”,配合 signal() 函数注册自定义处理函数,实现进程间的时序同步。 信号机制的优势是响应快速、无需轮询,能够精准解决管道与消息队列通信中的“读-写”阻塞问题,确保进程按预期流程执行。此外,通过 SIGCHLD 信号处理函数,可自动回收子进程资源,避免僵尸进程产生。 3. 功能设计 3.1 系统总体架构 本系统采用模块化设计思想,以Linux系统调用为基础,构建“信号处理-通信执行-异常处理”的三层架构,核心包括四大功能模块,系统整体框架如图3-1所示。 系统整体框架图 图3-1 系统整体框架图 (1)核心控制层:以 main() 函数为入口,负责模块调用、全局信号注册、程序流程控制,协调各模块按顺序执行通信任务。 (2)信号处理模块:注册 SIGUSR1 (读通知)、 SIGUSR2 (写完成通知)、 SIGCHLD (子进程回收)信号的处理函数,实现进程间同步与资源回收。 (3)有血缘进程通信模块:通过 pipe() 创建管道、 fork() 生成子进程,实现“父写子读”的3次循环通信,依赖信号机制解决时序问题。 (4)无血缘进程通信模块:通过消息队列实现独立进程的3次循环通信,通信结束后销毁队列,同样依赖信号机制同步。 (5)异常处理模块:对 pipe()   fork()   msgsnd() 等系统调用的返回值进行校验,处理 errno 错误(如管道读写失败、消息队列满),通过 kill() 终止关联进程避免资源泄漏。 3.2 程序流程图 系统上电(程序启动)后,首先进行全局初始化(信号注册、变量初始化),随后依次执行有血缘进程通信、无血缘进程通信,所有任务完成后程序正常退出。具体流程如图3-2所示。 程序总体流程图 图3-2 程序总体流程图 有血缘进程通信子流程: 1. 创建管道→fork生成子进程→父进程关闭读端、子进程关闭写端; ​ 2. 父进程写入数据→发送 SIGUSR1 通知子进程→等待 SIGUSR2 ; ​ 3. 子进程接收 SIGUSR1 →读取管道数据→发送 SIGUSR2 通知父进程; ​ 4. 循环3次后,关闭管道→父进程回收子进程资源→通信完成。 无血缘进程通信子流程: 1.  ftok() 生成键值→ msgget() 创建消息队列→fork生成写进程→写进程fork生成读进程; ​ 2. 写进程写入消息→发送 SIGUSR1 通知读进程→等待 SIGUSR2 ; ​ 3. 读进程接收 SIGUSR1 →读取消息→发送 SIGUSR2 通知写进程; ​ 4. 循环3次后,写进程销毁消息队列→回收进程资源→通信完成。请你生成第三部分功能设计的图
最新发布
12-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值