网站浮动窗口代码php/海外seo
进程之间的通信通过内核空间实现
IPC技术
①管道(匿名管道/命名管道-FIFO队列) ②System V IPC(消息队列、信号量和共享内存) ③套接字(UNIX套接字&Internet套接字)
※信号
软中断,信号提供了一种处理异步事件的方法,作为进程通信的一种机制,由一个进程发送给另一个进程。<signal.h>
信号的产生情况
①用户在终端按下一个组合键;
②硬件异常; //①②硬件问题
③进程调用 kill 函数发送信号;
④当检测到某软件产生异常时产生信号; //③④软件问题
信号处理
阻塞信号/捕获信号/忽略信号/执行默认动作
【SIGKILL&SIGSTOP 信号是无法捕捉和忽略的】
查看信号 kill -l / trap -l;
信号操作的函数
(1) int kill (pid_t pid,int sig); //向指定进程发送信号
头文件:<sys/types.h> <sysnal.h>
pid : ①>0; 发送指定pid的进程
②=0;信号发送给和目前进程在同一个进程组的所有进程
③=-1;广播到系统内所有进程
④<0; 发送信号给PID为pid绝对值的进程
(2) int alarm(int second); //定时器发送信号SIGALRM,默认处理是终止当前进程;
头文件:<unistd.h>
函数的返回值是0/设定闹钟还余下的秒数
(3) int raise(int sig); //发送信号给当前的进程
头文件:<signal.h>
sig参数主要是信号参数
执行成功返回0,失败返回-1;
等价于 kill (getpid(),sig);
(4) void signal(*signal(it signum,void(*handler)(int)))(int);
头文件:#include <signal.h>
signal()会按照signum指定的信号编号来设置信号的处理函数。当指定的信号到达就会处理*handler指定的函数执行;若该函数不在,则需要是以下的两个常数之一:
SIG_IGN 忽略参数signum指定的信号
SIG_DFL 将参数signum指定的信号重设为 核心预设的信号处理方式
(5) 信号集操作函数--#include <signal.h>
int sigemptyset(sigset_t *set); //清空信号集 成功返回0 错误返回-1
int sigfillset(sigset_t *set); //初始化信号集 成功返回0 失败返回-1
int sigaddset(sigset_t *set,int signo); //将signo信号加入到信号集set 成功返回0 失败返回-1
int sigdelset(sigset_t *set,int signo); //将指定信号从信号集中添加或者删除
int sigismember(const sigset_t *set,int signo);
//判断指定信号是否包含在信号集中 (不)包含返回1(0) 失败返回-1
int sigprocmask(int how,const sigset_t *set,sigset_t *old) //查询/设置信号掩码
//how参数: --成功返回0,失败返回-1
//SIG_BLOCK: 新的信号掩码由目前的信号掩码和set指定的信号掩码的并集
//SIG_UNBLOCK:将目前的信号掩码删除set指定的信号掩码
//SIG_SETMASK: 目前的信号掩码设置成set指定的信号掩码
信号发送例:设计一个程序,要求用户进程创建一个子进程,父进程向子进程发出SIGKILL信号,子进程收到此信号,结束子进程的运行;
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{pid_t sonpid;int ret;sonpid=fork(); //fork()函数执行一次,返回两次;在父进程中,fork返回新建进程ID;在子 //进程中fork返回0,错误返回负值;int newret;if(sonpid<0){perror("创建进程失败!");exit(1); //异常结束}else if(sonpid==0){raise(SIGSTOP); //如果是子进程,发送一个不能被阻塞、处理或阻塞的暂停信号;exit(0); //正常结束}else{printf("子进程的进程号是%d\n",sonpid);if((waitpid(sonpid,NULL,WNOHANG))==0){if(ret=kill(sonpid,SIGKILL)==0){printf("用kill函数返回值是:%d,发出的SIGKILL信号结>束的进程进程号:%d\n",ret,sonpid);}else{perror("kill函数结束子进程失败");}}}
}
信号处理例:要求程序运行后进入无限循环,当用户按下中断键(Ctrl+C)时,进入程序的自定义信号处理函数,当用户再次按下中断键(Ctrl+C)后,结束程序运行;
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
void fun_ctrl_c(); //自定义信号函数
int main()
{(void)signal(SIGINT,fun_ctrl_c);printf("主程序:主程序进入一个循环...\n");while(1){printf("这是一个无限的循环(退出请按‘Ctrl+C’)\n");sleep(3);}exit(0);
}void fun_ctrl_c()
{printf("\t你按了Ctrl+C!\n");printf("\t此例不处理,重新恢复SIGINT信号的系统默认处理\n");(void) signal(SIGINT,SIG_DFL); //重新恢复SIGINT的系统默认处理
}
信号阻塞例1:
要求主程序运行时,即使按下Ctrl+C也不影响正在运行的程序,即让信号处于阻塞状态,当主体程序运行完毕后才进入自定义信号处理函数;
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/stat.h>
#include <unistd.h>
void fun_ctrl_c();//自定义信号函数
int main()
{int i;sigset_t set,pendset; //定义了两个信号集struct sigaction action;(void) signal(SIGINT,fun_ctrl_c);if(sigemptyset(&set)<0) //初始化set信号集{perror("初始化集合错误!\n");}if(sigaddset(&set,SIGINT)<0) //将SIGINT信号加入到set信号集{perror("加入信号集错误\n");}if(sigprocmask(SIG_BLOCK,&set,NULL)<0) //将当前的信号集合加入到当前进程的//阻塞集合中{perror("往信号阻塞集中增加一个信号集合错误");}else //将当前信号集加入到阻塞集合中{for(int i=0;i<5;i++){printf("此文字表示程序在阻塞状态\n");sleep(2);}}if(sigprocmask(SIG_UNBLOCK,&set,NULL)<0) //将当前的阻塞集中删除一个信号集{perror("从信号阻塞集删除一个信号集合错误");}
}
void fun_ctrl_c() //自定义信号函数
{printf("\t你按了Ctrl+C但是系统未处理a... ");//要求中断键不影响当前程序运行printf("\t信号处理函数:要处理的东西在处理函数中编程!\n");printf("\t这个案例不处理,直接退出!\n");(void) signal(SIGINT,SIG_DFL); //恢复默认SIGINT信号的系统默认处理
}
过程:①初始化set信号集; ②将SIGINT信号加入到set信号集; ③将set信号集加入到阻塞集;
... ④将set信号集从阻塞集删除 ->5次循环 程序结束 SIGINT执行默认系统处理 直接退出系统;
信号阻塞例2:
信号SIGINT(Ctrl+C)和SIGTSTP(Ctrl+Z)是可以阻塞的,信号SIGQUIT(Ctrl+\)是不可以阻塞;
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
void fun_ctrl_c();
void fun_ctrl_z();
void fun_ctrl_d();
int main()
{int i;sigset_t set,pendset;struct sigaction action;(void) signal (SIGINT,fun_ctrl_c);(void) signal (SIGTSTP,fun_ctrl_z);(void) signal (SIGQUIT,fun_ctrl_d);if(sigemptyset(&set)<0) //初始化set信号集{perror("初始化信号集错误\n");}if(sigaddset(&set,SIGTSTP)<0) //将SIGTSTP信号加入到set{perror("Ctrl+Z加入信号集错误\n");}if(sigaddset(&set,SIGINT)<0) //将SIGINT信号加入到set{perror("Ctrl+C加入信号集错误\n");}if(sigprocmask(SIG_BLOCK,&set,NULL)<0) //信号集加入到当前进程的阻塞集合{perror("加入阻塞集合失败\n");}else{printf("加入到阻塞集合成功\n");for(i=0;i<10;i++){printf("Ctrl+C和Ctrl+Z信号处于阻塞,Ctrl+'\'信号未被阻塞\n");sleep(3);}}if(sigprocmask(SIG_UNBLOCK,&set,NULL)<0) //将当前信号集从阻塞信号集中删除{perror("从阻塞信号集中删除当前信号集失败\n");}
}void fun_ctrl_c() //自定义信号
{int n;printf("\t你已经按了Ctrl+C 系统未处理...");for(n=0;n<4;n++){printf("\t正在处理Ctrl+C信号处理函数");}
}
void fun_ctrl_z() //自定义信号
{int n;printf("\t你已经按了Ctrl+Z 系统未处理...");for(n=0;n<6;n++){printf("\t正在处理Ctrl+Z信号处理函数");}
}
void fun_ctrl_d()
{int n ;printf("\t你已经按了Ctrl+'\' 系统处理了该信号!!\n");for(n=0;n<2;n++){printf("\t正在处理Ctrl+'\'信号处理函数");}
}
※管道
无名管道pipe & FIFO管道(命名管道),都是通过内核缓冲区实现数据的传输;
pipe用于父进程和子进程之间的通信,通过pipe()系统调用创建并打开;
FIFO在磁盘上有对应的结点,但是有数据块,通过mknod()系统调用或mkfifo()函数来建立;一旦建立,任何进程都可以通过文件名将其打开进行读写;
管道实质是一个内核缓冲区,以先进先出的方式从缓冲区写读数据;
无名管道
建立管道用pipe函数,管道操作:
①父进程用pipe开辟管道,得到的两个文件描述符指向管道的两端;
②父进程用fork创建子进程,子进程也有两个文件描述符指向管道两端;、
③父(子)进程关闭读(写) 端,就可以进行写(读)操作;--读read函数 / 写write函数
(1)pipe函数--#include <unistd.h>
int pipe(int filedes[2]);
filedes[0]管道读取端; filedes[1]管道写入端; 成功执行返回0,错误返回-1;
(2)memset函数--#include<string.h>
void *memset(void *s,int c,size_t n);
s指向的内存区域内前n个字节以参数c填入,返回指向s的指针;c虽然声明是int,但是必须是unsigned char,范围在0-255;
例:要求创建一个管道,复制进程【创建子进程】,父进程往管道中写入字符串,子进程从管道中读取前字符串;
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
int main()
{pid_t result; //子进程返回的进程号int r_num;int pipe_fd[2]; //两个文件描述符char buf_r[100],buf_w[100]; //读写字符数组memset(buf_r,0,sizeof(buf_r)); //初始化数组设置为0//if(pipe(pipe_fd)<0){perror("创建管道失败\n");return -1;}result = fork();//创建子进程,复制进程if(result<0){perror("创建子进程失败\n");exit(-1);}else if(result==0) //子进程{close(pipe_fd[1]); //关闭写if((r_num=read(pipe_fd[0],buf_r,100))>0) //进行读{printf("子进程从管道中读取%d个字符,读取的字符内容是:%s\n",r_num,buf_r);}close(pipe_fd[0]); //关闭读exit(0);//正常退出}else //父进程{close(pipe_fd[0]); //关闭读printf("请从键盘输入要写入管道的字符串\n");scanf("%s",buf_w);if(write(pipe_fd[1],buf_w,strlen(buf_w))!=-1) //进行写{printf("父进程向管道写入:%s\n",buf_w);}close(pipe_fd[1]); //关闭写waitpid(result,NULL,0); //waitpid,阻塞父进程,等待子进程退出;exit(0);}
}
注意:空字符不读取;
命名管道
命名管道的名字对应磁盘的索引节点,用该文件名,任何进程都有相应的权限对其进行访问。
创建命名管道的方式:mkfifo()和mknode()函数
例:设计两个程,要求用命名管道FIFO实现简单的聊天功能。
高级管道设计
例:设计一个程序,要求用popen创建管道,实现“ls -l|grep 7-9c”的功能;
//高级管道设计
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
int main()
{FILE *fp; //文件指针int num;char buf[5000]; //字符缓冲区memset(buf,0,sizeof(buf)); //将buf所指向的内存区域的前sizeof(buf)得到>的字节//设置为0,初始化清空的操作printf("建立管道...\n");fp=popen("ls -l","r"); //调用popen函数,建立读管道if(fp!=NULL){num=fread(buf,sizeof(char),5000,fp);/*if(num>0){printf("第一个命令是'ls-l',执行结果如下:\n");printf("%s\n",buf);}*/if(num<0){perror("读命令失败!\n");exit(-1);}pclose(fp);}else{printf("用popen创建管道失败!\n");return 1;}fp=popen("grep insert.c","w"); //建立写管道printf("第二个命令是grep insert.c,运行结果是:\n");fprintf(fp,"%s\n",buf);pclose(fp);return 0;
}
相关文章:

