fork函数小东西

    刚开始学进程、看到例程就自己也想到了一个,敲出来后运行下、和预想的一样;

    除了书本没有什么师傅的弱菜忍不住赶紧来卖弄一下,上代码:



子进程负责随机生成100个字符;

父进程负责将这100个字符重新输出到另外一个文件中、同时将其中的小写字符变成大写字符:

#include"sys/types.h"
#include"sys/wait.h"
#include"unistd.h"
#include"stdio.h"
#include"stdlib.h"
#include"math.h"


int main()
{
	pid_t pid;
	char *message;
	int exit_code;

	printf("fork program starting\n");
	pid = fork();

	if(pid != 0 && pid != -1){
		int stat_val;
		pid_t child_pid;

		child_pid = wait(&stat_val);

		printf("Child has finished: PID = %d\n", child_pid);
		if(WIFEXITED(stat_val))
			printf("Child has finished: PID = %d\n", WEXITSTATUS(stat_val));
		else
			printf("Child terminated abnormally\n");
	}

	if(pid == -1){
		perror("fork failed");
		exit(1);
	}
	else if(!pid){
		int i,temp;
		FILE *write;

		srand((int)time(0));
		write = fopen("/home/hello/c++_test/hehe", "w");

		for(i = 0; i < 100; i++){
			temp = abs( rand() ) % 127;
			fprintf(write, "%c", temp);
		}
		(void)fclose(write);

		exit_code = 36;
	}
	else{
		int i;
		char ch;
		FILE *input, *output;

		input = fopen("/home/hello/c++_test/hehe", "r");
		output = fopen("/home/hello/c++_test/hehe2", "w");

		while((ch = fgetc(input)) != EOF){
			if('a' <= ch && ch <= 'z')	ch-=32;
			fprintf(output, "%c", ch);
		}

		(void)fclose(input);
		(void)fclose(output);

		exit_code = 0;
		printf("ok~\n");
	}

	exit(exit_code);
}


<think>好的,我需要帮助用户了解学习C语言所需的知识点,并以思维导图的形式展示学习路线。首先,回顾用户之前的对话,用户询问了关于C语言结构体的教程和常见问题,现在他想知道C语言的整体学习路径,并希望用思维导图来展示知识点。 用户提到了站内引用[1]和[2],其中引用[1]讨论了C和C++的区别,但用户现在明确需要的是C语言的知识点,所以可能需要忽略C++部分,专注于C语言的核心内容。引用[2]提到了man手册的使用,这可能属于开发工具或调试部分的知识点。 接下来,我需要整理C语言的主要学习模块,从基础到高级,涵盖语法、核心概念、开发工具、实际应用等。需要确保结构清晰,层次分明,适合思维导图的展示。 首先,基础部分应包括环境搭建、基础语法、流程控制、函数和数组。这些是入门必须掌握的内容。然后核心知识点涉及指针、结构体、动态内存管理、文件操作和预处理器,这些都是C语言的重点和难点。 高级部分可以考虑模块化编程、数据结构、算法、系统编程和跨平台开发,帮助用户进阶学习。开发工具部分需要包括编译器、调试工具、构建工具和版本控制,这些都是实际开发中必不可少的技能。 最后,学习建议和资源推荐能帮助用户规划学习路径,并提供参考资料。需要注意将之前提到的结构体内容(如内存对齐、自引用结构体)整合到核心知识点中,保持连贯性。 需要检查是否有遗漏的重要知识点,比如标准库函数、内存模型、错误处理等。同时,确保思维导图的每个分支都有逻辑关联,便于用户理解和记忆。可能还需要考虑用户的实际应用场景,如嵌入式开发或系统编程,适当强调相关知识点。 最后,生成相关问题时要针对思维导图的各个部分,帮助用户深入学习和解决可能遇到的困难。</think>### C语言学习路线思维导图(文字版) ``` C语言知识体系 ├─ 基础篇 │ ├─ 1. 开发环境搭建 │ │ ├─ GCC编译器安装 │ │ ├─ IDE配置(VSCode/CLion) │ │ └─ 调试工具(gdb) │ ├─ 2. 基础语法 │ │ ├─ 数据类型(int/float/char) │ │ ├─ 运算符与表达式 │ │ └─ 输入输出函数(printf/scanf)[^2] │ ├─ 3. 流程控制 │ │ ├─ 条件语句(if-else) │ │ ├─ 循环结构(for/while) │ │ └─ 跳转语句(break/continue/goto) │ ├─ 4. 函数 │ │ ├─ 函数声明与定义 │ │ ├─ 参数传递机制 │ │ └─ 递归函数实现 │ └─ 5. 数组与字符串 │ ├─ 一维/多维数组 │ ├─ 字符数组操作 │ └─ 常用字符串函数(strlen/strcpy) ├─ 核心篇 │ ├─ 1. 指针精要 │ │ ├─ 指针运算与地址操作 │ │ ├─ 指针与数组关系 │ │ └─ 函数指针应用 │ ├─ 2. 结构体与联合体 │ │ ├─ 内存对齐原理[^1] │ │ ├─ 自引用结构体设计[^2] │ │ └─ 位域使用场景 │ ├─ 3. 动态内存管理 │ │ ├─ malloc/free原理 │ │ ├─ 内存泄漏检测 │ │ └─ 柔性数组应用 │ ├─ 4. 文件操作 │ │ ├─ 文件打开模式(r/w/a) │ │ ├─ 文本与二进制模式 │ │ └─ 文件定位操作 │ └─ 5. 预处理器 │ ├─ 宏定义技巧 │ ├─ 条件编译 │ └─ #pragma指令 ├─ 高级篇 │ ├─ 1. 模块化编程 │ │ ├─ 头文件设计 │ │ ├─ 静态链接库 │ │ └─ 动态链接库 │ ├─ 2. 数据结构 │ │ ├─ 链表实现 │ │ ├─ 栈与队列 │ │ └─ 二叉树基础 │ ├─ 3. 系统编程 │ │ ├─ 进程控制(fork/exec) │ │ ├─ 信号处理 │ │ └─ 多线程开发 │ └─ 4. 跨平台开发 │ ├─ 条件编译控制 │ ├─ 平台相关特性 │ └─ Makefile编写 ├─ 开发工具 │ ├─ 1. 编译器进阶 │ │ ├─ 编译过程解析 │ │ ├─ 优化选项(-O2) │ │ └─ 静态代码分析 │ ├─ 2. 调试技巧 │ │ ├─ GDB核心命令 │ │ ├─ Valgrind检测 │ │ └─ 核心转储分析 │ └─ 3. 工程管理 │ ├─ Makefile编写 │ ├─ CMake使用 │ └─ Git版本控制 └─ 学习建议 ├─ 1. 学习路径 │ ├─ 基础语法 → 指针 → 数据结构 → 系统编程 │ └─ 项目驱动学习 ├─ 2. 推荐书籍 │ ├─ 《C Primer Plus》 │ └─ 《C陷阱与缺陷》 └─ 3. 实践项目 ├─ 学生管理系统 ├─ 简单Shell实现 └─ 内存池设计 ``` ### 知识图谱说明 1. **内存管理核心**:通过指针理解$sizeof(int*)$在不同系统的差异,掌握内存地址的十六进制表示法 2. **复合数据类型**:结构体内存对齐计算遵循: $$总大小 = \sum(成员大小) + 填充字节$$ 如: ```c struct Example { char c; // 1字节 int i; // 4字节(需要3字节填充) }; // 总大小=8字节 ``` 3. **系统调用**:使用`man 2 open`查看系统调用手册页[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值