2024.02.23作业
1. 尝试处理普通信号
#include "test.h"#define MAXSIZE 128void handler(int signo)
{if (SIGINT == signo){printf("用户按下了 ctrl + c 键\n");}
}int main(int argc, char const *argv[])
{if (signal(SIGINT, SIG_IGN) == SIG_ERR){perror("signal error");return -1;}if (signal(SIGINT, SIG_DFL) == SIG_ERR){perror("signal error");return -1;}if (signal(SIGINT, handler) == SIG_ERR){perror("signal error");return -1;}while (1){printf("我真的还想再活五百年\n");sleep(1);}return 0;
}

2. 尝试捕获或忽略SIGKILL信号
#include "test.h"#define MAXSIZE 128void handler(int signo)
{if (SIGINT == signo){printf("用户按下了 ctrl + c 键\n");}if (SIGKILL == signo){printf("捕获了 SIGKILL 信号\n");}
}int main(int argc, char const *argv[])
{if (signal(SIGKILL, SIG_IGN) == SIG_ERR){perror("signal error");return -1;}if (signal(SIGKILL, handler) == SIG_ERR){perror("signal error");return -1;}if (signal(SIGKILL, SIG_DFL) == SIG_ERR){perror("signal error");return -1;}while (1){printf("我真的还想再活五百年\n");sleep(1);}return 0;
}

3. 使用SIGCHLD信号回收僵尸进程
#include "test.h"#define MAXSIZE 128void handler(int signo)
{if (SIGCHLD == signo){while (waitpid(-1, NULL, WNOHANG) > 0);}
}int main(int argc, char const *argv[])
{if (signal(SIGCHLD, handler) == SIG_ERR){perror("signal error");return -1;}for (int i = 0; i < 10; i++){if (fork() == 0){sleep(1);exit(EXIT_SUCCESS);}}while (1);return 0;
}
4. 模拟出牌案例
#include "test.h"#define MAXSIZE 128void handler(int signo)
{if (SIGALRM == signo){printf("系统为你随机出了一张牌\n");alarm(5);}
}int main(int argc, char const *argv[])
{if (signal(SIGALRM, handler) == SIG_ERR){perror("signal error");return -1;}alarm(5);char ch = 0;while (1){scanf("%c", &ch);getchar();printf("您出的牌为:%c\n", ch);alarm(5);}return 0;
}

5. 验证发送信号函数
#include "test.h"#define MAXSIZE 128void handler(int signo)
{if (SIGUSR1 == signo){printf("造化弄人呀\n");raise(SIGKILL);}
}int main(int argc, char const *argv[])
{if (signal(SIGUSR1, handler) == SIG_ERR){perror("signal error");return -1;}pid_t pid = fork();if (pid > 0){while (1){printf("我真的还想再活五百年\n");sleep(1);}}else if (pid == 0){sleep(5);printf("我是子进程,我要独立啦!\n");kill(getpid(), SIGUSR1);while (1){printf("富贵险中求\n");sleep(1);}}return 0;
}

6. 消息队列
#include "test.h"struct msgbuf
{long mtype;char mtext[1024];
};#define MSGSIZE sizeof(struct msgbuf) - sizeof(long)int main(int argc, char const *argv[])
{key_t key = 0;if ((key = ftok("/", 'k')) == -1){perror("ftok error");return -1;}printf("ftok success key = %#x\n", key);int msgid = -1;if ((msgid = msgget(key, IPC_CREAT|0664)) == -1){perror("msgget error");return -1;}printf("msgget success msgid = %d\n", msgid);struct msgbuf sbuf;while (1){bzero(sbuf.mtext, sizeof(sbuf.mtext));printf("请输入当前消息的类型:");scanf("%ld", &sbuf.mtype);getchar();printf("请输入消息正文:");fgets(sbuf.mtext, sizeof(sbuf.mtext), stdin);sbuf.mtext[strlen(sbuf.mtext) - 1] = 0;msgsnd(msgid, &sbuf, MSGSIZE, 0);printf("发送成功\n");if (strcmp(sbuf.mtext, "quit") == 0){break;}}return 0;
}
#include "test.h"struct msgbuf
{long mtype;char mtext[1024];
};#define MSGSIZE sizeof(struct msgbuf) - sizeof(long)int main(int argc, char const *argv[])
{key_t key = 0;if ((key = ftok("/", 'k')) == -1){perror("ftok error");return -1;}printf("ftok success key = %#x\n", key);int msgid = -1;if ((msgid = msgget(key, IPC_CREAT|0664)) == -1){perror("msgget error");return -1;}printf("msgget success msgid = %d\n", msgid);struct msgbuf rbuf;while (1){bzero(rbuf.mtext, sizeof(rbuf.mtext));msgrcv(msgid, &rbuf, MSGSIZE, 1, 0);printf("收到的消息为:%s\n", rbuf.mtext);if (strcmp(rbuf.mtext, "quit") == 0){break;}}return 0;
}

