学习 Linux高级编程07_A

UVM验证核心机制与面试高频问题解析 UVM(Universal Verification Methodology)是数字IC验证领域的标准方法学,通过组件化架构和phase机制实现验证环境的自动化构建与执行。其核心原理包括事务级建模(TLM)通信、寄存器模型抽象以及sequence控制策略,能显著提升验证复用性和效率。在芯片开发中,UVM广泛应用于功能验证、覆盖率收集等场景,特别适合处理复杂SoC的验证需求。针对验证工程师面试,phase执行顺序、sequence启动方式和TLM端口连接成为高频考察点,掌握这些技术要点对构建健壮的验证环境至关 阅读详情

回顾:

         1.信号的作用

         2.理解信号:

                   软中断

                   可靠与不可靠 kill-l

         3.信号发送与注册kill/raise alarm setitimer signal

         4.信号的屏蔽sigprocmask sigemptyset sigfillset

         5.信号屏蔽切换

                   sigpending

                   sigsuspend

                            =pause + 指定屏蔽的信号

                   pause与sigsuspend都会被信号中断

                   中断的是pause与sigsuspend,不是进程中其他代码

                  

                   sigsuspend放在sigprocmask环境中思考:

                            5.1sigsuspend是否影响sigprocmask屏蔽的信号呢?

                                     影响,使原来屏蔽信号全部失效

                                     当sigsuspend返回,恢复原来的屏蔽信号

                            5.2sigsuspend什么时候使用?

 

一、最新版本的发送与处理

         sigqueue/sigaction

1.思考:

         信号中断函数调用中是否被其他信号中断。

         信号函数调用中只屏蔽本身信号,不屏蔽其他信号

2.怎么保证函数调用中屏蔽指定的信号呢?

         sigaction可以指定处理函数调用的屏蔽信号

         sigaction在处理信号的时候,接收数据。

         sigqueue发送信号的时候,可以发送数据

         sigaction/sigqueue是signal/kill的增强版本

3.函数说明

         使用sigaction/sigqueue有两个理由。

         3.1稳定

         3.2增强功能

         intsigaction(

         intsig, //被处理信号

         conststruct sigaction *action, //处理函数及其参数

         structsigaction *oldact //返回原来的处理函数结构体

         )

         返回值:

                   0:成功

                   -1:失败

         structsigaction

         {

                   void(*sa_handle)(int);

                   void(*sa_sigaction)(int, siginfo_t*, void*);

                   sigset_t*mask; //屏蔽信号

                   intflags; //SA_SIGINFO

                   void** //保留成员

         }

案例:

         1.使用sigaction处理信号,使用kill发送信号

         2.使用sigaction处理信号,使用sigqueue发送信号

         3.发送信号的同时处理数据。

二、IPC

         1.基于文件

                   1.1无序文件

                   1.2有序文件

                            1.1.1管道

                                     1.1.1.1有名

                                     1.1.1.2匿名

                            1.1.2socket

         2.基于内存

                   2.1无序内存

                            2.1.1匿名内存

                            2.1.2共享内存

                   2.2有序内存

                            2.2.1共享队列

         3.同步:基于内存IPC应用(共享内存数组)

                   信号量/信号灯

三、基于普通文件的IPC

                   IPC的技术提出的应用背景

                   进程之间需要同步处理:

                   同步需要通信

                   普通文件就是最基本的通信手段。

                   普通文件IPC技术问题:

                            一个进程改变文件,另外一个进程无法感知

                   解决方案:

                            一个特殊的文件:管道文件

四、管道文件

         1.创建管道文件mkfifo()

         2.体会管道文件特点

案例:

         fifoA          fifoB

         建立管道        

         打开管道         打开管道

         写数据              度数据

         关闭管道         关闭管道

         删除管道

        

         建立管道文件方法:

                   使用Linux的指令mkfifo

总结:

         1.read没有数据read阻塞,而且read后数据是被删除

         2.数据有序

         3.打开的描述符号可以读写(two-way双工)

         4.管道文件关闭后,数据不持久。

         5.管道的数据存储在内核缓冲中。

                  

五、匿名管道

                   发现有名的管道的名字紧紧是内核识别是否返回同一个fd(文件描述符)的标识

                   所以当管道名失去表示作用的时候,实际可以不要

                   在父子进程之间:打开文件描述符后创建进程。

                   父子进程都有描述符。管道名没有价值。

                   所以在父子进程中引入一个没有名字的管道:匿名管道

结论:

         匿名管道只能使用在父子进程。

         1.创建匿名管道

         2.使用匿名管道

