Linux系统编程--信号与管道

news2024/11/16 17:54:06

1、信号与管道是什么?

首先了解信号与管道的意义,我们需要了解Linux系统中进程之间是如何通信的。Linux操作系统下,以进程为单位来分配或者管理资源,进程之间不能直接访问资源,因此,要求进程间的资源和信息共享就意味着进程之间能够相互通信。这就是通信机制:信号、管道。

2、进程通信的目的?

数据传输、共享数据、通知事件、资源共享、进程控制

3、何为通信机制?

了解该机制需要明白进程是如何来互相通信的,Linux支持多种进程间的通信,IPC机制,包括共享内存、消息队列、信号量、网络通信。

好了,介绍完这些需要了解的知识后进入正题!

一、信号

信号是一种异步的通知机制,用于在软件层面模拟中断机制。当一个进程收到信号时,其行为类似于处理器接收到一个中断请求,信号属于一种软中断方式

操作:

1.查看信号:kill -l

不可靠信号:1-31

可靠信号:34-64

9 号(SIGKILL),19 号(SIGSTOP) 不允许被忽略,也不允许被改造

杀死进程:Ctrl + C [ (2)、SIGINT ]

                  Ctrl + \  [ (3)、SIGQUIT ]

                KILL [ (9)、SIGKILL ]  kill-sig pid   sig信号

内核:当我们的程序出现一些错误的时候,例如段错误等,内核会给我们的进程发送杀死当前进程的信号。

程序:通过函数发送信号:kill

2、给进程发送信号:kill
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
形参:
        pid -- 你要给哪一个进程发送信号
        sig -- 信号(可以写编号,也可以写后面的宏定义)
返回值:
成功返回 0,失败返回-1
特殊信号:
        9 -- SIGKILL -- 杀死进程,不可以被忽略或者改造;
        14 -- SIGALRM -- 闹钟信号,杀死进程
        17 -- SIGCHLD -- 只要子进程状态发生改变,父进程就能接收到该信号
        18 -- SIGCONT -- 恢复 19 号 信号 暂停 的进程
        19 -- SIGSTOP -- 暂停进程
3、给自己发送信号:raise
#include <signal.h>
int raise(int sig);
形参:
sig -- 信号
等价于:
kill(getpid(),sig);
4、计时杀死进程:alarm
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
形参:
seconds 秒数
功能:
设置闹钟,闹钟事件到,产生闹钟信号,闹钟信号默认杀死当前进程;
如果在该 alarm 之前,已经设置过闹钟,此时闹钟会给更新
返回值:
如果上一次设置的有闹钟,返回上一个闹钟的剩余时间,否则返回 0;
5、产生信号再接触阻塞状态:pause
#include <unistd.h>
int pause(void);
只要运行,就阻塞,直到有一个信号产生,才会解除阻塞
6、信号处理函数:signal
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
形参:
signum -- 要处理的信号
handler -- SIG_DFL -- 默认处理
-- SIG_IGN -- 忽略处理
-- 函数 指针 -- 捕获到该信号,执行函数指针对应的函数
具体用法:
signal(2,SIG_DFL); 默认处理
signal(2,SIG_IGN); 忽略处理
signel(信号,Fun);
捕获到信号,执行 Fun 函数
7、注册退出清理函数:atexit
#include <stdlib.h>
int atexit(void (*function)(void));
//形参:函数指针
void Clean(void)
{
printf(“%s 被运行\n”,__FUNCTION__);
}
int main()
{
atexit(Clean);//注册退出清理函数,在 main 函数退出的时候,直到自动运行 Clean 函数
}

二、管道

管道(Pipe)是一种常见的进程间通信(IPC)机制,它允许两个进程通过一个半双工的通道进行数据传输。它作为两个进程之间的数据传输媒介。管道的一端连接一个写进程,另一端连接一个读进程

创建和使用

  • 创建匿名管道通常使用pipe()系统调用。
  • 使用fork()创建子进程后,父进程写入管道,子进程从管道中读取数据。
  • 写入管道通常使用write()系统调用,而读取管道通常使用read()系统调用。
管道的特点:
属于半双工通信;
管道正常的情况下,管道中没有内容, read 会阻塞
管道文件和普通的文件的区别:
管道的内容,一旦读走,就没有了
管道文件不允许使用 lseek 等光标偏移的函数
管道一定遵循先进先出的原则
管道有大小:
64k         64 * 1024 = 65536 字节
1、无名管道
适用于父子进程之间的通信;
没有名字的管道,没有 真正的介质文件存在 ,仅仅以 文件描述符 的形式可以让我们操作;
创建:pipe
#include <unistd.h>
int pipe(int pipefd[2]);
形参:
pipefd -- 整型数组,2 个元素
pipefd[0]:存放的管道的读端的文件描述符
pipefd[1]:存放的管道的写端的文件描述符
返回值:
成功返回 0,失败返回-1;
用法:
int fd[2] = {0};
pipe(fd);  fd[0]  fd[1]
创建子进程,也得有管道,问题:先创建子进程还是先创建管道?
先创建管道,子进程复制父进程资源(包含管道),