7. 使用消息队列完成两个进程间通信
#include "test.h"struct msgbuf
{long mtype;char mtext[1024];
};#define MSGSIZE sizeof(struct msgbuf) - sizeof(long)void send(int msgid, long msgtype)
{struct msgbuf sbuf;while (1){bzero(sbuf.mtext, sizeof(sbuf.mtext));printf("请输入消息正文:");fgets(sbuf.mtext, sizeof(sbuf.mtext), stdin);sbuf.mtext[strlen(sbuf.mtext) - 1] = 0;sbuf.mtype = msgtype;msgsnd(msgid, &sbuf, MSGSIZE, 0);printf("发送成功\n");if (strcmp(sbuf.mtext, "quit") == 0){break;}}
}void receive(int msgid, long msgtype)
{struct msgbuf rbuf;while (1){bzero(rbuf.mtext, sizeof(rbuf.mtext));printf("\r");msgrcv(msgid, &rbuf, MSGSIZE, msgtype, 0);printf("收到的消息为:%s\n", rbuf.mtext);printf("请输入消息正文:");fflush(stdout);if (strcmp(rbuf.mtext, "quit") == 0){break;}}
}int main(int argc, char const *argv[])
{key_t key = 0;if ((key = ftok("/", 'k')) == -1){perror("ftok error");return -1;}printf("ftok success key = %#x\n", key);int msgid = -1;if ((msgid = msgget(key, IPC_CREAT|0664)) == -1){perror("msgget error");return -1;}printf("msgget success msgid = %d\n", msgid);int flag;puts("请选择:");puts("1. 主发子收");puts("2. 主收子发");printf("请输入:");scanf("%d", &flag);getchar();pid_t pid = fork();if (pid > 0){if (flag == 1){send(msgid, 1);}else if (flag == 2){receive(msgid, 1);}}else if (pid == 0){if (flag == 1){receive(msgid, 2);}else if (flag == 2){send(msgid, 2);}}return 0;
}