案例:

         匿名管道的创建

         体会匿名管道的特点

         intpipe(int fd[2]); //创建一个管道打开管道拷贝管道关闭读写

         fd[0]:只读(不能写)

         fd[1]:只写(不能读)

         注意:数据无边界。

综合:

         建立两个子进程:

         一个负责计算1-5000的素数

         另外一个负责计算5001-10000的素数

         父进程负责存储

 

 

 

Sigmask.c

#include<stdio.h>

#include<stdlib.h>

#include<signal.h>

#include<unistd.h>

 

main()

{

         int  sum = 0;

         int  i;

         for(i  = 0; i < 10; i ++)

         {

                   sum  += i;

                   sleep(1);  //模拟业务处理时间比较长

         }

         printf("%d\n",  sum);

         printf("over\n"):

}

makefile

sigmask:

         gcc  sigmask.c -o sigmask

#include<stdio.h>

#include<stdlib.h>

#include<signal.h>

#include<unistd.h>

 

void handle(int s)

{

         printf("signal  disturb!!\n");

}

 

main()

{

         int  sum = 0;

         int  i;

         signal(SIGINT,  handle);

         for(i  = 0; i < 10; i ++)

         {

                   sum  += i;

                   sleep(1);  //模拟业务处理时间比较长

         }

         printf("%d\n",  sum);

         printf("over\n"):

}

上面for循环中,随时可能中断。

#include<stdio.h>

#include<stdlib.h>

#include<signal.h>

#include<unistd.h>

 

void handle(int s)

{

         printf("signal  disturb!!\n");

}

 

main()

{

         int  sum = 0;

         int  i;

                  

         sigset_t  sigs; //屏蔽步骤1 定义信号集

         sigemptyset(&sigs);  //屏蔽步骤2 清空信号集

         sigaddset(&sigs,  SIGINT); //屏蔽步骤3 添加被屏蔽的信号

 

         signal(SIGINT,  handle);

         sigprocmask(SIG_BLOCK,  &sigs, 0);//屏蔽步骤4 添加被屏蔽的代码块开始

         for(i  = 0; i < 10; i ++)

         {

                   sum  += i;

                   sleep(1);  //模拟业务处理时间比较长

         }

         printf("%d\n",  sum);

         sigprocmask(SIG_UNBLOCK,  &sigs, 0);//屏蔽步骤4 添加被屏蔽的代码块结束

         printf("over\n"):

}

在程序执行过程中多次的信号被压缩为一次

 

Suspend.c

#include<stdio.h>

#include<stdlib.h>

#include<signal.h>

#include<unistd.h>

 

void handle(int s)

{

         printf("signal  disturb!!\n");

}

 

main()

{

         sigset_t  sigs;

         sigemptyset(&sigs);

        

         signal(SIGUSR1,  handle);

        

         sigsuspend(&sigs);  //挂起

         printf("over\n"):

}

#include<stdio.h>

#include<stdlib.h>

#include<signal.h>

#include<unistd.h>

 

main()

{

         sigset_t  sigs;

         sigemptyset(&sigs);

 

         sigsuspend(&sigs);  //挂起

         printf("over\n"):

}

#include<stdio.h>

#include<stdlib.h>

#include<signal.h>

#include<unistd.h>

 

main()

{

         pause();

         printf("over\n"):

}

#include<stdio.h>

#include<stdlib.h>

#include<signal.h>

#include<unistd.h>

 

void handle(int s)

{

         printf("signal  disturb!!\n");

}

 

main()

{

         sigset_t  sigs;

         sigemptyset(&sigs);

         sigaddset(&sigs,  2);

         sigaddset(&sigs,  10);

         signal(SIGUSR2,  handle);

        

         sigsuspend(&sigs);  //挂起

         printf("over\n"):

}

#include<stdio.h>

#include<stdlib.h>

#include<signal.h>

#include<unistd.h>

 

void handle(int s)

{

         printf("signal  disturb!!\n");

}

 

main()

{

         int  sum = 0;

         int  i;

                  

         sigset_t  sigs, sigt;

         sigemptyset(&sigs);

         sigemptyset(&sigt);

         sigaddset(&sigs,  SIGINT);

        

         signal(SIGINT,  handle);

         sigprocmask(SIG_BLOCK,  &sigs, 0);

         for(i  = 0; i < 10; i ++)

         {

                   sum  += i;

                   sleep(1); 

                   sigsuspend(&sigt);

         }

         printf("%d\n",  sum);

         sigprocmask(SIG_UNBLOCK,  &sigs, 0);

         printf("over\n"):

}

