2024.2.23
1.1.1 信号默认、捕获、忽略处理(普通信号)
#include <myhead.h>
void handler(int signo)
{if(signo==SIGINT){printf("用户键入 ctrl+c\n");}
}
int main(int argc, const char *argv[])
{//忽略信号if(signal(SIGINT,SIG_IGN)==SIG_ERR){perror("signal error");return -1;}/*//默认处理信号if(signal(SIGINT,SIG_IGN)==SIG_ERR){perror("signal error");return -1;}//捕获信号if(signal(SIGINT,handler)==SIG_ERR){perror("signal error");return -1;}*/while(1){printf("123456\n");sleep(1);}return 0;
}
1.1.2 SIGCHLD回收僵尸进程
#include <myhead.h>
void handler(int signo)
{if(signo==SIGCHLD){while(waitpid(-1,NULL,WNOHANG)>0);//waitpid(-1,NULL,WNOHANG);}
}
int main(int argc, const char *argv[])
{//捕获信号if(signal(SIGCHLD,handler)==SIG_ERR){perror("signal error");return -1;}//创建僵尸进程for(int i=0;i<5;i++){if(fork()==0){sleep(1);exit(EXIT_SUCCESS);}}while(1);return 0;
}
1.1.3 模拟出牌
#include <myhead.h>//信号处理函数
void handler(int signo)
{if(signo==SIGALRM){printf("系统为您出了一张牌\n");alarm(5);}
}
int main(int argc, const char *argv[])
{//捕获SIGALRM信号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;
}
1.1.4 发送信号函数
#include <myhead.h>void hander(int signo)
{if(signo==SIGUSR1){printf("大清亡了\n");raise(SIGKILL);}
}
int main(int argc, const char *argv[])
{//发送信号if(signal(SIGUSR1,hander)==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(3);printf("我才是真命天子\n");kill(getppid(),SIGUSR1);while(1){printf("现在是我的了\n");sleep(1);}}else{perror("pid error");return -1;}return 0;
}
1.2 消息队列
msgsnd.c:
#include <myhead.h>//消息队列结构体
struct msgbuf
{long mtype;char mtest[1024];
};
//宏表示消息正文的大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{//创建 key 值key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("fork success key=%#x\n",key);//根据key值创建消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%#x\n",msqid);//定义一个消息struct msgbuf sbuf;while(1){//清空正文的容器bzero(sbuf.mtest,sizeof(sbuf.mtest));printf("请输入当前消息的类型:");scanf("%ld",&sbuf.mtype);getchar(); //吸收垃圾字符printf("请输入消息正文:");fgets(sbuf.mtest,sizeof(sbuf.mtest),stdin);sbuf.mtest[strlen(sbuf.mtest)-1]='\0';//将消息存放到队列中msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");if(strcmp(sbuf.mtest,"quit")==0){break;}}return 0;
}
msgrcv.c:
#include <myhead.h>//消息队列结构体
struct msgbuf
{long mtype;char mtest[1024];
};
//宏表示消息正文的大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{//创建 key 值key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("fork success key=%#x\n",key);//根据key值创建消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%#x\n",msqid);//定义一个消息struct msgbuf rbuf;while(1){//清空正文的容器bzero(rbuf.mtest,sizeof(rbuf.mtest));//从消息队列中读取一个消息msgrcv(msqid,&rbuf,MSGSIZE,0,0);printf("收到的消息为:%s\n",rbuf.mtest);if(strcmp(rbuf.mtest,"quit")==0){break;}}//删除消息队列if(msgctl(msqid,IPC_RMID,NULL)!=0){perror("msgctl error");return -1;}return 0;
}
作业2:使用消息队列完成两个进程间相互通信
msgsnd.c:
#include <myhead.h>//定义一个消息类型
struct msgbuf
{long mtype;char mtest[1024];
};//宏表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)/*****************************主程序***********************/
int main(int argc, const char *argv[])
{//1、创建key值key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}//根据key值创建一个消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}//创建一个子进程pid_t pid=fork();if(pid>0){//父进程向消息队列中写入类型为1的消息正文//定义一个消息struct msgbuf sbuf;sbuf.mtype=1;while(1){//清空容器bzero(sbuf.mtest,sizeof(sbuf.mtest));printf("发送的消息:");fgets(sbuf.mtest,sizeof(sbuf.mtest),stdin);sbuf.mtest[strlen(sbuf.mtest)-1]='\0';//将消息存放到消息队列msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");if(strcmp(sbuf.mtest,"quit")==0){break;}}wait(NULL); }else if(pid==0){//子进程从消息队列中取出类型为2的消息正文//定义一个消息struct msgbuf rbuf;while(1){//清空容器bzero(rbuf.mtest,sizeof(rbuf.mtest));//从消息队列中读取类型为2的消息正文msgrcv(msqid,&rbuf,MSGSIZE,2,0);printf("收到的消息为:%s\n",rbuf.mtest);if(strcmp(rbuf.mtest,"quit")==0){break;}}exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}return 0;
}
msgrcv.c:
#include <myhead.h>//定义一个消息类型
struct msgbuf
{long mtype;char mtest[1024];
};//宏表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)/*****************************主程序***********************/
int main(int argc, const char *argv[])
{//1、创建key值key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}//根据key值创建一个消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}//创建一个子进程pid_t pid=fork();if(pid>0){//父进程从消息队列中取出类型为1的消息正文//定义一个消息struct msgbuf rbuf;while(1){//清空容器bzero(rbuf.mtest,sizeof(rbuf.mtest));//从消息队列中读取类型为1的消息正文msgrcv(msqid,&rbuf,MSGSIZE,1,0);printf("收到的消息为:%s\n",rbuf.mtest);if(strcmp(rbuf.mtest,"quit")==0){break;}}wait(NULL);}else if(pid==0){//子进程向消息队列中写入类型为2的消息正文//定义一个消息struct msgbuf sbuf;sbuf.mtype=2;while(1){//清空容器bzero(sbuf.mtest,sizeof(sbuf.mtest));printf("发送的消息:");fgets(sbuf.mtest,sizeof(sbuf.mtest),stdin);sbuf.mtest[strlen(sbuf.mtest)-1]='\0';//将消息存放到消息队列msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");if(strcmp(sbuf.mtest,"quit")==0){break;}}exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}return 0;
}
相关文章:
2024.2.23
1.1.1 信号默认、捕获、忽略处理(普通信号) #include <myhead.h> void handler(int signo) {if(signoSIGINT){printf("用户键入 ctrlc\n");} } int main(int argc, const char *argv[]) {//忽略信号if(signal(SIGINT,SIG_IGN)SIG_ERR){perror("signal er…...

