I/O作业3

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语言中,我们通过编写程序来定义需要执行的操作,然后通过创建进程来实际执行这些操作。需要注意的是,同一个程序可以同时创建多个进程,这些进程可以并发或并行地执行。

进程的状态有哪些

答:

  1. 新建态(New):进程刚被创建,但还未被放入就绪队列中等待执行。此时,操作系统需要完成一些初始化工作,如分配必要的系统资源等。

  2. 就绪态(Ready):进程已经准备好被执行,并已被放入就绪队列中等待调度。一旦获得处理器资源,该进程即可进入运行状态。

  3. 运行态(Running):进程正在处理器上执行。在单处理器系统中,同一时刻只能有一个进程处于运行状态;而在多处理器系统中,则可能有多个进程同时运行。

  4. 阻塞态(Blocked)或等待态(Waiting):进程因等待某个事件的发生(如I/O操作完成、信号量等待等)而暂时不能执行。此时,进程会被从就绪队列中移除,并放入相应的阻塞队列中。当等待的事件发生时,进程会重新进入就绪队列。

  5. 终止态(Terminated):进程执行完毕或因某种原因被终止。此时,系统需要回收该进程所占用的资源,并将其从系统中移除。

系统中的多个进程的调度机制都有哪些

答:

  1. 先来先服务(FCFS)调度:这是一种最简单的调度算法,它按照进程到达的顺序进行调度。即先到达的进程先执行,后到达的进程后执行。这种调度方式简单、公平,但可能导致后到达的短进程等待时间过长。

  2. 短作业优先(SJF)调度:这种调度算法优先选择执行时间最短的进程来执行。它有助于减少平均等待时间,但可能导致长进程长时间得不到执行,出现“饥饿”现象。同时,由于需要预知进程的执行时间,这在实际应用中可能难以实现。

  3. 优先级调度:在这种调度机制中,每个进程都被赋予一个优先级。调度器根据优先级来选择下一个要执行的进程。高优先级的进程将优先于低优先级的进程执行。这种调度方式灵活,可以根据需要调整进程的优先级,但也可能导致低优先级的进程长时间得不到执行。

  4. 轮转调度(RR):这是一种基于时间片的调度算法。每个进程被分配一个固定的时间片,当时间片用完时,当前进程被挂起,调度器选择下一个进程执行。这种调度方式有助于实现进程的公平执行,但可能导致进程切换的开销较大。

  5. 多级队列调度:在这种调度机制中,存在多个就绪队列,每个队列具有不同的优先级和服务规则。进程可以根据其特性和需求被分配到不同的队列中。这种调度方式结合了优先级调度和轮转调度的优点,但实现复杂度较高。

3> 思维导图

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值