Demo41.c

#include<stdio.h>

#include<stdlib.h>

#include<signal.h>

#include<unistd.h>

 

void handle(int s)

{

         printf("out  copy over !\n");

}

 

main()

{

         int  sum = 0;

         int  i;

                  

         sigset_t  sigs, sigt;

         sigemptyset(&sigs);

         sigemptyset(&sigt);

         sigaddset(&sigs,  SIGINT);

        

         signal(SIGINT,  handle);

        

         for(i  = 0; i < 10; i ++) //可能中断,导致刚要指向就中断

         {

                   sigprocmask(SIG_BLOCK,  &sigs, 0); //存在漏洞

                   sum  += i;

                   printf("copy  start\n");

                   sleep(5);

                   sigprocmask(SIG_UNBLOCK,  &sigs, 0);

                   printf("copy  over\n")

                   sigsuspend(&sigt);

         }

         printf("%d\n",  sum);

        

         printf("over\n"):

}

#include<stdio.h>

#include<stdlib.h>

#include<signal.h>

#include<unistd.h>

 

void handle(int s)

{

         printf("out  disturb start!\n");

         sleep(3);

         printf("out  disturb end!\n");

}

 

main()

{

         int  i;

                  

         sigset_t  sigs, sigt,sigu;

         sigemptyset(&sigs);

         sigemptyset(&sigt);

         sigemptyset(&sigu);

         sigaddset(&sigs,  SIGINT);

        

         signal(SIGINT,  handle);

         sigprocmask(SIG_BLOCK,  &sigs, 0)

         for(i  = 0; i < 10; i ++)

         {

                   printf("copy  start %d\n", i);

                   sleep(5);

                   printf("copy  end %d\n", i)

                   sigpending(&sigu);

                   if(sigismember(&sigu,  SIGINT))

                   {

                            sigsuspend(&sigt);

                   }

 

         }

         printf("all  copy over", sum);

         sigprocmask(SIG_UNBLOCK,  &sigs, 0)

         printf("over\n"):

}

linux学习书籍推荐linux学习书籍推荐 网上看到的,做个标记。没研究过,仅供参考 linux编程学习 inux 学习书目推荐 Linux基础 1、《Linux与Unix Shell 编程指南》 C语言基础 1、《C Primer Plus,5th Edition》【美】Stephen Prata著 2、《The C Programming Language, 2nd Edition》【美】Brian W. Kern... 阅读详情

相关推荐

Linux系统编程学习路线图

编写一个多进程程序,父进程创建多个子进程,子进程分别执行不同的任务(如计算、打印等),并通过进程间通信机制实现数据共享和同步。掌握程序性能优化的方法和技巧,包括代码优化(如算法优化、数据结构优化等)、内存管理优化(如减少内存泄漏、优化内存分配策略等)、开发一个简单的实时控制系统,如一个温度控制系统,能够实时监测温度并根据设定值进行控制调节,保证系统的实时响应性能。编写一个简单的内核模块,实现一个自定义的系统调用,用于获取系统当前的某些状态信息(如进程数量、内存使用情况等)。

seanzhao2024的博客 1482

Linux环境进程间通信(二):信号(上)

Linux环境进程间通信(二):信号(上)内容:信号及信号来源信号的种类进程对信号的响应信号的发送信号的安装(设置信号关联动作)信号集及信号集操作函数信号阻塞与信号未决参考资料关于作者

Sah的Blog搬家了!新地址为:sah-lee.51.net 2029

怎样学习LINUX编程 如何入门【多篇文章整理集合】

Linux下开发学习步骤  1、先熟悉linux系统的常用命令。  2、深入学习emacs或者vim。值得你花半年时间系统学习!以后我们就是用这个编辑器来写程序的了,经过配置,emacs完完全全就是一个IDE了,像代码跳转,自动补齐(智能感应)以及其他的一些好用功能。  3、学习makefile的编写。因为我们是用makefile来组织我们的程序的就像vc6里头又dsp/dsw文件一样(当然也vc自己的makefile)。有些好的工具能帮助我们编写可以移植的makefile,如autoconf等。  4、学

2572

linux 信号signal和sigaction理解

今天看到unp时发现之前对signal到理解实在浅显,今天拿来单独学习讨论下。 signal,此函数相对简单一些,给定一个信号,给出信号处理函数则可,当然,函数简单,其功能也相对简单许多,简单给出个函数例子如下: 1 #include 2 #include 3 #include 4 5 void ouch(int sig) 6 { 7