PHP实现分离金额和其他内容便于统计计算
得到的结果可以粘贴到excel计算 <?php if($_GET["x"] "cha"){ $tips isset($_POST[tips]) ? $_POST[tips] : ; $pattern /(\d\.\d|\d)/; $result preg_replace($pattern, "\t\${1}\t", $tips); echo "<h2><strong>数…...

基础数据结构和算法《》
递归 1.递归应该一种比较常见的实现一些特殊代码逻辑时需要做的,但常常也是最绕的一种方式,在解释递归 之前,我们用循环和递归来做个比较1.1.如果你打开一扇门后,同样发现前方也有一扇们,紧接着你又打开下一扇门...直…...

[设计模式Java实现附plantuml源码~行为型]对象间的联动~观察者模式
前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…...

vue3+js 实现记住密码功能
常见的几种实现方式 1 基于spring security 的remember me 功能 localStorage 除非主动清除localStorage 里的信息 ,不然永远存在,关闭浏览器之后下次启动仍然存在 存放数据大小一般为5M 不与服务器进行交互通信 cookies 可以…...
基于单片机的太阳能电池板自动跟踪系统的研究
摘要 伴随着人类社会的发展,人口基数越来越大,电量消耗巨大,传统发电原 料污染环境的同时,可用量日益减少,给人类未来生产生活带来了一定的威胁, 因而解决日益剧增的用电量,寻求一种新能源显得极其重要。论文正是基于此 背景下,针对当前太阳能电池板采光率低、自动化水…...

React 模态框的设计(二)
自定义组件是每个前端开发者必备的技能。我们在使用现有框架时难免有一些超乎框架以处的特别的需求,比如关于弹窗,每个应用都会用到,但是有时我们使用的框架中提供的弹窗功能也是功能有限,无法满足我们的应用需求,今天…...

操作符详解3
✨✨ 欢迎大家来到莉莉的博文✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 前面我们已经讲过算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单目操作 符,今天继续介绍一部分。 目录 1.操作符的分类 2…...

【C语言基础】:操作符详解(一)
文章目录 操作符详解1. 操作符的分类2. 二进制和进制转换2.1 什么是二进制、八进制、十进制、十六进制2.1.1 二进制和进制转换2.1.2 二进制转十进制2.2.3 二进制转八进制2.2.4 二进制转十六进制 3. 源码、反码、补码4. 移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符&…...

通俗易懂分析:Vite和Webpack的区别
1、对项目构建的理解 先从浏览器出发, 浏览器是由浏览器内核和JS引擎组成;浏览器内核编译解析html代码和css代码,js引擎编译解析JavaScript代码;所以从本质上,浏览器只能识别运行JavaScript、CSS、HTML代码。 而我们在…...
OpenCart程序结构与业务逻辑
一、程序业务逻辑说明 在 OpenCart 中,index.php 文件是整个应用程序的入口文件,它负责初始化应用程序并调度请求。以下是 index.php 文件加载执行的流程: 1. **设置路径常量:** - index.php 首先定义了一些重要的路径常量&…...

软件License授权原理
软件License授权原理 你知道License是如何防止别人破解的吗?本文将介绍License的生成原理,理解了License的授权原理你不但可以防止别人破解你的License,你甚至可以研究别人的License找到它们的漏洞。喜欢本文的朋友建议收藏+关注,方便以后复习查阅。 什么是License? 在…...
C/C++实现老鼠走迷宫
老鼠形象可以辨认,可以用上下左右操纵老鼠;正确检测结果,若老鼠在规定的时间内走到粮仓,提示成功,否则提示失败。代码分为3个文件:main.cpp、play.h、play.cpp。 main.cpp: #include <iostream> #include <…...

[Linux]文件基础-如何管理文件
回顾C语言之 - 文件如何被写入 fopen fwrite fread fclose fseek … 这一系列函数都是C语言中对文件进行的操作: int main() {FILE* fpfopen("text","w");char str[20]"write into text";fputs(str,fp);fclose(fp);return 0; }而上…...

bat 查找文件所在
脚本 在批处理文件(.bat)中查找文件所在的目录,你可以使用dir命令结合循环和条件语句来实现。以下是一个简单的示例,演示如何在批处理文件中查找指定文件并输出其所在目录: echo off setlocal enabledelayedexpansio…...
程序员的守护神:为何电脑永不熄灭?
在这个信息时代,程序员成了推动社会进步的“隐形英雄”。他们通宵达旦,手指在键盘上跳跃,创造出一个个令人惊叹的数字世界。有趣的是,你可能注意到了一个现象:程序员似乎总是不关电脑。这并非他们对电脑上瘾࿰…...

Kafka快速实战以及基本原理详解
Kafka快速实战以及基本原理详解 基本概念 Kafka是一个分布式、支持分区、多副本,基于ZK的分布式消息系统,最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如Hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎、日…...
微信小程序(4)- 事件系统和模板语法
1. 事件系统 1.1 事件绑定和事件对象 小程序中绑定事件与在网页开发中绑定事件几乎一致,只不过在小程序不能通过 on 的方式绑定事件,也没有 click 等事件,小程序中绑定事件使用 bind 方法,click 事件也需要使用 tap 事件来进行代…...

【Java多线程】对线程池的理解并模拟实现线程池
目录 1、池 1.1、线程池 2、ThreadPoolExecutor 线程池类 3、Executors 工厂类 4、模拟实现线程池 1、池 “池”这个概念见到非常多,例如常量池、数据库连接池、线程池、进程池、内存池。 所谓“池”的概念就是:(提高效率) 1…...
python连接mysql数据库
连接MySQL数据库,通常我们会使用Python的mysql-connector-python库。下面是一个基本的示例来展示如何使用Python连接到MySQL数据库。 首先,确保你已经安装了mysql-connector-python库。如果没有,你可以使用pip来安装它: pip ins…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
初级程序员入门指南
初级程序员入门指南 在数字化浪潮中,编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言,明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 (一)编程语言抉择 编…...