进程通信(IPC-Inter Process Communication)
进程之间的通信通过内核空间实现 IPC技术 ①管道(匿名管道/命名管道-FIFO队列) ②System V IPC(消息队列、信号量和共享内存) ③套接字(UNIX套接字&Internet套接字) ※信号 软中断,信号提供了一种处理异步事件的方法,作为进程通信的一种机制&am…...

idea debug时提示”Method breakpoints may dramatically slow down debugging“的解决办法
问题现象 今天同事喊我过去看一个问题,项目正常启动的时候没问题,debug模式就卡住了,很久不动。我推测是哪个断点导致的,一看断点果然有情况。在方法上打了断点。 解决方式(Android Studio一样的解决) 1、View Brea…...

计算机缺失msvcp100.dll如何解决?教你5种简单高效的修复方法
在现代科技发展的时代,计算机已经成为我们生活和工作中不可或缺的工具。然而,在使用计算机的过程中,我们常常会遇到各种问题和困扰。其中之一就是计算机找不到msvcp100.dll文件。这个问题可能会给我们的生活和工作带来很多不便,下…...

对硬盘的设想2:纸存,硬指针,软指针
“纸存”是设想中的存储器,它只能改写两次:写一次,再改一次,然后就不能再动了。就像拿着钢笔在纸上写字一样,所以叫纸存。 硬指针P、软指针S S abcd S aPcdPx P aPcdPx S aycd ①一个软指针S,指向数据abcd…...

