第十周预习报告

文章目录

  • 第十周预习报告
    • 学习内容
      • HeadFirstC第10章
        • 章节概述
        • 重点内容
        • 具体知识点详解
      • 对学习内容总结的反思
    • 思维导图
      • 基于 AI 的学习
      • 学习内容
        • 知识点1:进程间通信
          • 问答
        • 知识点2:管道通信
          • 问答
      • 学习实践过程遇到的问题与解决方式
      • 总结
      • 参考资料

第十周预习报告

学习内容

HeadFirstC第10章

章节概述

第10章主要介绍进程间通信的概念和技术,旨在教会读者如何控制运行中的进程、发送数据给其他进程、接收来自其他进程的数据,从而提高代码的功能性和灵活性。章节将详细介绍各种进程间通信的方法及其应用场景。

重点内容
  • 进程间通信的重要性
    • 进程间的协作与同步
    • 数据共享与传递
  • 进程控制
    • 控制子进程的执行
    • 使用信号控制进程
  • 输入输出重定向
    • 标准输入输出流的重定向
    • 文件描述符的操作
  • 管道通信
    • 管道的创建与使用
    • 父子进程之间的数据交换
  • 信号处理
    • 信号的定义与类型
    • 处理信号的方式
  • 多任务处理
    • 并发与并行的区别
    • 多线程与多进程的应用场景
  • 案例分析
    • 开启浏览器窗口显示网页
    • 使用信号处理异常情况
具体知识点详解
  1. 进程间通信的基础概念
  • 什么是进程间通信?
    • 进程间通信是指不同进程之间相互交流信息的过程。
  • 为什么需要进程间通信?
    • 不同进程可以独立运行,但为了协同工作,需要一种机制来共享数据和状态。
  1. 输入输出重定向
  • 标准输入输出流
    • 标准输入(stdin),标准输出(stdout),标准错误(stderr)
  • 重定向操作
    • 使用文件描述符进行重定向
    • 例如:<, >, >>用于重定向输入输出到文件
  1. 管道通信
  • 管道的创建
    • 使用pipe()系统调用来创建一个管道
  • 父子进程通信
    • 父进程向管道的一端写入数据
    • 子进程从另一端读取数据
  1. 信号处理
  • 信号的种类
    • 如SIGINT, SIGTERM, SIGKILL等
  • 信号处理函数
    • 注册信号处理器signal()
    • 处理特定信号的行为
  1. 多任务处理
  • 并发与并行
    • 并发指多个任务同时开始,但不一定同时结束
    • 并行指多个任务同时开始并且同时结束
  • 多线程与多进程
    • 多线程在同一进程中创建多个线程
    • 多进程创建多个独立的进程
  1. 案例分析
  • 打开浏览器窗口
    • 使用fork()创建子进程
    • 子进程调用execve()执行浏览器命令
  • 信号处理实例
    • 当收到特定信号时,执行相应的动作

对学习内容总结的反思

  1. 进程间通信的基础概念
  • 虽然提到了进程间通信的定义和重要性,但可以进一步详细解释不同类型的进程间通信(如管道、消息队列、共享内存等),以及它们各自的特点和适用场景。
  1. 输入输出重定向
  • 可以增加具体的代码示例,展示如何使用文件描述符进行重定向操作。
  1. 信号处理
  • 可以列出更多的信号类型及其含义,提供一些信号处理的最佳实践,例如如何避免信号处理函数中的竞态条件、如何确保信号处理函数的原子性等。

思维导图

进程间通信的重要性
数据共享与传递
进程间通信
基础概念
进程间的协作与同步
数据共享与传递
进程控制
控制子进程的执行
使用信号控制进程
输入输出重定向
标准输入输出流的重定向
文件描述符的操作
管道通信
管道的创建与使用
父子进程之间的数据交换
信号处理
信号的定义与类型
处理信号的方式
多任务处理
并发与并行的区别
多线程与多进程的应用场景
案例分析
开启浏览器窗口显示网页
使用信号处理异常情况

基于 AI 的学习

  • 至少找到自己理解不是太好的2个概念,让AI对自己进行苏格拉底提问

