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…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
 
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
 
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
 
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
 
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
