os实训课程模拟考试(8~13)

news2025/1/9 1:38:58

基于信号量的进程间通信

信号量IPC操作考查

编程要求

根据提示,在右侧编辑器补充代码,了解OpenEuler系统如何使用信号量进行IPC通信,代码中先用sem_read_array[]数组存储数据,并进行信号量与数据的输出,我们需要补充代码使用semctl函数输出一样的数据。

#include <errno.h>
 #define MAX_SEMAPHORES  5
#include <stdio.h>
 #include <sys/types.h>
 #include <sys/sem.h>
 #include <errno.h>
 #include <stdlib.h>   //以使用exit函数
 #define MAX_SEMAPHORES  5
 int main(int argc,char *argv[])
{
    int i, ret, semid;
    unsigned short sem_array[MAX_SEMAPHORES];
    unsigned short sem_read_array[MAX_SEMAPHORES];

    union semun
    {
            int val;
            struct semid_ds *buf;
            unsigned short *array;
    } arg;
    semid = semget( IPC_PRIVATE, MAX_SEMAPHORES,IPC_CREAT | 0666 );

    if (semid != -1)

    {
        for ( i = 0 ; i < MAX_SEMAPHORES ; i++ )
        {
            sem_array[i] = (unsigned short)(i+1);
        }
        arg.array = sem_array;
        ret = semctl( semid, 0, SETALL, arg);
        if (ret == -1) 
            printf("SETALL failed (%d)\n", errno);
        arg.array = sem_read_array;
        ret = semctl( semid, 0, GETALL, arg );
        if (ret == -1) 
            printf("GETALL failed (%d)\n", errno);
        for ( i = 0 ; i < MAX_SEMAPHORES ; i++ )
        {
           printf("Semaphore %d, value %d\n", i, sem_read_array[i] );

        }


    for (i = 0; i < MAX_SEMAPHORES; i++) {  
    union semun getval_arg;  
    // 注意:getval_arg.val 在这里不需要设置,因为 GETVAL 不使用它  
    int sem_value = semctl(semid, i, GETVAL, getval_arg);  
    if (sem_value == -1) {  
        printf("GETVAL for semaphore %d failed (%d)\n", i, errno);  
        exit(EXIT_FAILURE);  
    }  
    printf("Semaphore %d, value %d\n", i, sem_value);  
}


        ret = semctl( semid, 0, IPC_RMID );
    }
    else
        printf("Could not allocate semaphore (%d)\n", errno);
    return 0;
}

 记得引入<stdlib.h>包,以便使用exit函数

基于命名管道与信号的进程间通信

命名管道与信号IPC操作考查

编程思路

根据提示,在右侧编辑器补充代码,使用SIGPIPE信号进行记录,读通道关闭后写通道写入。首先子进程以读的方式打开管道,然后父进程以写的方式打开管道,父进程当即睡眠1秒,子进程关闭读管道,当父进程休眠完成后开始写入,会发出写入失败信号。

#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<signal.h>
#include<sys/types.h>

void handler(int sig)
{
    printf("sig=%d\n",sig);

}
int main(void)
{
    int j;
    signal(SIGPIPE,handler);//在reader中止之后写Pipe的时候发送
    unlink("FIFO");
    mkfifo("FIFO",0644);
    pid_t pid;
    pid=fork();
    if(pid==0)
    {
        /*子进程打开读管道,随后关闭管道*/
       int fd;
        fd = open("FIFO",O_RDONLY);
        close(fd);
    }
    else
    {
        /*父进程打开写通道,休眠1秒,尝试写入*/
        int fd;
        fd = open("FIFO",O_WRONLY);
        int ret;
        sleep(1);
         ret = write(fd,"heoolOpenEuler",14);
    }
}

 

Linux vi/vim编辑器

第1关:vi/vim基本用法

编程要求

本关任务是学会如何启动和退出vi/vim编辑器。

注意:在执行本关任务前,首先执行如下命令来初始化任务环境

  1. rm -fr /root/oldFile > /dev/null 2>&1
  2. rm -fr /root/.oldFile > /dev/null 2>&1
  3. echo "welcome to Vi/Vim" > /root/oldFile && echo "welcome to Vi/Vim" > /root/.oldFile