学习内容

知识点1:进程间通信
问答

AI: 你能解释一下进程间通信(IPC)的主要目的吗?

: 进程间通信的主要目的是允许不同进程之间共享数据和协调活动,从而实现更复杂的系统功能。

AI: 很好!那么,进程间通信有哪些常见的方法?

: 常见的进程间通信方法包括管道、信号、消息队列、共享内存、套接字等。

AI: 非常好!那么,每种方法的适用场景是什么?

:

  • 管道:适用于父子进程之间的简单通信,单向通信。
  • 信号:用于进程间的简单通知,如中断信号。
  • 消息队列:适用于进程间传递较复杂的消息,支持多进程读写。
  • 共享内存:适用于大量数据的快速共享,但需要额外的同步机制。
  • 套接字:适用于网络通信,支持跨主机的进程间通信。

AI: 你的回答很全面。总结一下:

  • 进程间通信的主要目的是允许不同进程之间共享数据和协调活动,从而实现更复杂的系统功能。
  • 常见的进程间通信方法包括管道、信号、消息队列、共享内存、套接字等。
  • 每种方法的适用场景:
    • 管道:适用于父子进程之间的简单通信,单向通信。
    • 信号:用于进程间的简单通知,如中断信号。
    • 消息队列:适用于进程间传递较复杂的消息,支持多进程读写。
    • 共享内存:适用于大量数据的快速共享,但需要额外的同步机制。
    • 套接字:适用于网络通信,支持跨主机的进程间通信。
知识点2:管道通信
问答

AI: 你能简要说明一下管道通信的基本步骤吗?

: 管道通信的基本步骤通常包括:创建管道、创建子进程、关闭不需要的管道端、父进程和子进程通过管道进行数据交换、关闭管道。

AI: 很好!那么,创建管道时需要注意什么呢?

: 创建管道时需要注意调用pipe()函数,并检查返回值以确保管道成功创建。

AI: 非常好!那么,关闭不需要的管道端有什么作用?

: 关闭不需要的管道端可以防止数据泄露和资源浪费,同时确保数据只能从一端写入,从另一端读取。

AI: 非常好!那么,父进程和子进程如何通过管道进行数据交换?

: 父进程通常通过管道的写端写入数据,子进程通过管道的读端读取数据。反之亦然,子进程也可以写入数据,父进程读取数据。

AI: 你的回答很全面。总结一下:

  • 管道通信的基本步骤通常包括:创建管道、创建子进程、关闭不需要的管道端、父进程和子进程通过管道进行数据交换、关闭管道。
  • 创建管道时需要注意调用pipe()函数,并检查返回值以确保管道成功创建。
  • 关闭不需要的管道端可以防止数据泄露和资源浪费,同时确保数据只能从一端写入,从另一端读取。
  • 父进程通常通过管道的写端写入数据,子进程通过管道的读端读取数据。反之亦然,子进程也可以写入数据,父进程读取数据。