Python在股票交易分析中的应用:布林带与K线图的实战回测
引言 在股票交易的世界中,技术分析是投资者们用来预测市场动向的重要工具。布林带(Bollinger Bands)作为一种动态波动范围指标,因其直观性和实用性而广受欢迎。本文将通过Python代码,展示如何使用布林带结合K线图来分…...

现代密码学-认证、消息认证码
什么是单向散列函数 单向散列函数(one way hash function):一个输入:消息(message),一个固定长度的输出(散列值,hash value),根据散列值检查消息完整性(integrity) 单向散列函数也称为消息摘要…...

在Java中为什么对a赋值为10,在进行a++时还是等于10呢
首先我们看这样一组代码 public class demo1 {public static void main(String[] args) {int a10;aa;System.out.println(a);} } 结果:10不是在第二步有a操作吗?为什么还是10呢? a的执行步骤如下: 保存当前a的值(即10…...

免费数据库同步软件
在信息化日益发展的今天,数据同步成为了企业和个人用户不可或缺的一部分。数据库同步软件作为数据同步的重要工具,能够帮助我们实现不同数据库系统之间的数据复制和同步,确保数据的一致性和完整性。本文将介绍几款免费数据库同步软件…...

如何轻松修改Windows远程连接的端口号
为了增强远程连接的安全性,最好修改默认的远程桌面协议(RDP)端口号。以下步骤将指导您如何修改Windows注册表中的端口设置,并相应地更新防火墙规则。 一、修改注册表中的端口号 打开注册表编辑器: 按下Win R键&#…...

Leetcode 54. 螺旋矩阵(二维数组移动坐标)
54. 螺旋矩阵 使用vis数组记录该位置是否已经被访问 定义一个int型dir来记录方向,0123分别代表右下左上 当越界或碰壁已访问的位置后,修改dir并计算下一个位置 否则根据原dir计算下一个位置 class Solution {public List<Integer> spiralOrder(i…...

深度图的方法实现加雾,Synscapes数据集以及D455相机拍摄为例
前言 在次之前,我们已经做了图像加雾的一些研究,这里我们将从深度图的方法实现加雾展开细讲 图像加雾算法的研究与应用_图像加雾 算法-CSDN博客 接下来将要介绍如何使用深度图像生成雾效图像的方法。利用Synscapes数据集,通过读取EXR格式的…...

QT: 读写ini配置文件(实现qml界面登录,修改)
目录 一.功能介绍 二.暴露属性 三.指定INI文件的路径和格式。 四.登录操作 1.检查INI文件中是否含有登录信息; 2.读取存储的ID; 3.读取存储的密码; 4.成功返回1;失败返回2; 五.修改账号 1.检查INI文件中是否含有登录信…...

DevOps 安全集成:从开发到部署,全生命周期安全守护
目录 一、DevOps 安全集成:为什么要做? 二、DevOps 安全集成:如何做? 三、DevOps 安全集成的优势 四、DevOps 安全集成:一些最佳实践 五、DevOps 安全集成:未来展望 六、思考与建议 七、总结 DevOps…...

R语言数据分析15-xgboost模型预测
XGBoost模型预测的主要大致思路: 1. 数据准备 首先,需要准备数据。这包括数据的读取、预处理和分割。数据应该包括特征和目标变量。 步骤: 读取数据:从CSV文件或其他数据源读取数据。数据清理:处理缺失值、异常值等…...

重构大学数学基础_week04_从点积理解傅里叶变换
这周我们来看一下傅里叶变换。傅里叶变换是一种在数学和许多科学领域中广泛应用的分析方法,它允许我们将信号或函数从其原始域(通常是时间域或空间域)转换到频域表示。在频域中,信号被表示为其组成频率的幅度和相位,这…...

Shell以及Shell编程
Shell的任务 ①分析命令; ②处理通配符、变量替换、命令替换、重定向、管道和作业控制; ③搜索命令并执行。 内部命令:内嵌在Shell中。 外部命令:存在于磁盘上的独立可执行文件。 #!/bin/bash #! 称为一个幻数&…...

从记忆到想象:探索AI的智能未来
引言 人工智能(AI)在信息处理、数据分析和任务自动化等方面展现了强大的能力。然而,在人类独有的记忆和想象力领域,AI仍然有很长的路要走。加利福尼亚大学戴维斯分校的心理学和神经科学教授查兰兰加纳特(Charan Ranga…...

“安全生产月”专题报道:AI智能监控技术如何助力安全生产
今年6月是第23个全国“安全生产月”,6月16日为全国“安全宣传咨询日”。今年全国“安全生产月”活动主题为“人人讲安全、个个会应急——畅通生命通道”。近日,国务院安委会办公室、应急管理部对开展好2024年全国“安全生产月”活动作出安排部署。 随着科…...

【转】ES, 广告索引
思考: 1)直接把别名切换到上一个版本索引 --解决问题 2)广告层级索引如何解决? -routing、join 3)查询的过程:query and fetch, 优化掉fetch 4)segment合并策略 5)全量写入时副…...