简单生活 4万+

linux高级编程

b 块设备文件 block test -b /dev/sda --- 硬盘。/bin/bash --- 表示当前这个shell脚本用哪个shell来解释执行。/bin/bash //编辑文件 shebang。2.编写脚本 //#!4. ./XX.sh //执行文件。//条件的生成 --test的命令 //注意: test 执行结果为真 0。

2301_81028188的博客 712

全面Linux高级编程开发教程

进程是操作系统中最重要的概念之一,它是程序的一次执行过程,是系统进行资源分配和调度的一个独立单位。每个进程都有自己的地址空间,并且使用系统资源(如CPU、内存、文件、I/O等)。进程具有以下基本特性:并发性:多个进程可以在单个CPU上并发执行,通过时间片轮转的方式,实现宏观上的并行处理。动态性:进程是动态创建、执行和消亡的。操作系统为每个进程分配运行时所需的资源,进程执行完毕后资源被释放。独立性。

weixin_42581003的博客 842

Linux信号简介

一、信号及信号来源 信号本质 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

华清远见 | 程序员的学习天堂 828

KiCad自动布线实战:FreeRouting插件安装与使用指南

在PCB设计流程中,布线环节往往占据大量重复性工作,尤其对于中小型双面板,成百上千条飞线的手动连接既繁琐又易出错。自动布线技术通过算法在给定设计规则和元件布局的基础上自动规划走线路径,能显著提升布线效率。FreeRouting作为一款开源自动布线器,与KiCad通过DSN/SES标准中间格式无缝配合,让工程师将精力集中于关键信号和布局优化,而将常规网络交给工具处理。本文从自动布线的原理与边界出发,讲解了FreeRouting的安装、DSN导出、参数设置、自动布线及结果回传的完整流程,并结合实际案例展示了在S

weixin_32025789的博客 277

Linux下高级C编程(学习总结)

Linux下高级C编程 第一章 unix/linux系统的基本概念 第二章 unix/linux系统下的编程基础和开发方式 第三章 unix/linux系统下的内存管理 第四章 unix/linux系统下的文件管理和目录操作 第五章 unix/linux系统下的进程管理 第六章 unix/linux系统下的信号处理 第七章 unix/linux系统下的进程间通信 第八章 unix/linux系统下的网络编程 第九章 unix/linux系统下的多线程编程 文章目录Linux下高级C编程前言一、linu

weixin_39688262的博客 3480

Delft3D从入门到实践:安装、编译与首次模拟指南

本文为Delft3D初学者提供了一份详尽的从零开始指南。内容涵盖软件获取、许可证申请、图形界面安装、核心计算内核的编译环境搭建与编译步骤,以及最终整合运行首个水动力模拟的全流程。重点解决了Windows系统下Delft3D安装与编译的常见问题,帮助用户快速上手这一开源水动力与泥沙输运模拟工具。

weixin_29303701的博客 538

Ubuntu20.04下Docker无缝升级实战指南

本文提供了一份在Ubuntu20.04系统上安全、无缝升级Docker的实战指南。文章详细阐述了升级前的版本检查、数据备份等准备工作,逐步演示了通过APT包管理器进行升级或指定版本安装的操作步骤,并强调了升级后的验证与常见问题回滚方案,确保业务容器平稳过渡。

postgres8guard的博客 478

【Linux】Linux学习路线图:如何系统地学习Linux,从基础到高级

学习Linux操作系统是一项有价值的技能,无论是系统管理员、开发人员还是数据科学家,掌握Linux都能极大地提升工作效率。本文将提供一个系统的学习路线图,从基础到高级,帮助你全面掌握Linux操作系统。

科技改变人类,技术成就未来 5052

python:实现矩阵SVD分解(附完整源码)