具体编程要求如下:

使用vi/vim编辑器查看当前目录下已存在文件oldFile,然后保存退出vi/vim编辑器;

rm -fr /root/oldFile > /dev/null 2>&1

rm -fr /root/.oldFile > /dev/null 2>&1

echo "welcome to Vi/Vim" > /root/oldFile && echo "welcome to Vi/Vim" > /root/.oldFile

vim oldFile

然后再使用:wq退出,测评即可

 

第2关:vi/vim工作模式切换 

编程要求

本关任务是学会如何使用vi/vim编辑器进行对文件编辑操作。

具体编程要求如下:

  1. 使用vi/vim编辑器在当前目录下打开一个新的文件newFile;
  2. 然后在文件中写入welcome to vi/vim字符串(注意不用输入换行操作);
  3. 保存并退出;

vim newFile 

首先进入的是命令模式,然后键盘按“i”进入输插模式,输入:

 welcome to vi/vim

键盘按 ESC退出插入模式,最后输入 

:wq

保存并退出,测评 

vi/vim命令模式

编程要求

本关任务是学会如何使用vi/vim编辑器在命令模式下对文件进行操作。

注意:在执行本关任务前,首先执行如下命令来初始化任务环境

  1. rm -fr /root/file.txt > /dev/null 2>&1
  2. echo "first" >> /root/file.txt
  3. echo "second" >> /root/file.txt
  4. echo "third" >> /root/file.txt
  5. echo "fourth" >> /root/file.txt
  6. echo "fifth" >> /root/file.txt

具体编程要求如下:

  1. 使用vi/vim编辑器打开当前目录下的file.txt文件;
  2. 删除当前文件第二行内容;
  3. 并将第一行内容复制到文件最后;
  4. 保存并退出;

rm -fr /root/file.txt > /dev/null 2>&1

echo "first" >> /root/file.txt

echo "second" >> /root/file.txt

echo "third" >> /root/file.txt

echo "fourth" >> /root/file.txt

echo "fifth" >> /root/file.txt

vim file.txt

然后将光标移到第二行,键盘按下dd,删除第二行 

 再将光标移回第一行,按下键盘yy复制第一行

 最后将光标移到最后一行,点击p粘贴

:wq 

测评

vi/vim底线命令模式 

编程要求

本关任务是学会在vi/vim底线命令模式下,将已打开文件的部分内容另存为一个文件,同时对当前文件中的本分内容进行替换操作。

注意:在执行本关任务前,首先执行如下命令来初始化任务环境

  1. rm -fr /root/oldFile.txt > /dev/null 2>&1
  2. echo "first old" >> /root/oldFile.txt
  3. echo "second old" >> /root/oldFile.txt
  4. echo "third old" >> /root/oldFile.txt
  5. echo "fourth old" >> /root/oldFile.txt
  6. echo "fifth old" >> /root/oldFile.txt

具体编程要求如下:

  1. 使用vi/vim编辑器打开当前目录下的oldFile.txt文件;
  2. 将文件第2-5行内容另存为oldFileCpy.txt文件;
  3. 将当前文件的所有old字符串替换为new字符串;
  4. 保存并退出;

rm -fr /root/oldFile.txt > /dev/null 2>&1

echo "first old" >> /root/oldFile.txt

echo "second old" >> /root/oldFile.txt

echo "third old" >> /root/oldFile.txt

echo "fourth old" >> /root/oldFile.txt

echo "fifth old" >> /root/oldFile.txt

vim oldFile.txt

 进入命令模式后输入

:2,5 w oldFileCpy.txt

 回车,此时文件已另存,接下来是字符串替换,输入

:1,$s/old/new/g

回车,最后使用:wq退出,测评 

读文件系统函数

read函数是系统调用从文件描述符fd指向的文件中,读取count个字节到buf中; 如果read成功,则返回读到的字节数,如果已达到结尾,则返回0,出错,返回-1 函数原型:

  1. //头文件
  2. #include <unistd.h>
  3. //原型
  4. ssize_t read(int fd, void *buf, size_t count);