学习实践过程遇到的问题与解决方式

  • 问题1:如何在C语言中创建和使用管道?

  • 解决方式:使用pipe()函数创建管道,然后通过read()和write()函数进行数据交互。

    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>int main() {int pipefd[2];char buf[30];if (pipe(pipefd) == -1) {perror("pipe");exit(EXIT_FAILURE);}pid_t pid = fork();if (pid == -1) {perror("fork");exit(EXIT_FAILURE);} else if (pid == 0) {  // 子进程close(pipefd[1]);   // 关闭写端read(pipefd[0], buf, sizeof(buf));printf("Child received: %s\n", buf);close(pipefd[0]);exit(EXIT_SUCCESS);} else {  // 父进程close(pipefd[0]);   // 关闭读端const char* msg = "Hello from parent";write(pipefd[1], msg, strlen(msg) + 1);close(pipefd[1]);wait(NULL);  // 等待子进程结束}return 0;
    }
    
  • 问题2:如何处理管道通信中的错误?

  • 解决方式:使用signal()函数注册信号处理器,当特定信号发生时,该函数会被调用。

    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>int main() {int pipefd[2];char buf[30];if (pipe(pipefd) == -1) {perror("pipe");exit(EXIT_FAILURE);}pid_t pid = fork();if (pid == -1) {perror("fork");exit(EXIT_FAILURE);} else if (pid == 0) {  // 子进程close(pipefd[1]);   // 关闭写端ssize_t bytes_read = read(pipefd[0], buf, sizeof(buf));if (bytes_read == -1) {perror("read");exit(EXIT_FAILURE);}printf("Child received: %s\n", buf);close(pipefd[0]);exit(EXIT_SUCCESS);} else {  // 父进程close(pipefd[0]);   // 关闭读端const char* msg = "Hello from parent";ssize_t bytes_written = write(pipefd[1], msg, strlen(msg) + 1);if (bytes_written == -1) {perror("write");exit(EXIT_FAILURE);}close(pipefd[1]);wait(NULL);  // 等待子进程结束}return 0;
    }
    

总结

经过第十章的学习,我对进程间通信有了更深刻的理解,特别是掌握了管道通信的基本原理和实现方法。这为我今后在编写多进程应用程序时提供了重要的技术支持。希望在后续的学习中,能够进一步探索其他进程间通信技术的实际应用。

参考资料

  • 通义千问
  • HeadFirstC嗨翻C语言
  • Linux Programming Interface
  • Inter-Process Communication (IPC) in Linux

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

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

相关文章

javascript 入门-01-变量声明

因缘际会 Alice: 编程入门好像很难吧,我能学会吗 ?我虽然是计算机专业的,但是我几乎没怎么写过代码。但是你先别说我菜,我身边的同学大家都是这样的 🤷 Bob: 那你能写冒泡排序或者求数组最大值吗 ? Alice: 冒泡排序写不出来,求数组最大值还能试试看。不过为什么问这个…

富士施乐DocuContre S2520报打开盖子A,取出纸张。代码077-900故障检修

故障描述: 一台富士施乐DocuContre S2520复印机开机报错:打开盖子A,取出纸张。代码077-900故障,用户之前经常卡纸,卡着、卡着就一直提示打开盖子A,取出纸张了;复印机屏幕提示如下图: 故障检修: 富士施乐DocuContre S2520复印机报打开盖子A,取出纸张。077-900的错误代…

MySQL事务相关面试题

MySQL事务 事务的特性是什么&#xff1f; 事务是一组操作的集合&#xff0c;是不可分割的单位&#xff0c;把所有操作作为一个整体要么同时成功&#xff0c;要么同时失败 ACID 并发事务问题 脏读&#xff1a;一个事务读到了另外一个事务还没有提交的数据 不可重复读&#x…

深度学习与飞桨 PaddlePaddle Fluid

编辑推荐 飞桨PaddlePaddle是百度推出的深度学习框架&#xff0c;不仅支撑了百度公司的很多业务和应用&#xff0c;而且随着其开源过程的推进&#xff0c;在其他行业得到普及和应用。 本书基于2019年7月4日发布的飞桨PaddlePaddle Fluid 1.5版本&#xff08;后续版本会兼容旧版…

C++ | Leetcode C++题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; using ULL unsigned long long;class Solution { public:vector<ULL> getCandidates(const string& n) {int len n.length();vector<ULL> candidates {(ULL)pow(10, len - 1) - 1,(ULL)pow(10, len) 1,};ULL selfPrefi…

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事&#xff0c;同事在导入项目运行时遇到IDEA报包不存在&#xff0c;但实际存在的问题&#xff0c;最终通过以下方式解决 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可…

Jenkins下载安装、构建部署到linux远程启动运行

Jenkins详细教程 Winodws下载安装Jenkins一、Jenkins配置Plugins插件管理1、汉化插件2、Maven插件3、重启Jenkins&#xff1a;Restart Safely插件4、文件传输&#xff1a;Publish Over SSH5、gitee插件6、清理插件&#xff1a;workspace cleanup system系统配置1、Gitee配置2、…

三、计算机视觉_04AlexNet、VggNet、ResNet设计思想

1、AlexNet 1.1 基本介绍 AlexNet是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年ImageNet大规模视觉识别挑战赛&#xff08;ILSVRC&#xff09;中提出的&#xff0c;它不仅赢得了当届的比赛&#xff0c;还激发了后续许多创新的神经网络架构&#xff08;如VGGN…

基于SpringBoot的在线考试系统的设计与实现+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

LabVIEW三针自动校准系统

基于LabVIEW的智能三针自动校准系统采用非接触式激光测径仪对标准三针进行精确测量。系统通过LabVIEW软件平台与硬件设备的协同工作&#xff0c;实现了数据自动采集、处理及报告生成&#xff0c;大幅提高了校准精度与效率&#xff0c;并有效降低了人为操作误差。 一、项目背景…

群控系统服务端开发模式-应用开发-前端上传配置功能开发

一、添加视图 在根目录下src文件夹下views文件夹下param文件夹下system文件夹下&#xff0c;新建index.vue&#xff0c;代码如下 <template><el-tabs type"border-card"><el-tab-pane v-if"$store.getters.butts.includes(ParamSystemIndexDeta…

VAM本体整合包,本体人物卡

已更至2024年11月】全网人物卡最全&#xff01;所见即所得解压既玩。资源整合包较大&#xff0c;选择性下载想玩什么下什么&#xff01;&#xff01;&#xff01; 1.包含上千付费级精品场景&#xff0c;新增数位神佬合集&#xff0c;新增绝版素材。 2.没有场景是没有灵魂的&…

jmeter常用配置元件介绍总结之监听器

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

蓝绿色电影风格滑板运动自拍照Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 蓝绿色电影风格的滑板运动自拍照&#xff0c;通过 Lightroom 调色&#xff0c;将滑板运动的活力与电影般的质感相结合。这种风格以独特的蓝绿色调为主&#xff0c;营造出一种神秘、宁静又充满活力的氛围&#xff0c;仿佛将瞬间定格成电影画面中的一帧。 预设信息 调…

通用定时器---输入捕获功能

目录 一、概念 二、输入捕获的结构图 三、配置的基本步骤 一、概念 STM32的输入捕获功能是一种强大的特性&#xff0c;他允许处理器捕获外部输入信号&#xff0c;并基于定时器抓取输入信号指定触发方式&#xff08;上升沿/下降沿&#xff09;之间的长度。这对于测量信号的脉…

Comsol 大功率超声波清洗机

大功率超声波清洗机是利用超声波在清洗液中产生的空化作用来清洗物体表面的设备。这种清洗机通常用于清洗工业零部件、实验器皿、医疗器械等物体&#xff0c;能够高效去除表面附着的污垢、油脂、细菌等。 大功率超声波清洗机的工作原理是通过超声波换能器将电能转换成机械振动…

计算机视觉中的双边滤波:经典案例与Python代码解析

&#x1f31f; 计算机视觉中的双边滤波&#xff1a;经典案例与Python代码解析 &#x1f680; Hey小伙伴们&#xff01;今天我们要聊的是计算机视觉中的一个重要技术——双边滤波。双边滤波是一种非线性滤波方法&#xff0c;主要用于图像去噪和平滑&#xff0c;同时保留图像的边…

模板——实现泛型编程的有力武器

模板——实现泛型编程的有力武器 我们为什么需要模板&#xff1f;模板 前言&#xff1a;关于模板&#xff0c;相信大家都有所而闻&#xff0c;以下是我对C模板的个人看法&#xff0c;希望能够帮助到你们呀&#xff01; 我们为什么需要模板&#xff1f; 请到大家看这一段代码&a…

Hugging_Face下载

能进huggingface的就能翻过去 不行的话可以去参考这个:mojie.app 1.直接原网下载 2.git(小白勿入) 如果是Linux&#xff0c;可以搜一个叫HFD&#xff08;HuggingFace_Download&#xff09; Windows的git安装参考如下&#xff1a;Git安装 建议先看看这个文档&#xff0c; 如果…

C++之内存管理

​ &#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C入门 目录 前言 一、C/C内存分配 二、 malloc、calloc、realloc、free 三、C内存管理方式 3.1 new/delete 操作内置类型 3.2 new和detele操作自定义类型…