1> 使用文件IO完成,将源文件中的所有内容进行加密(大写转小写、小写转大写)后写入目标文件中,源文件内容不变
代码:
#include<myhead.h>
void encrypt_file(const char *src_file, const char *dst_file)
{
// 打开源文件和目标文件,获取文件描述符
int src_fd = open(src_file, O_RDONLY);
int dst_fd = open(dst_file, O_WRONLY | O_CREAT | O_TRUNC, 0664);
char buffer[128] = ""; // 缓冲区,用于存储读取的数据
ssize_t bytes_read = 0; // 记录每次读取的字节数
// 检查文件是否成功打开
if (src_fd == -1 || dst_fd == -1)
{
perror("打开文件时出错\n");
return ;
}
// 循环读取源文件内容,直到文件末尾
while ((bytes_read = read(src_fd, buffer, sizeof(buffer))) > 0)
{
// 遍历缓冲区中的每个字符,进行加密处理
for (ssize_t i = 0; i < bytes_read; i++)
{
if (buffer[i]<='Z'&&buffer[i]>='A')
{
buffer[i] += 32; // 大写字母转小写
}
else if (buffer[i]<=122&&buffer[i]>=97)
{
buffer[i] -= 32; // 小写字母转大写
}
// 非字母字符保持不变
}
// 将加密后的数据写入目标文件
write(dst_fd, buffer, bytes_read);
}
printf("加密成功!\n");
// 关闭文件描述符
close(src_fd);
close(dst_fd);
}
int main(int argc, char *argv[])
{
// 检查命令行参数数量是否正确
if (argc != 3)
{
fprintf(stderr, "使用方法: %s <源文件> <目标文件>\n", argv[0]);
return -1;
}
const char *src_file = argv[1]; // 源文件路径
const char *dst_file = argv[2]; // 目标文件路径
// 调用加密文件函数,进行文件加密操作
encrypt_file(src_file, dst_file);
return 0; // 程序正常退出
}
运行结果:
2> 查资料了解以下概念:
并发和并行的区别
答:并发指的是多个任务或操作在同一时间段内同时发生或进行,但这些任务或操作可能并不是在同一时刻开始或结束的。在C语言中,并发通常通过多线程或多进程来实现。例如,可以使用POSIX线程库(pthread)来创建和管理多个线程,从而实现并发操作。并发的关键在于对资源的有效管理和调度,以确保多个任务能够高效地共享计算资源。
并行则指的是多个任务或操作在同一时刻同时进行。在C语言中,并行通常涉及利用多核处理器或多台计算机来同时执行不同的任务。例如,可以使用OpenMP等并行编程框架来简化并行编程的复杂性。并行的关键在于将任务分解为可以同时执行的子任务,并充分利用可用的计算资源来提高性能。
什么是进程
答:C语言和计算机科学中,进程是操作系统中进行资源分配和调度的基本单位。每个进程都拥有自己独立的内存空间和系统资源,包括代码、数据和系统资源(如文件、管道等)。进程之间是相互独立的,一个进程无法直接访问另一个进程的内存空间和资源。
进程通常由程序、数据和进程控制块(PCB)三部分组成。其中,程序描述了进程需要完成的功能;数据是程序执行时需要处理的数据信息;而PCB则用于记录进程的当前状态信息,如进程标识符、进程状态、寄存器状态、程序计数器等。
进程和程序的区别
答:程序是一组指令的集合,它描述了计算机应该执行的操作序列。程序是静态的,它本身并不执行任何操作,只是包含了执行操作所需的所有指令。程序通常以文件的形式存储在磁盘上,可以被加载到内存中并由处理器执行。
而进程是程序的一个执行实例,是程序在运行时的动态表现。每个进程都拥有自己独立的内存空间和系统资源,包括代码、数据和系统资源(如文件、管道等)。当程序被加载到内存中并开始执行时,它就变成了一个进程。进程是动态的,它包含了程序计数器、寄存器状态、堆栈和内存等信息,这些信息描述了进程当前的状态和执行环境。
总的来说,程序是静态的指令集合,而进程是程序在运行时的动态实例。在C语言中,我们通过编写程序来定义需要执行的操作,然后通过创建进程来实际执行这些操作。需要注意的是,同一个程序可以同时创建多个进程,这些进程可以并发或并行地执行。
进程的状态有哪些
答:
-
新建态(New):进程刚被创建,但还未被放入就绪队列中等待执行。此时,操作系统需要完成一些初始化工作,如分配必要的系统资源等。
-
就绪态(Ready):进程已经准备好被执行,并已被放入就绪队列中等待调度。一旦获得处理器资源,该进程即可进入运行状态。
-
运行态(Running):进程正在处理器上执行。在单处理器系统中,同一时刻只能有一个进程处于运行状态;而在多处理器系统中,则可能有多个进程同时运行。
-
阻塞态(Blocked)或等待态(Waiting):进程因等待某个事件的发生(如I/O操作完成、信号量等待等)而暂时不能执行。此时,进程会被从就绪队列中移除,并放入相应的阻塞队列中。当等待的事件发生时,进程会重新进入就绪队列。
-
终止态(Terminated):进程执行完毕或因某种原因被终止。此时,系统需要回收该进程所占用的资源,并将其从系统中移除。
系统中的多个进程的调度机制都有哪些
答:
-
先来先服务(FCFS)调度:这是一种最简单的调度算法,它按照进程到达的顺序进行调度。即先到达的进程先执行,后到达的进程后执行。这种调度方式简单、公平,但可能导致后到达的短进程等待时间过长。
-
短作业优先(SJF)调度:这种调度算法优先选择执行时间最短的进程来执行。它有助于减少平均等待时间,但可能导致长进程长时间得不到执行,出现“饥饿”现象。同时,由于需要预知进程的执行时间,这在实际应用中可能难以实现。
-
优先级调度:在这种调度机制中,每个进程都被赋予一个优先级。调度器根据优先级来选择下一个要执行的进程。高优先级的进程将优先于低优先级的进程执行。这种调度方式灵活,可以根据需要调整进程的优先级,但也可能导致低优先级的进程长时间得不到执行。
-
轮转调度(RR):这是一种基于时间片的调度算法。每个进程被分配一个固定的时间片,当时间片用完时,当前进程被挂起,调度器选择下一个进程执行。这种调度方式有助于实现进程的公平执行,但可能导致进程切换的开销较大。
-
多级队列调度:在这种调度机制中,存在多个就绪队列,每个队列具有不同的优先级和服务规则。进程可以根据其特性和需求被分配到不同的队列中。这种调度方式结合了优先级调度和轮转调度的优点,但实现复杂度较高。
3> 思维导图