参数说明:

  1. fd:文件描述符
  2. buf:保存读入信息的缓存
  3. count:要读取的字节数
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define rwmode 0
int main()
{
    int fd;
    char buffer[1024];
    int n;
    fd = open("/data/workspace/myshixun/case1/testFIle", rwmode);
    if (fd < 0)
    {
        printf("Open file error!\n");
        exit(1);
    }
    else
        printf("open testFIle ok!\n");
    //请使用read函数将其读入buffer中

    n = read(fd, buffer, sizeof(buffer) - 1);

    
    buffer[n] = '\0';
    printf("%s\n", buffer);
    close(fd);
    return 0;
}

 

写文件系统函数

write函数

write系统调用将buf所指向的缓冲区的count个字节内容写入fd指向的文件; 如果write成功,则返回写入的字节数,出错返回-1 函数原型:

  1. //头文件
  2. #include <unistd.h>
  3. ssize_t write(int fd, const void *buf, size_t count);

参数说明:

  1. fd:要写入的文件
  2. buf:要写入的信息所在的缓存
  3. count:要写入的字节数
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define resource_mode 0
#define destination_mode 0774
#define FILESIZE 1024

int main(int argc, char *argv[])
{
    int resource_fd, destination_fd;
    char buffer[FILESIZE], *p;
    int readbytes, writebytes;
    if (argc != 3)
    {
        printf("Usage:copy from resource file to destination file\n %s src_file dest_file\n", argv[0]);
        exit(0);
    }
    if ((resource_fd = open(argv[1], resource_mode)) == -1)
    {
        perror("Can't open source file");
        exit(0);
    }
    if ((destination_fd = creat(argv[2], destination_mode)) == -1)
    {
        perror("Can't create destination file");
        exit(0);
    }
    // 请使用read函数读取前1024字节的内容读到缓冲区buffer中
    while ((readbytes = read(resource_fd,buffer,FILESIZE))>0)
    {
        p = buffer;
        if ((readbytes == -1) && (errno != EINTR))
            break;
        else if (readbytes > 0)
        {
            // 请使用write函数读取到的前1024字节的内容写到目的文件中
            while ((writebytes = write(destination_fd,p,readbytes))>0)
            {
                if ((writebytes == -1) && (errno != EINTR))
                    break;
                else if (writebytes == readbytes)
                    break;
                else if (writebytes > 0)
                {
                    p += writebytes;
                    readbytes -= writebytes;
                }
            }
            if (writebytes == -1)
                break;
        }
    }
    close(resource_fd);
    close(destination_fd);
    return 0;
}

 

 进程基础操作

fork知识理解

fork函数后的的代码在子进程中也被执行,实际上其他代码也在子进程中,子进程执行位置为fork返回位置后,之前代码无法执行。

fork 理解步骤      

  step1、设由shell直接执行程序,生成了进程P。P执行完Part. A的所有代码。      

  step2、当执行到pid = fork();时,P启动一个进程Q,Q是P的子进程,和P是同一个程序的进程。Q继承P的所有变量、环境变量、程序计数器的当前值。      

  step3、在P进程中,fork()将Q的PID返回给变量pid,并继续执行Part. B的代码。                    step4、在进程Q中,将0赋给pid,并继续执行Part. B的代码。      

这里有三个点非常关键:      

  1、P执行了所有程序,而Q只执行了Part. B,即fork()后面的程序。(这是因为Q继承了P的PC-程序计数器)      

  2、Q继承了fork()语句执行时当前的环境,而不是程序的初始环境。      

  3、P中fork()语句启动子进程Q,并将Q的PID返回,而Q中的fork()语句不启动新进程,仅将0返回。

编程要求

根据提示,在右侧编辑器编写代码,通过一行输出代码,使得子进程和父进程的都输出"bey!",之间用空格隔开。

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
  /*请开始填写*/
  pid_t pid = fork();
  if(pid==0){
    printf("bye! ");
  }
  else{ 
    printf("bye! ");
  }

      return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1828650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据与人工智能在保险行业数字化转型中的应用

