当前位置: 首页 > news >正文

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.递归应该一种比较常见的实现一些特殊代码逻辑时需要做的&#xff0c;但常常也是最绕的一种方式&#xff0c;在解释递归 之前&#xff0c;我们用循环和递归来做个比较1.1.如果你打开一扇门后&#xff0c;同样发现前方也有一扇们&#xff0c;紧接着你又打开下一扇门...直…...

[设计模式Java实现附plantuml源码~行为型]对象间的联动~观察者模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…...

vue3+js 实现记住密码功能

常见的几种实现方式 1 基于spring security 的remember me 功能 ​​​​​​​ localStorage 除非主动清除localStorage 里的信息 &#xff0c;不然永远存在&#xff0c;关闭浏览器之后下次启动仍然存在 存放数据大小一般为5M 不与服务器进行交互通信 cookies 可以…...

基于单片机的太阳能电池板自动跟踪系统的研究

摘要 伴随着人类社会的发展,人口基数越来越大,电量消耗巨大,传统发电原 料污染环境的同时,可用量日益减少,给人类未来生产生活带来了一定的威胁, 因而解决日益剧增的用电量,寻求一种新能源显得极其重要。论文正是基于此 背景下,针对当前太阳能电池板采光率低、自动化水…...

React 模态框的设计(二)

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

操作符详解3

✨✨ 欢迎大家来到莉莉的博文✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 前面我们已经讲过算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单目操作 符&#xff0c;今天继续介绍一部分。 目录 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、对项目构建的理解 先从浏览器出发&#xff0c; 浏览器是由浏览器内核和JS引擎组成&#xff1b;浏览器内核编译解析html代码和css代码&#xff0c;js引擎编译解析JavaScript代码&#xff1b;所以从本质上&#xff0c;浏览器只能识别运行JavaScript、CSS、HTML代码。 而我们在…...

OpenCart程序结构与业务逻辑

一、程序业务逻辑说明 在 OpenCart 中&#xff0c;index.php 文件是整个应用程序的入口文件&#xff0c;它负责初始化应用程序并调度请求。以下是 index.php 文件加载执行的流程&#xff1a; 1. **设置路径常量&#xff1a;** - index.php 首先定义了一些重要的路径常量&…...

软件License授权原理

软件License授权原理 你知道License是如何防止别人破解的吗?本文将介绍License的生成原理,理解了License的授权原理你不但可以防止别人破解你的License,你甚至可以研究别人的License找到它们的漏洞。喜欢本文的朋友建议收藏+关注,方便以后复习查阅。 什么是License? 在…...

C/C++实现老鼠走迷宫

老鼠形象可以辨认&#xff0c;可以用上下左右操纵老鼠;正确检测结果&#xff0c;若老鼠在规定的时间内走到粮仓&#xff0c;提示成功&#xff0c;否则提示失败。代码分为3个文件&#xff1a;main.cpp、play.h、play.cpp。 main.cpp: #include <iostream> #include <…...

[Linux]文件基础-如何管理文件

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

bat 查找文件所在

脚本 在批处理文件&#xff08;.bat&#xff09;中查找文件所在的目录&#xff0c;你可以使用dir命令结合循环和条件语句来实现。以下是一个简单的示例&#xff0c;演示如何在批处理文件中查找指定文件并输出其所在目录&#xff1a; echo off setlocal enabledelayedexpansio…...

程序员的守护神:为何电脑永不熄灭?

在这个信息时代&#xff0c;程序员成了推动社会进步的“隐形英雄”。他们通宵达旦&#xff0c;手指在键盘上跳跃&#xff0c;创造出一个个令人惊叹的数字世界。有趣的是&#xff0c;你可能注意到了一个现象&#xff1a;程序员似乎总是不关电脑。这并非他们对电脑上瘾&#xff0…...

Kafka快速实战以及基本原理详解

Kafka快速实战以及基本原理详解 基本概念 Kafka是一个分布式、支持分区、多副本&#xff0c;基于ZK的分布式消息系统&#xff0c;最大的特性就是可以实时的处理大量数据以满足各种需求场景&#xff0c;比如Hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎、日…...

微信小程序(4)- 事件系统和模板语法

1. 事件系统 1.1 事件绑定和事件对象 小程序中绑定事件与在网页开发中绑定事件几乎一致&#xff0c;只不过在小程序不能通过 on 的方式绑定事件&#xff0c;也没有 click 等事件&#xff0c;小程序中绑定事件使用 bind 方法&#xff0c;click 事件也需要使用 tap 事件来进行代…...