Unity学习要点
前言 学习Unity作为游戏开发的强大工具,对于初学者来说,掌握一些基础而实用的技巧是非常重要的。这不仅能帮助你更快地上手,还能在项目开发过程中提高效率。以下是一些Unity初学者的使用技巧,希望能为你的学习之旅提供帮助。 ##…...

简单使用phpqrcode 生成二维码图片
$path ROOT_PATH; //tp项目根路径 require_once $path.vendor/phpqrcode/phpqrcode.php; //加载phpqrcode库 $url http://.$_SERVER[HTTP_HOST]./home/index/detail?id.$param[id]; $value $url; //二维码内容 $errorCorrectionLevel L; //容错级别 $mat…...

软考架构-计算机网络考点
会超纲,3-5分 网络分类 按分布范围划分 局域网 LAN 10m-1000m左右 房间、楼宇、校园 传输速率高 城域网 MAN 10km 城市 广域网 WAN 100km以上 国家或全球(英特网) 按拓扑结构划分 总线型:利用率低、干…...

渗透测试之内核安全系列课程:Rootkit技术初探(三)
今天,我们来讲一下内核安全! 本文章仅提供学习,切勿将其用于不法手段! 目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。在…...

大模型日报2024-06-08
大模型日报 2024-06-08 大模型资讯 AI研究:通过消除矩阵乘法实现高效的大语言模型 摘要: 该AI研究探讨了通过消除矩阵乘法来实现高效且可扩展的大语言模型(LLMs)。此方法旨在提升模型性能,提供更快速和高效的计算方案。 AWS大力投…...