随着科技的快速发展&#xff0c;大数据和人工智能&#xff08;AI&#xff09;技术在保险行业中扮演着越来越重要的角色&#xff0c;推动了保险行业的数字化转型。通过收集和分析海量的用户数据&#xff0c;利用先进的人工智能算法&#xff0c;保险公司能够更准确地评估风险&…

消息队列-概述-JMS和AMQP

JMS和AMQP JMS是什么 JMS&#xff08;JAVA Message Service,java 消息服务&#xff09;是 Java 的消息服务&#xff0c;JMS 的客户端之间可以通过 JMS 服务进行异步的消息传输。JMS&#xff08;JAVA Message Service&#xff0c;Java 消息服务&#xff09;API 是一个消息服务…

docker desktop for mac os如何使用本地代理

在macbook上弄了个代理&#xff0c;然后按照网上所说的去配代理 然后测试下 docker pull busybox 结果无反应&#xff0c;超时。我去&#xff01;&#xff01;&#xff01; 鼓捣了半天&#xff0c;看了docker官网&#xff0c;问了chatgpt &#xff0c;按照它们所说的试了下也没…

IDEA导入项目报错java程序包不存在

如图文件结构&#xff0c;本来是在web-demo中操作&#xff0c;但是想导入一下其他模块&#xff0c;切换了项目文件的目录&#xff0c;发现需要重新对Tomcat等进行配置&#xff0c;配置好之后发现运行出现Java相关错误&#xff08;如下&#xff09;记录一下修正过程。 java: 程序…

中国最著名的起名大师颜廷利:父亲节与之相关的真实含义

今天是2024年6月16日&#xff0c;这一天被广泛庆祝为“父亲节”。在汉语中&#xff0c;“父亲”这一角色常以“爸爸”、“大大”&#xff08;da-da&#xff09;或“爹爹”等词汇表达。有趣的是&#xff0c;“爸爸”在汉语拼音中表示为“ba-ba”&#xff0c;而当我们稍微改变“b…

消息队列-概述-什么是消息队列

什么是消息队列 我们可以把消息队列看作是一个存放消息的容器&#xff0c;当我们需要使用消息的时候&#xff0c;直接从容器中取出消息供自己使用即可。由于队列 Queue 是一种先进先出的数据结构&#xff0c;所以消费消息时也是按照顺序来消费的。 参与消息传递的双方称为 生产…

c++20 规范, vs2019 , 头文件 <mutex> ,注释以及几个探讨

&#xff08;1 探讨一&#xff09; mutex 这个名称的来源是 mutual exclusion &#xff1a;互相排斥。 mutex 与 recursive_mutex 的数据成员的定义如下&#xff1a; 测试如下&#xff1a; 运行以下&#xff1a; 以及&#xff1a; &#xff08;2 探讨二&#xff09; recursive_…

Orange Pi AIpro:高性能AI开发板开箱体验及样例测试

文章目录 前言背景介绍产品介绍主要参数配置AI处理器——昇腾310 NPU模型训练预测加载resnet50模型真实动物测试虚拟动物测试 前言 随着人工智能和物联网技术的迅速发展&#xff0c;单板计算机&#xff08;Single Board Computer, SBC&#xff09;在创客和开发者社区中越来越受…

buuctf-findKey