相关文章:
2024.02.23作业
1. 尝试处理普通信号 #include "test.h"#define MAXSIZE 128void handler(int signo) {if (SIGINT signo){printf("用户按下了 ctrl c 键\n");} }int main(int argc, char const *argv[]) {if (signal(SIGINT, SIG_IGN) SIG_ERR){perror("signal …...
倒模专用制作耳机壳UV树脂:改性丙烯酸树脂
倒模专用制作耳机壳的UV树脂是经过改性的丙烯酸树脂,具有高透明度、高粘度、快速固化的特点。这种树脂可以通过紫外线光固化,快速形成坚硬的表面,并且具有较高的硬度和耐磨性,因此非常适合用于制作耳机壳。 此外,改性丙…...
chatgpt:还有哪些人工智能和科技值得关注?
今天,很多人的目光都被ChatGPT吸引,其实,人工智能的范围很大,远不止ChatGPT或者其他自然语言的处理工具。所以说不管ChatGPT的结果如何,人工智能依然是未来。 那么在ChatGPT之外,还有没有什么值得关注的人…...
LeetCode 2997.使数组异或和等于K的最少操作次数
给你一个下标从 0 开始的整数数组 nums 和一个正整数 k 。 你可以对数组执行以下操作 任意次 : 选择数组里的 任意 一个元素,并将它的 二进制 表示 翻转 一个数位,翻转数位表示将 0 变成 1 或者将 1 变成 0 。 你的目标是让数组里 所有 元素…...
计算机设计大赛 深度学习大数据物流平台 python
文章目录 0 前言1 课题背景2 物流大数据平台的架构与设计3 智能车货匹配推荐算法的实现**1\. 问题陈述****2\. 算法模型**3\. 模型构建总览 **4 司机标签体系的搭建及算法****1\. 冷启动**2\. LSTM多标签模型算法 5 货运价格预测6 总结7 部分核心代码8 最后 0 前言 ǵ…...
WPF 附加属性+控件模板,完成自定义控件。建议观看HandyControl源码
文章目录 相关连接前言需要实现的效果附加属性添加附加属性,以Test修改FontSize为例依赖属性使用触发器使用直接操控 结论 控件模板,在HandyControl的基础上面进行修改参考HandyControl的源码控件模板原型控件模板 控件模板触发器完整样式简单使用 结论 …...
编程笔记 Golang基础 040 defer、panic 和 recover
编程笔记 Golang基础 040 defer、panic 和 recover 一、defer二、panic三、recover小结 在Go语言中,defer、panic 和 recover 是一组用于错误处理和控制程序流程的关键字。它们之间的交互有助于实现异常处理机制,并确保资源的正确释放。 一、defer defe…...
通过redfish协议实现服务器固件升级、从虚拟光驱启动自检盘并等待完成,最后截图保存
通过redfish协议实现服务器固件升级、从虚拟光驱启动自检盘并等待完成,最后截图保存 版本信息代码新开发的PCIE设备在做服务器适配时,有时需要服务器厂家更新BMC或BIOS固件。同时,我们也希望对PCIE设备做一些检测,最后收集一些信息存档。如果需要处理的服务器很多,通过BMC的界面…...
ARM 版银河麒麟桌面系统下 Qt 开发环境搭建指南
目录 前言安装Linux ARM 版 QtCreator配置 Qt Creator配置构建套件 第一个麒麟 Qt 应用程序小结 前言 在上一篇文章信创ARM架构QT应用开发环境搭建中建议大家使用 Ubuntu X86 系统作为信创 ARM 架构 QT 应用的开发环境,里面使用了交叉编译的方式。这对于自己的 Qt …...
架构面试题汇总:缓存(二)
目录 1. 问题:什么是缓存,以及为什么我们需要缓存?2. 问题:你能解释一下缓存击穿、缓存雪崩和缓存预热是什么吗?3. 问题:如何在Java中实现缓存?4. 问题:你如何决定哪些数据应该被缓存…...
【docker入门】1-
文章目录 参考: Docker – 容器虚拟化平台。 参考: docker入门,这一篇就够了。【零基础入门Docker】Dockerfile中的USER指令以及dockerfile命令详解dockerfile copy命令...
微信小程序-全局配置
个人笔记,仅供参考。 1.entryPagePath 代码: "entryPagePath": "pages/index/index" 具体用法: 2.pages 小程序中新增/减少页面,都需要对 pages 数组进行修改。 代码: "pages": [&…...
【Android】性能优化之内存、网络、布局、卡顿、安装包、启动速度优化
欢迎来到 Android 开发老生常谈的性能优化篇,本文将性能优化划分为内存、网络、布局、卡顿、安装包、启动速度七块,从这七块优化出发,阐述优化的 Application 的方式。 目录 内存优化避免内存泄漏使用内存分析工具优化数据结构和算法数据缓存…...
第3.6章:StarRocks数据导入——DataX StarRocksWriter
一、Datax 1.1 DataX 3.0概述 DataX3.0是一个异构数据源离线同步工具,可以方便的对各种异构数据源进行高效的数据同步。 其github地址为: https://github.com/alibaba/DataX/blob/master/introduction.mdhttps://github.com/alibaba/DataX/blob/mast…...
【非递归版】归并排序算法(2)
目录 MergeSortNonR归并排序 非递归&归并排序VS快速排序 整体思想 图解分析 代码实现 时间复杂度 归并排序在硬盘上的应用(外排序) MergeSortNonR归并排序 前面的快速排序的非递归实现,我们借助栈实现。这里我们能否也借助栈去…...
[C++]C++实现本地TCP通讯的示例代码
这篇文章主要为大家详细介绍了C如何利用TCP技术,实现本地ROS1和ROS2的通讯,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下 概要服务端代码 头文件源代码客户端代码 概要 利用TCP技术,实现本地ROS1和ROS2的通讯。 服务端代码 头文件 #include &…...
Sora - 探索AI视频模型的无限可能
文章目录 每日一句正能量前言技术解析应用场景未来展望伦理与创意用户体验与互动后记 每日一句正能量 . 一个人,如果没有经受过投资失败的痛楚,又怎么会看到绝望之后的海阔天空。很多时候,经历了人生中最艰难的事,反而锻造了最坚强…...
【JavaScript 漫游】【022】事件模型
文章简介 本篇文章为【JavaScript 漫游】专栏的第 022 篇文章,对 JavaScript 中事件模型相关的知识点进行了总结。 监听函数 浏览器的事件模型,就是通过监听函数(listener)对事件做出反应。事件发生后,浏览器监听到…...
【加密算法】RSA非对称加密算法简介
目录 前言 工作原理 密钥生成 加密和解密 在Java中使用RSA 生成密钥对 加密和解密数据 加密数据 解密数据 注意事项和最佳实践 结论 前言 RSA(Rivest-Shamir-Adleman)是一种基于数论的非对称加密算法,广泛应用于数字签名、数据加密…...
深入理解 JavaScript 对象原型,解密原型链之谜(上)
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...
Linux信号保存与处理机制详解
Linux信号的保存与处理涉及多个关键机制,以下是详细的总结: 1. 信号的保存 进程描述符(task_struct):每个进程的PCB中包含信号相关信息。 pending信号集:记录已到达但未处理的信号(未决信号&a…...