leetcode 1631.最小体力消耗路径
思路:BFS二分 这道题和洛谷上的那个“汽车拉力赛”那道题很相似,但是这道题相较于洛谷那个来说会简单一些。 这里作者一开始写的时候思路堵在了怎么在BFS中用二分,先入为主的以为需要先写出来搜索函数然后再去处理二分的事,但是…...

【ARM64 常见汇编指令学习 19.2 -- ARM64 地址加载指令 ADR 详细介绍】
文章目录 地址加载指令 ADRADR 指令使用场景例子注意事项 地址加载指令 ADR ARMv8 架构引入了一系列的改进和扩展,包括对汇编指令集的更新。在这之中,ADR 指令是一个重要的组成部分,它用于计算并加载一个地址到寄存器。 ADR 指令 ADR 指令…...

vscode输出控制台中文显示乱码最有效解决办法
当VSCode的输出控制台中文显示乱码时,一个有效的解决办法是通过设置环境变量来确保编码的正确性。以下是解决方式: 首先,设置环境变量以修正乱码问题: 如果上述方法没有解决乱码问题,请继续以下步骤: 右键…...

springboot + Vue前后端项目(第十五记)
项目实战第十五记 写在前面1.后端接口实现1.1 用户表添加角色字段1.2 角色表增加唯一标识字段1.3 UserDTO1.4 UserServiceImpl1.5 MenuServiceImpl 2. 前端实现2.1 User.vue2.2 动态菜单设计2.2.1 Login.vue2.2.2 Aside.vue 2.3 动态路由设计2.3.1 菜单表新增字段page_path2.3.…...

如何在Windows 11中恢复丢失的快速访问菜单?这里提供解决办法
序言 在电脑的“快速访问”菜单中找不到固定的项目?或者,整个菜单对你来说已经消失了吗?无论哪种方式,你都可以强制你的电脑恢复菜单并显示其中的所有项目。以下是如何在你的Windows 11电脑上做到这一点。 将文件资源管理器设置为打开到主页 当你在文件资源管理器的左侧…...

变声器软件免费版有哪些?国内外12大热门变声器大盘点!(新)
变声软件是一种人工智能AI音频处理工具,允许用户实时修改自己的声音或改变预先录制的音频。这些软件解决方案可提供不同的效果,如改变声音的音调或速度,或将我们的声音转换成其他人或其他东西的声音,如名人、卡通人物、机器人或不…...