exe文件 运行发现这个窗口,没有任何消息 32位 进入字符串就发现了flag{ 左边红色代表没有F5成功 我们再编译一下(选中红色的全部按p) LRESULT __stdcall sub_401640(HWND hWndParent, UINT Msg, WPARAM wParam, LPARAM lParam) {int v5; // eaxsize_t v6; // eaxDWORD v7; /…

1055 集体照(测试点3, 4, 5)

solution 从后排开始输出&#xff0c;可以先把所有的学生进行排序&#xff08;身高降序&#xff0c;名字升序&#xff09;&#xff0c;再按照每排的人数找到中间位置依次左右各一个进行排列测试点3&#xff0c; 4&#xff0c; 5&#xff1a;k是小于10的正整数&#xff0c;则每…

Spring5中IOC创建对象的方式(有参与无参)与时机(附三类无参创建代码供参考)

Spring5中IOC创建对象的方式(有参与无参)附三类无参创建代码供参考 1. IOC容器 IOC是Spring框架的核心内容&#xff0c;Spring容器使用多种方式完美的实现了IOC&#xff0c;可以使用XML配置&#xff0c;也可以使用注解&#xff0c;新版本的Spring也可以零配置实现IOC。 Spri…

嵌入式微处理器重点学习(三)

堆栈操作 R1=0x005 R3=0x004 SP=0x80014 STMFD sp!, {r1, r3} 指令STMFD sp!, {r1, r3}是一条ARM架构中的存储多个寄存器到内存的指令,这里用于将r1和r3寄存器的内容存储到栈上。STMFD(Store Multiple Full Descending)是一种全递减模式的多寄存器存储指令,它会先将栈指针…

流媒体传输协议HTTP-FLV、WebSocket-FLV、HTTP-TS 和 WebSocket-TS的详细介绍、应用场景及对比

一、前言 HTTP-FLV、WS-FLV、HTTP-TS 和 WS-TS 是针对 FLV 和 TS 格式视频流的不同传输方式。它们通过不同的协议实现视频流的传输&#xff0c;以满足不同的应用场景和需求。接下来我们对这些流媒体传输协议进行剖析。 二、传输协议 1、HTTP-FLV 介绍&#xff1a;基于 HTTP…

MySQL-创建表~数据类型

070-创建表 create table t_user(no int,name varchar(20),gender char(1) default 男);071-插入数据 语法格式&#xff1a; insert into 表名(字段名1, 字段名2, 字段名3,......) values (值1,值2,值3,......);insert into t_user(no, name, gender) values(1, Cupid, 男);字…

嵌入式门槛高不高,工资怎么样?

一般来说&#xff0c;嵌入式岗位的准入门槛其实并不是特别高。通常情况下&#xff0c;只要能够熟练掌握 C 语言编程以及单片机相关知识&#xff0c;就能够去制作一些较为简单的电子产品&#xff0c;由此可见其门槛相对而言是比较低的&#xff0c;相应的薪水可能也不会特别高。 …

【Kafka】Kafka提高生产者吞吐量、数据可靠性-06

【Kafka】Kafka提高生产者吞吐量-06 1. 提高生产者吞吐量2.数据可靠性2.1 回顾数据的发送流程2.2 ack应答级别2.2.1 acks:02.2.2 acks:12.2.2 acks:-1(all)2.2.2.1 数据可靠性分析2.2.2.2 数据完全可靠 2.3 可靠性总结2.4 可靠性代码配置 1. 提高生产者吞吐量 import org.apach…

[C++] vector list 等容器的迭代器失效问题

标题&#xff1a;[C] 容器的迭代器失效问题 水墨不写bug 正文开始&#xff1a; 什么是迭代器&#xff1f; 迭代器是STL提供的六大组件之一&#xff0c;它允许我们访问容器&#xff08;如vector、list、set等&#xff09;中的元素&#xff0c;同时提供一个遍历容器的方法。然而…

Vue26-内置指令03:v-cloak指令

一、需求 将引入本地JS的代码&#xff0c;换成引入外部JS&#xff0c;且引入的外部JS要等待5S。 【备注】&#xff1a;浏览器也能调节网速 二、js阻塞 <body>的最下方也能引入JS&#xff1a; 此时&#xff0c;用户能在5S内看到root容器未编译的部分。 解决该问题&#x…

工程设计问题---滚动轴承问题

参考文献&#xff1a; [1]李煜,梁晓,刘景森,等.基于改进平衡优化器算法求解工程优化问题[J/OL].计算机集成制造系统,1-34[2024-06-16].

高级人工智能复习 题目整理 中科大

题目整理 填空 1.准确性&#xff0c;复杂性&#xff0c;验证集 2. 3 2 n 3^{2^n} 32n 3 C 2 n m 3^{C^m_{2n}} 3C2nm​ 3 m 3^m 3m n 1 n1 n1 3. 状态 从状态s采取行动a后继续采用策略 π \pi π的收益 环境 4. 语法 语义 推理规则 5. 参与者&#xff0c;策略集&#xff…