python:实现矩阵SVD分解(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 603

Linux 编程学习书籍

Linux 入门书籍。Linux 进阶书籍。

云满笔记 2877

某联达OA任意用户登录漏洞复现

由于`/WebService/Lk6SyncService/DirectToOthers/GetSSOStamp.asm`j接口未作限制,导致可以通过该接口调用`admin`的`cookie`值,通过对`LoginCredence`和`LoginTimestamp`的参数修改,进而实现任意登录进去系统.

千寻的博客 1589

硬件基础知识-电机知识

步进电机存在空载启动频率,所以步进电机可以低速正常运转,但若高于一定速度时就无法启动,并伴有尖锐的啸叫声;在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数。给电机两根线供电,电机就可以旋转,给正电压,电机正转,给相反电压,电机反转;电压越大,电机转得越快,电压越小,转速也变小。是一种直流电机,有刷电机的定子上安装有固定的主磁极和电刷,转子上安装有电枢绕组和换向器。控制器:使用专用的电子控制器来监测和控制电机的转速、电流和方向。线圈电流方向的交替变化是随电机转动的换相器和电刷来完成的。

weixin_46969363的博客 2295

Linux高级编程学习笔记、文件编程、标准IO、文件IO

1、实现用户应用程序的两条路径:a、直接使用操作系统直接提供的函数(系统调用--操作系统内核提供的函数)b、使用“库函数”库函数方式:标准C库,功能丰富,看不到源代码有安全风险C库中的相关文件操作的函数 -- 标准IO (Input Output)系统调用方式:简单,看得到源代码标准io;stdio.h。

Ricky111zzz的博客 1345

c\c++: Identifiers, modifier, qualifier, specifier, decorator; systemtap

文章目录参考英语含义在c、C++ 参考 c++ 标准 https://blog.youkuaiyun.com/tyronne/article/details/44016621 英语含义 modifier word or phrase that modifies (modify 2) another word or phrase 修饰语. qualifier (grammar) word, esp an adjective or adverb, that qualifies another word 修饰词; (尤指)形

mzhan017的博客 2427

linux高级编程学习心得

linux高级编程

weixin_57759804的博客 578

手把手完整实现STM32+LORA组网网关+机智云平台+手机APP应用———第一节- 一主多从的LORA本地组网通信-实现从机采集温湿度与主机显示数据

本教程为《手把手实现STM32+LORA组网网关+机智云平台+手机APP应用》第一节。实现一个主机,两个从机的LORA组网通信。两个从机采集温湿度数据并通过LORA传输数据到主机,然后主机接收到两个从机数据后进行数据显示,本节通过PC串口助手显示两个从机的数据。 下一节将其主机接收的数据通过WIFI网关(ESP8266)传到机智云平台与手机APP。 本文讲解一主多从的LORA本地组网通信,串口助手进行数据展示。使用硬件主要包括:STM32F103C8T6最小系统板(3个)、正点原子LORA模块ATK-L

嵌入式阿齐Archie 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux环境编程(高级编程)

基于Linux操作系统这个环境,编程。分为以下四个模块:文件编程多任务编程(进程,线程)网络编程网页+数据库例:网易.mp3把歌曲保存成mp3这个文件 //文件编程歌曲从服务器传输到本地 //网络编程听歌的同时,可以聊天,可以玩游戏 //多任务编程目标:实现应用的功能使用Linux 系统提供的一些函数来实现功能学习的方式方法:1.Linux提供的这些函数---该怎么用?

m0_63067779的博客 956

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

探索Linux编程的深度:《Linux高级程序设计中文第三版》资源推荐

探索Linux编程的深度:《Linux高级程序设计中文第三版》资源推荐 【下载地址】Linux高级程序设计中文第三版资源下载 - **文件名**: Linux高级程序设计中文第三版.pdf- **格式**: PDF- **特点**: 高清晰度,带有书签- **适用对象**: 对Linux编程感兴趣的学习者 ...

gitblog_09708的博客 675

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

为什么要学习 Linux 环境下的编程

为什么要学习 Linux 环境下的编程   Linux 是一个开放、灵活、跨平台的操作系统,上至庞大的数据中心,下至可放于掌心中的嵌入式设备,无处没有 Linux 的身影。更为重要的是, Linux 是一个与 Unix 既一脉相承又与时俱进的系统。可以说,上世纪70年代学习的 Unix 知识和技巧,在今天仍然大有用武之地,这与 Windows 平台的开发形成了鲜明的对比。程序员不用担心今天微软出

粤嵌 1531

Linux07——高级篇

文章目录Linux07——高级篇一、日志管理1. 基本介绍2. 系统常用的日志2.1 日志位置2.2 系统常用的日志3. 日志管理服务`rsyslogd`1. 查询rsyslogd服务是否启动2. 查询rsyslogd服务的自启动状态3. 配置文件:/etc/rsyslog.conf3.1 日志类型3.2 日志级别4. 日志文件内容详细介绍5. 自定义日志保存起来4. 日志轮替4.1 参数说明4.2 把自己的日志加入日志轮替4.3 案例5. 查看内存日志二、定制自己的Linux系统1. 基本介绍2. 基本原

Jerry&Crj的博客 1063
上一篇: 学习 Linux高级编程06_B
下一篇: 学习 Linux高级编程07_B
dblion
博客等级 码龄16年 23粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值