【Java多线程】对线程池的理解并模拟实现线程池

目录 1、池 1.1、线程池 2、ThreadPoolExecutor 线程池类 3、Executors 工厂类 4、模拟实现线程池 1、池 “池”这个概念见到非常多&#xff0c;例如常量池、数据库连接池、线程池、进程池、内存池。 所谓“池”的概念就是&#xff1a;&#xff08;提高效率&#xff09; 1…...

python连接mysql数据库

连接MySQL数据库&#xff0c;通常我们会使用Python的mysql-connector-python库。下面是一个基本的示例来展示如何使用Python连接到MySQL数据库。 首先&#xff0c;确保你已经安装了mysql-connector-python库。如果没有&#xff0c;你可以使用pip来安装它&#xff1a; pip ins…...

docker用法

首先需要去docker官网注册你的账号&#xff0c;记住账号名称和密码&#xff1b; 然后在本地执行&#xff1a; docker login登录OK。 把ubuntu下载到本地&#xff1a; sudo docker pull ubuntusudo docker images输出&#xff1a; REPOSITORY TAG …...

DIcom调试Planar configuration

最近和CBCT组同事调dicom图像 这边得图像模块老不兼容对方得dicom文件。 vtk兼容&#xff0c;自己写得原生解析不兼容。 给对方调好了格式&#xff0c;下次生成文件还会有错。 简单记录下&#xff0c;日后备查。 今天对方又加了 个字段&#xff1a;Planar configuration 查…...

C#与VisionPro联合开发——跳转页面

1、跳转页面并打开相机 From1 所有代码展示 using System; using System.IO; using System.Windows.Forms; //引入VisionPro命名空间 using Cognex.VisionPro;namespace ConnectCamera {public partial class Form1 : Form {public Form1() {InitializeComponent();}CogAcqFif…...

服务端测试开发必备技能:Mock测试

什么是mock测试 Mock 测试就是在测试活动中&#xff0c;对于某些不容易构造或者不容易获取的数据/场景&#xff0c;用一个Mock对象来创建以便测试的测试方法。 Mock测试常见场景 无法控制第三方系统接口的返回&#xff0c;返回的数据不满足要求依赖的接口还未开发完成&#…...

vue3中ref创建变量取值时自动补充 .value 插件 volar

插件 TypeScript Vue Plugin (Volar) 设置中配置...

clickhouse的docker部署与springboot整合

注意:镜像bitnami/clickhouse包含服务端和客户端,yandex版本需要使用yandex/clickhouse-server,yandex/clickhouse-server docker启动命令(允许空密码 -e ALLOW_EMPTY_PASSWORD=yes),clickhouse版本不同,配置文件在的位置也会不一样/etc/clickhouse-server/config.xml d…...

Node.js_基础知识(计算机硬件基础)

主机的基本组成 CPU:Central Processing Unit,即中央处理器,是计算机的核心部件。是一块集成电路芯片,能够执行计算机指令并控制计算机的各种操作,负责运算和处理数据内存:是电脑硬件中的一块电路板,用于暂时存储CPU中的运算数据,是计算机与CPU进行沟通的桥梁,负责存储…...

git bash :download.sh: line 1: wget: command not found(已解决)

Windows中git bash完全可以替代原生的cmd&#xff0c;但是对于git bash会有一些Linux下广泛使用的命令的缺失&#xff0c;比如wget命令。 1、下载wget.exe&#xff0c;地址&#xff1a;https://eternallybored.org/misc/wget/ 2、将wget.exe 拷贝到C:\Program Files\Git\ming…...

BlackberryQ10 是可以安装 Android 4.3 应用的,Web UserAgent 版本信息

BlackberryQ10 是可以安装 Android 4.3 应用的 最近淘了个 Q10 手机&#xff0c;非常稀罕它&#xff0c;拿着手感一流。这么好的东西&#xff0c;就想给它装点东西&#xff0c;但目前所有的应用都已经抛弃这个安卓版本了。 一、开发环境介绍 BlackBerry Q10 的 安卓版本是 4.…...

JS前端高频面试

JS数据类型有哪些&#xff0c;区别是什么 js数据类型分为原始数据类型和引用数据类型。 原始数据类型包括&#xff1a;number&#xff0c;string&#xff0c;boolean&#xff0c;null&#xff0c;undefined&#xff0c;和es6新增的两种类型&#xff1a;bigint 和 symbol。&am…...