【Linux-Day8- 进程替换和信号】
进程替换和信号
问题引入

我们发现 终端输入的任意命令的父进程都是bash,这是因为Linux系统是用fork()复制出子进程,然后在子进程中调用替换函数进行进程替换,实现相关命令。
(1) exec 系列替换过程:pcb 使用以前的只修改,进程实体更换。

进程替换函数
#include <unistd.h>
int execl( const char * path, const char * arg,…);
/*
*path:新替换的程序的路径名称
*arg :传给新程序主函数的第一个参数,一般为程序的名字
*arg 后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数
*/
int execlp( const char * file, const char * arg,…);/*
int execlp( const char * file, const char * arg,…);
/*
*file:新替换的程序的名称
*arg :传给新程序主函数的第一个参数,一般为程序的名字
*arg 后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数
*/
int execle( const char * path, const char * arg,…, char * const envp[]);
/*
*path:新替换的程序的路径名称
*arg :传给新程序主函数的第一个参数,一般为程序的名字
*arg 后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数*const envp[] : 存放环境变量
*/
int execv( const char * path, char * const argv[]);
/*
*path:新替换的程序的路径名称const argv[] :存放命令参数的指针数组
*/
int execvp( const char * file, char * const argv[]);
/*
*file: 新替换的程序的名称const argv[] :存放命令参数的指针数组
*/
int execve( const char * path, char * const argv[], char * const envp[]);
/*
*path:新替换的程序的路径名称const argv[] :存放命令参数的指针数组
*const envp[] : 存放环境变量
*/
使用模板如下
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<unistd.h>
#include<string.h>
#include <sys/wait.h>
int main(int agrc,char*argv[],char*envp[]){printf("main pid=%d \n",getpid() ); assert(pid!=-1);if(pid==0){printf("child pid=%d,ppid=%d\n",getpid(),getppid());//1. execl("/bin/ps","ps","-f",(char*)0);//2. execlp("ps","ps","-f",(char*)0);//3. execle("/usr/bin/ps","ps","-f",(char*)0,envp);char* myargv[]={"ps","-f",0};//4. execv("/usr/bin/ps",myargv);//5. execvp("ps",myargv);//6. execve("/usr/bin/ps",myargv,envp); exit(0);} exit(0);
}
Linux 信号的使用
信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。
与信号有关的系统调用在“signal.h”头文件中有声明
常见信号的值,及对应的功能说明

信号的值在系统源码中的定义如下:
- #define SIGHUP 1
- #define SIGINT 2 //键盘按下 Ctrl+c 时,会产生该信号
- #define SIGQUIT 3
- #define SIGILL 4
- #define SIGTRAP 5
- #define SIGABRT 6
- #define SIGIOT 6
- #define SIGBUS 7
- #define SIGFPE 8
- #define SIGKILL 9 //该信号的响应方式不允许改变
- #define SIGUSR1 10
- #define SIGSEGV 11
- #define SIGUSR2 12
- #define SIGPIPE 13 //读端关闭的描述符,写端写入时产生,该信号会终止程序
- #define SIGALRM 14
- #define SIGTERM 15 //系统 kill 命令默认发送的信号
- #define SIGSTKFLT 16
- #define SIGCHLD 17 //子进程结束后,会默认给父进程发送该信号
- #define SIGCONT 18
- #define SIGSTOP 19
- #define SIGTSTP 20
- #define SIGTTIN 21
- #define SIGTTOU 22
- #define SIGURG 23
修改信号的响应方式 – 调用signal()
typedef void (*sighandler_t)(int); //函数指针类型重命名
**sighandler_t ** signal(int signum, sighandler_t sig_fun)
/*
signum : 处理的信号
sig_fun :处理信号的函数
1.SIG_IGN 忽略
2.SIG_DFL 默认
3.自定义:自己写处理信号的函数
示例代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
void fun(int signum)
{printf("Call fun \n");
}int main()
{signal(SIGINT,fun);while(1){sleep(1);printf("Hello\n");}exit(0);
}
运行结果

发送信号 – kill()
kill() 可以向指定的进程发送指定的信号:
int kill(pid_t pid, int sig);
pid > 0 指定将信号发送个那个进程
pid == 0 信号被发送到和当前进程在同一个进程组的进程
pid == -1 将信号发送给系统上有权限发送的所有的进程
pid < -1 将信号发送给进程组 id 等于 pid 绝对值,并且有权限发送的所有的进程。
sig 指定发送信号的类型。
示例代码:
1.mykill.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>int main(int argc,char* argv[])
{if(argc != 3){printf("argc error\n");exit(1);}int pid = atoi(argv[1]);int sig = atoi(argv[2]);if(kill(pid,sig) == -1){printf("kill error\n");}exit(0);
}
2.test1.c
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<unistd.h>
#include<string.h>
#include<signal.h>void fun(int signum)
{printf("signum=%d \n",signum);signal(SIGINT,SIG_DFL);
}int main()
{signal(SIGINT,fun);while(1){sleep(1);printf("Hello\n");}exit(0);
}

用信号处理fork()僵死进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<signal.h>
#include<sys/wait.h>
void fun_sig(int sig)
{printf("end fork\n");wait(NULL);
}
int main()
{char*s=NULL;int n=0;signal(SIGCHLD,fun_sig);pid_t pid=fork();if(pid==-1){exit(1);}if(pid==0){s="child";n=3;}else{s="parent";n=7;}int i=0;for(;i<n;i++){printf("s=%s,pid=%d\n",s,getpid());sleep(1);}exit(0);
}
相关文章:
【Linux-Day8- 进程替换和信号】
进程替换和信号 问题引入 我们发现 终端输入的任意命令的父进程都是bash,这是因为Linux系统是用fork()复制出子进程,然后在子进程中调用替换函数进行进程替换,实现相关命令。 (1) exec 系列替换过程:pcb 使用以前的只…...
日志文件之间关系和介绍及应用
1.常用日志框架代码举例 Log4j: Log4j是Java中广泛使用的日志框架之一。它提供了灵活的配置选项和丰富的功能,支持日志级别、日志输出目标等。Log4j有1.x版本和2.x版本,其中Log4j 2.x是对1.x的升级和扩展。 Logback: Logback是由Log4j创始人设计的Log4…...
mac电脑屏幕录制Berrycast Mac屏幕录制软件
Berrycast是一款为Mac设计的优秀屏幕录制软件,它让屏幕录制变得简单而高效。以下是Berrycast的一些主要特点: 简单的用户界面:Berrycast拥有直观和简洁的用户界面,使得用户可以轻松上手。高质量的视频输出:Berrycast能…...
机器学习笔记之最优化理论与方法(一)最优化问题概述
机器学习笔记之最优化理论与方法——最优化问题概述 引言什么是最优化问题最优化问题的基本形式最优化问题的分类各分类最优化问题的数学表达约束优化VS无约束优化线性规划VS非线性规划连续优化VS离散优化单目标优化VS多目标优化 引言 从本节开始,将对最优化理论与…...
【ES5新特性一】 严格模式语法变化、全局的JSON对象、编码和解码的方法
前言 ECMAScript 和 JavaScript 的关系 一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系? 要讲清楚这个问题,需要回顾历史。1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准…...
Java【手撕滑动窗口】LeetCode 3. “无重复字符的最长子串“, 图文详解思路分析 + 代码
文章目录 前言一、长度最小子数组1, 题目2, 思路分析3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 📗 Java数据结构: 顺序表, 链…...
学习哈哈哈哈
# 零、学习计划 * 数据库相关 * 索引 * [我以为我对数据库索引很了解,直到我遇到了阿里面试官 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/107487215) * [给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引 - 知乎 (zhihu.com)](ht…...
05-基础例程5
基础例程5 1、超声波测距 实验介绍 HC-SR04超声波传感器是一款测量距离的传感器。其原理是利用声波在遇到障碍物反射接收结合声波在空气中传播的速度计算的得出。 外观 管脚功能的定义 VCC:供电电源;Trig:触发信号;Echo&a…...
双基证券:预计未来还会有更多政策来吸引增量资金
双基证券表示,8月27日,活泼资本商场五大方针出台:证券交易印花税折半征收;阶段性收紧IPO节奏;上市房企再融资不受破发、破净和亏本限制;标准控股股东与实际操控人减持行为;融资保证金最低份额由…...
前端:html实现页面切换、顶部标签栏,类似于浏览器的顶部标签栏(完整版)
效果 代码 <!DOCTYPE html> <html><head><style>/* 左侧超链接列表 */.link {display: block;padding: 8px;background-color: #f2f2f2;cursor: pointer;}/* 顶部标签栏 */#tabsContainer {width:98%;display: flex;align-items: center;overflow-x: …...
强化自主可控,润开鸿发布基于RISC-V架构的开源鸿蒙终端新品
2023 RISC-V中国峰会于8月23日至25日在北京召开,峰会以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新趋势。本次大会邀请了RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇,吸引超过百余家业界企业、高…...
软件设计师知识点·1
控制器: (1)指令寄存器(IR) : CPU执行一条指令时,从内存储器取到缓冲寄存器中,再送入IR暂存; (2)程序计数器(PC): 将要执行的下一条指令的地址; (3)地址寄存器(IR): 当前CPU所访问的内存单元地址; (4)指令译码器(ID): 对指令中的操作码字段进行分析解释; 多核CPU可以满足用户…...
修改Jupyter Notebook默认打开路径
这里我是重新下载的anaconda,打开Jupyter之后是默认在C盘的一个路径的,现在我们就来修改一下它的一个默认打开路径,这样在我们后续学习过程中,可以将ipynb后缀的文件放在这个目录下就能查看了。 1、先打开Anaconda Prompt&#x…...
经典卷积网络
目录 一、经典神经网络出现的时间线编辑 二、LeNet 三、AlexNet 四、VGGNet 五、InceptionNet 六、ResNet 总结: 一、经典神经网络出现的时间线 二、LeNet 背景:LeNet由Yann LeCun于1998年提出,卷积网络开篇之作。 解释࿱…...
react+koa+vite前后端模拟jwt鉴权过程
路由组件(生成token) const Router require(koa/router) const jwt require(jsonwebtoken); const router new Router()const mockDbUserInfo [{nickname: xxxliu,username: Tom,password: 123456,icon: url1},{nickname: xxx,username: John,passw…...
VK1616是LED显示控制驱动电路/LED驱动IC、数显驱动芯片、数码管驱动芯片
产品品牌:永嘉微电/VINKA 产品型号:VK1616 封装形式:SOP16 产品年份:新年份 概述:VK1616是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁存器、LED 驱动等电路。SEG脚接LED阳极&a…...
开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)
文章目录 前言 C MEX S-Function 算法原理 原始信号创建 编写S函数 仿真验证 Tips 分析和应用 总结 前言 见《开箱报告,Simulink Toolbox库模块使用指南(一)——powergui模块》 见《开箱报告,Simulink Toolbox库模块使用…...
摄像头的调用和视频识别
CV_tutorial3 摄像头调用实时播放保存视频 运动目标识别帧差法背景减除法 摄像头调用 创建视频捕捉对象:cv2.VideoCapture() 参数为视频设备的索引号,就一个摄像投的话写0默认; 或者是指定要读取视频的路径。 实时播放 import cv2 import …...
多通道分离与合并
目录 1.多通道分离split() 2.多通道合并merge() 3.Android JNI demo 1.多通道分离split() void cv::split ( InputArray m, OutputArrayOfArrays mv ) m:待分离的多通道图像。 mv:分离后的单通道图像,为向量vector形式。 2.多通道合并merge…...
JOJO的奇妙冒险
JOJO,我不想再做人了。 推荐一部动漫 JOJO的奇妙冒险 荒木飞吕彦创作的漫画 《JOJO的奇妙冒险》是由日本漫画家荒木飞吕彦所著漫画。漫画于1987年至2004年在集英社的少年漫画杂志少年JUMP上连载(1987年12号刊-2004年47号刊),2005年后在集英…...
“COMSOL 18650电池组蛇形液冷模型:集总电池组耦合传热与流场模拟”
comsol18650电池组蛇形液冷模型 采用集总电池组耦合传热和流场 模拟圆柱形电池模组在外部液冷散热下的热性能,电性能等锂离子电池模组在快充场景下产生的热量能直接让表面温度突破60℃,这对电动车的安全性和寿命都是致命威胁。去年参与某车企电池包项目时…...
为什么你需要ZXPInstaller?3分钟搞定Adobe扩展安装难题
为什么你需要ZXPInstaller?3分钟搞定Adobe扩展安装难题 【免费下载链接】ZXPInstaller Open Source ZXP Installer for Adobe Extensions 项目地址: https://gitcode.com/gh_mirrors/zx/ZXPInstaller 还在为Adobe扩展插件安装而烦恼吗?每次看到.z…...
HarmonyOS文件流操作指南:用ArkTS实现高效大文件传输与哈希校验
HarmonyOS文件流操作实战:ArkTS实现大文件传输与完整性校验 在移动应用开发中,文件操作是基础但至关重要的功能。当应用需要处理大型媒体文件、数据库备份或批量数据交换时,传统的文件IO方式往往力不从心。HarmonyOS提供的流式文件操作接口&a…...
用Neural Renderer和PyTorch搞定3D车辆模型渲染:从.obj文件到Carla数据集实战
3D车辆模型渲染实战:Neural Renderer与Carla数据集深度整合指南 在自动驾驶和计算机视觉领域,逼真的3D车辆模型渲染技术正成为算法开发和测试的关键环节。传统渲染方法往往难以平衡效率与真实感,而基于神经网络的渲染技术为解决这一难题提供了…...
从LDF文件看LIN调度:为什么说‘可预测性’是汽车低端总线的灵魂?
从LDF文件看LIN调度:为什么说‘可预测性’是汽车低端总线的灵魂? 当你按下车窗按钮时,那个瞬间发生的升降动作背后,隐藏着一套精密的通信协议在默默运作。不同于高端车载网络CAN总线的复杂仲裁机制,LIN总线以其独特的&…...
银河麒麟V10 SP1安全基线配置踩坑记:为什么pam_wheel.so的group=wheel参数会失效?
银河麒麟V10 SP1安全基线配置深度解析:从pam_wheel.so失效看系统级安全加固实战 第一次在银河麒麟V10 SP1上配置安全基线时,我盯着终端屏幕足足愣了三分钟。按照多年Linux系统管理经验,我在/etc/pam.d/su中加入了标准的groupwheel参数&#x…...
如何用EuRoC数据集快速搭建VIO算法测试环境(附Python代码示例)
如何用EuRoC数据集高效构建VIO算法验证平台(附Python实战) 当我们需要验证视觉惯性里程计(VIO)算法时,一个高质量的数据集就像实验室里的精密仪器。EuRoC数据集正是这样一套"标准量具",它由微型飞…...
深入解析IoU(Jaccard系数)在目标检测中的关键作用与高效实现
1. IoU究竟是什么?从基础概念到视觉理解 第一次接触目标检测时,我对着论文里满屏的"IoU"缩写发懵——这到底是个什么魔法指标?后来在调试YOLO模型时才发现,这个看似简单的比值,实际上是整个检测任务的基石性…...
Playwright Python终极指南:高效浏览器自动化测试的10个技巧
Playwright Python终极指南:高效浏览器自动化测试的10个技巧 【免费下载链接】playwright-python Python version of the Playwright testing and automation library. 项目地址: https://gitcode.com/GitHub_Trending/pl/playwright-python Playwright Pyth…...
Python AI用例生成效率提升300%:从零搭建可复用的Prompt工程流水线
第一章:Python AI用例生成效率提升300%:从零搭建可复用的Prompt工程流水线在AI应用开发中,重复编写、调试和验证Prompt严重拖慢用例迭代速度。本章介绍一种基于Python的轻量级Prompt工程流水线,通过模板化、版本化与自动化执行三重…...