2、有名管道
1. 创建管道文件 .fifo
2. 打开管道文件 open
3. 读写 write read
4. 关闭 close
3、创建管道文件:mkfifo
#include <sys/stat.h>
#include<sys/types.h>
int mkfifo(const char * pathname,mode_t mode)
参数
pathname:要创建的 FIFO 文件的名字(路径+名字 以.fifo 结尾)
mode: 创建的 FIFO 文件的权限
真正的权限:mode &(~umask)
返回值
成功返回 0,失败(如果管道文件原本存在,直接返回失败)返回-1。
4、打开管道文件:open
int fd = open(char *pathname,int flag);
flag 只能在 O_RDONLY 和 O_WRONLY 中选择其一;
open 函数在打开管道文件的时候,必须两方都执行 open,open 才能打开,只有一个进程执行 open,open 会发生阻塞,直到另外的一个进程也运行到 open 的位置,两方同时解除阻塞
5、有名管道的删除:
int unlink(const char * pathname)
#include <unistd.h>
参数
pathname:要删除的 FIFO 文件的名字(带路径)
返回值:
成功返回 0,失败返回-1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1630472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows服务启动提示‘服务没有响应控制功能’(mysql启动报错)

在安装mysql的时候&#xff0c;在windows服务项启动 或 使用命令net start mysql 时启动是报错&#xff0c;提示 服务没有响应控制功能 发生原因&#xff1a; Windows10 x64 或 更高的操作系统&#xff0c;有些系统缺少一些组件 解决办法&#xff1a; 1、下载最新的 Microsoft …

软文伪原创工具有哪些,推荐3款强大的软文伪原创工具

软文作为一种重要的营销和传播手段&#xff0c;受到了越来越多的关注。而随着科技的不断发展&#xff0c;各种软文生产的工具相续出现&#xff0c;如&#xff1a;软文伪原创工具&#xff0c;它能为人们提供便捷、高效的文章生产方式&#xff0c;也及可以节省文章写作的时间与精…

JAVA基础面试题(第十篇)下! 集合与数据结构

JAVA集合和数据结构也是面试常考的点&#xff0c;内容也是比较多。 在看之前希望各位如果方便可以点赞收藏&#xff0c;给我点个关注&#xff0c;创作不易&#xff01; JAVA集合 21. ConcurrentHashMap 的并发度是多少&#xff1f; 在JDK1.7中&#xff0c;并发度默认是16&a…

云渲染一张图多少钱

使用云渲染渲染一张效果图的价格没法确定多少钱一张&#xff0c;云渲染一张图的价格会受到多个因素的影响&#xff0c;如云渲染平台的定价策略、所选的渲染配置、优惠政策以及你提交的场景任务等。因此&#xff0c;无法给出确切的单一价格。 不同的云渲染平台会有不同的定价模…

HackMyVM-Slackware

目录 信息收集 arp-scan nmap nikto whatweb WEB web信息收集 gobuster wfuzz hydra ssh连接 提权 系统信息收集 get root 信息收集 arp-scan ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7b, IPv4…

PDF高效编辑器,一键转换将PDF文件转换成HTML文件,开启文件处理新篇章!

文件格式的转换与处理已成为我们日常工作中不可或缺的一部分。为了满足广大用户对高效、便捷文件处理的需求&#xff0c;我们荣幸地推出了全新的PDF高效编辑器——PDF到HTML一键转换工具&#xff01;这款工具将为您带来前所未有的文件处理体验&#xff0c;让您轻松驾驭文件格式…

vite+vue3配置less

在Vite项目中配置LESS&#xff0c;你需要安装相关的插件&#xff0c;并在Vite配置文件中进行配置。以下是步骤和示例代码&#xff1a; 安装LESS和LESS插件&#xff1a; npm install less --save-dev npm install less-loader --save-dev 在Vite配置文件中&#xff08;通常是v…

本地生活服务平台有哪些?哪个靠谱?

随着多家互联网大厂的本地生活服务布局日益展开&#xff0c;不少人都看到了其中的巨大市场缺口和广阔前景&#xff0c;想要入驻本地生活服务平台&#xff0c;瓜分这块巨大的蛋糕。而在当下这个选择大于努力的时代&#xff0c;能否分到蛋糕以及分到多少蛋糕的关键&#xff0c;就…

【Java数据结构】深入解析ArrayList与顺序表

【Java数据结构】深入解析ArrayList与顺序表 1.前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.ArrayList的介绍 3.使用ArrayList 3.1 ArrayList的构造方法 3.11 第一个构造方法 3.12第二个构造方法 3.13第三个构造方法 3.2ArrayList中的tostring方…

vue2[黑马笔记]

vue基础 是什么—javascript框架 构建用户界面的前端框架 1.构建用户界面用vue往html页面中填充数据 2.框架现成的解决方案&#xff0c;遵守框架的规范去实现自己的业务功能学习vue 就是学习vue框架中规定的用法vue的指令组件&#xff08;对ul结构的复用&#xff09;&#x…

STM32G431RBT6之LCD与LED配置

首先,配置时钟树,时钟树的配置在我的另外一篇博客里,这里不再赘述. LCD与LED具有共同的IO口,同时创建工程较好. 打开原理图,发现LED的IO口是PC8~PC15,还有一个容易看漏的PD2.LCD的IO口是PC0到PC15. 当然,看产品手册也可以知道,但是还是推荐大家看原理图. 打开cubumx,给PC0~PC…

openjudge_2.5基本算法之搜索_1998:寻找Nemo

题目 1998:寻找Nemo 总时间限制: 2000ms 内存限制: 65536kB 描述 Nemo 是个顽皮的小孩. 一天他一个人跑到深海里去玩. 可是他迷路了. 于是他向父亲 Marlin 发送了求救信号.通过查找地图 Marlin 发现那片海像一个有着墙和门的迷宫.所有的墙都是平行于 X 轴或 Y 轴的. 墙的厚度可…

linux开发板开机启动向日葵

硬件&#xff1a;orangepi 5 pro 操作系统&#xff1a;ubuntu 20.4 lts 安装向日葵 根据我的实测&#xff0c;arm架构的ubuntu系统只能安装向日葵提供的麒麟系统的那个版本&#xff0c;具体安装方式官网下载页面有 允许任意用户连接到 X11 使用root用户登录后打开终端输入一下…

中仕公考:这几类人不能考公务员

拥有以上五类行为的学生无法参加公务员考试&#xff0c;当然这些只是基本的不能报考公务员的类别&#xff0c;现在各地区还会根据自己的情况调整范围&#xff0c;具体要以各地的公告为主。

电脑的无用设置功能(建议关闭)

目录 1、传递优化 ​2、常规​ 3、电源 1、传递优化 2、常规3、电源

【Kylin】V10系统在VMware中分辨率太小,无法通过GUI修改分辨率的解决方法

【Kylin】V10系统在VMware中分辨率太小&#xff0c;无法通过GUI修改分辨率的解决方法 解决办法1.打开终端方法1&#xff1a;方法2 2.输入 xrandr 命令&#xff0c;查询分辨率支持的列表3.选择适合的分辨率 。 例如&#xff1a;xrandr -s 1440x900_60 问题如下图&#xff1a; 保…

重要文件夹怎么加密?文件夹加密软件哪个更好?

文件夹是电脑重要的数据管理工具&#xff0c;可以避免电脑数据混乱。而为了保护文件夹的数据安全&#xff0c;我们需要加密保护重要文件夹。那么&#xff0c;重要文件夹怎么加密呢&#xff1f;下面我们就来了解一下。 文件夹加密超级大师 说起文件夹加密&#xff0c;文件夹加密…

通义千问再开源!推出最大尺寸1100亿参数模型

4月28日消息&#xff0c;通义千问开源1100亿参数模型Qwen1.5-110B&#xff0c;成为全系列首个千亿级参数开源模型&#xff0c;并在多项基准测评中都创下可与Llama3-70B媲美的成绩。目前Qwen1.5系列已累计开源10款大模型&#xff0c;通义千问开源模型下载量超过700万。 通义千问…

【C#】.net core 6.0 MVC返回JsonResult显示API接口返回值不可被JSON反序列化

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景API接口接口代码请求失败原因排查调通效果 常见返回类型相关文章 …

python文件 成绩分析

‘’文件score.txt中存储了学生的考试信息,内容如下 小明,98 小刚,90 小红,91 小王,98 小刘,80 请写代码,读取文件数据,并进行如下分析 最高分和最低分分别是多少&#xff1f;得最高分的学生有几个&#xff1f; 得最低分的学生有几个平均分是多少&#xff1f; ‘’’ def rea…