c 几种父进程主动终止子进程的方法

1.如子进程是循环状态

子进程循环等待键盘的输入,如父进程模拟键盘输入一个字符,子进程收到就跳出scanf()。同理,如是socket 的accept()等待,也可以发送一字符,让子进程跳出等待。


#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <stdio.h>
#include <unistd.h>
#include <wait.h>void mn_key(int fd,int kval)
{struct input_event event;event.type = EV_KEY;event.value = 1;event.code = kval;write(fd,&event,sizeof(event)) ;event.type = EV_SYN;event.code = SYN_REPORT;event.value = 0;write(fd, &event, sizeof(event));memset(&event, 0, sizeof(event));event.type = EV_KEY;event.code = kval;event.value = 0;write(fd, &event, sizeof(event));event.type = EV_SYN;event.code = SYN_REPORT;event.value = 0;write(fd, &event, sizeof(event));
}int main()
{   int stat;pid_t pid=fork();if(pid==0){while(1){char c[20];scanf("%s",c);if(!strcmp(c,"0")){       //接收到0字符,子进程退出puts("zjc over");return 0;}printf("zjc:%s\n",c);}}sleep(10);  //10秒后,中止子进程的运行。   int	fd = open("/dev/input/event3",O_RDWR);  //每个机器的event(n)可能不同。if(fd<=0){puts("keyboad error");        //dev/input/event3  权限chmod 777 要能读写return -1;}mn_key(fd,KEY_0);mn_key(fd,KEY_ENTER);mn_key(fd,KEY_ENTER);      //不清楚为什麽要两行wait(&stat);close(fd);
}

2.上面的方法不通用,可以说是特例,下面的方法采用kill()函数,可以说是通用方法,采用管道先把子进程号传到父进程,再用kill函数。此方法非常暴力,直接杀死子进程,不管它是否结束。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <wait.h>
#include <signal.h>
#include <sys/prctl.h>
#include <sys/types.h>int main(void){
//	int stat;int zf[2];pipe(zf);         //此句必须放在fork()语句前pid_t pid=fork();if(pid==0){pid_t pid1=getpid();printf("z:%d\n",pid1);write(zf[1],&pid1,4);while(1){char c[10];scanf("%s",c);if(!strcmp(c,"~")){puts("zjc over");exit(0);}printf("%s\n",c);}}sleep(3);       pid_t bz;read(zf[0],&bz,4);     //父进程取得子进程号printf("f:%d\n",bz);  kill(bz,1);            //关闭子进程
//	wait(&stat);     return 0;
}

3. 父进程用sigqueue() 发送终止信号,子进程signal() 收到父进程信号,改变循环标志位,退出循环,再退出子进程。此种方法文明不粗暴。此处父进程不能用raise函数,因为此函数只能向本进程发送信号。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <wait.h>
#include <sys/types.h>
#include <signal.h>int main(void){union sigval si;si.sival_int=0;int stat;pid_t zf[2];pipe(zf);pid_t pid=fork();if(pid==0){pid_t id=getpid();write(zf[1],&id,4);int t=1;void handle(int sig){printf("%d\n",sig);t=0;                }signal(20,&handle);    while(t){puts("zjc");sleep(1);}printf("%d\n",t);    //t=0exit(0);}int bz;read(zf[0],&bz,4);sleep(2);sigqueue(bz,20,si);wait(&stat);return 0;
}

 

 

 

 

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

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

相关文章

Excel 自动提取某一列不重复值

IFERROR(INDEX($A$1:$A$14,MATCH(0,COUNTIF($C$1:C1,$A$1:$A$14),0)),"")注意&#xff1a;C1要空置&#xff0c;从C2输入公式 参考&#xff1a; https://blog.csdn.net/STR_Liang/article/details/105182654 https://zhuanlan.zhihu.com/p/55219017?utm_id0

c++视觉处理---直方图均衡化

直方图均衡化 直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过重新分布图像的像素值&#xff0c;以使图像的直方图变得更均匀&#xff0c;从而提高图像的视觉质量。在OpenCV中&#xff0c;您可以使用 cv::equalizeHist 函数来执行直方图均衡化。以下是 cv::equal…

06-Zookeeper选举Leader源码剖析

上一篇&#xff1a;05-Zookeeper典型使用场景实战 一、为什么要看源码 提升技术功底&#xff1a;学习源码里的优秀设计思想&#xff0c;比如一些疑难问题的解决思路&#xff0c;还有一些优秀的设计模式&#xff0c;整体提升自己的技术功底深度掌握技术框架&#xff1a;源码看多…

Jenkins更换主目录

Jenkins储存所有的数据文件在这个目录下. 你可以通过以下几种方式更改&#xff1a; 使用你Web容器的管理工具设置JENKINS_HOME环境参数.在启动Web容器之前设置JENKINS_HOME环境变量.(不推荐)更改Jenkins.war(或者在展开的Web容器)内的web.xml配置文件. 这个值在Jenkins运行时…

ExcelBDD Python指南

在Python里面支持BDD Excel BDD Tool Specification By ExcelBDD Method This tool is to get BDD test data from an excel file, its requirement specification is below The Essential of this approach is obtaining multiple sets of test data, so when combined with…

【【萌新的SOC学习之自定义IP核 AXI4接口】】

萌新的SOC学习之自定义IP核 AXI4接口 自定义IP核-AXI4接口 AXI接口时序 对于一个读数据信号 AXI突发读 不要忘记 最后还有拉高RLAST 表示信号的中止 实验任务 &#xff1a; 通过自定义一个AXI4接口的IP核 &#xff0c;通过AXI_HP接口对PS端 DDR3 进行读写测试 。 S_AXI…

软件设计之抽象工厂模式

抽象工厂模式指把一个产品变成一个接口&#xff0c;它的子产品作为接口的实现&#xff0c;所以还需要一个总抽象工厂和它的分抽象工厂。 下面我们用一个案例去说明抽象工厂模式。 在class中可以选择super类和medium类&#xff0c;即选择一个产品的子类。在type中可以选择产品的…

c++处理图像---绘制物体的凸包:cv::convexHull

绘制物体的凸包&#xff1a;cv::convexHull cv::convexHull 是OpenCV中用于计算点集的凸包&#xff08;convex hull&#xff09;的函数。凸包是包围点集的最小凸多边形&#xff0c;该多边形的所有内部角都小于或等于 180 度。 cv::convexHull 函数的基本用法如下&#xff1a;…

用idea工具scala 和 Java开发 spark案例:WordCount

目录 一 环境准备 二 scala代码编写 三 java 代码编写 一 环境准备 创建一个 maven 工程 添加下列依赖 <dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>${spark.version}</vers…

Android Studio for Platform (ASfP) 使用教程

文章目录 编写脚本下载源代码lunch 查看版本 归纳的很清楚&#xff0c;下载Repo并下载源码->可以参考我的 Framework入门のPiex 6P源码(下载/编译/刷机) 启动图标&#xff08;重启生效&#xff09; [Desktop Entry] EncodingUTF-8 NameAndroidStudio …

大模型微调学习

用好大模型的层次&#xff1a;1. 提示词工程(prompt engineering); 2. 大模型微调(fine tuning)为什么要对大模型微调&#xff1a; 1. 大模型预训练成本非常高&#xff1b; 2. 如果prompt engineering的效果达不到要求&#xff0c;企业又有比较好的自有数据&#xff0c;能够通过…

C++使用两个栈实现双端队列——F1 B1 B2 B3 B4 B5 PF PF PB PB

用两个栈v1,v2分别表示左栈和右栈&#xff0c;即可实现双端队列。 当从前面插入元素时&#xff0c;v1.push() 当从后面插入元素时&#xff0c;v2.push() 当两个栈都不空的时候&#xff0c;不管前面后面出栈&#xff0c;都直接Pop 当有一个栈空&#xff0c;比如左栈v1空了&am…

scapy构造ND报文

控制报文之&#xff1a;找邻居报文 什么是ND报文 ND报文是指网络中的 Neighbor Discovery&#xff08;ND&#xff09;控制报文。Neighbor Discovery 是 IPv6 网络中的一种协议&#xff0c;它用于管理网络节点之间的邻居关系、地址解析、路由缓存维护和自动配置等任务。ND 协议…

Django实现音乐网站 ⒆

使用Python Django框架做一个音乐网站&#xff0c; 本篇主要为排行榜功能及音乐播放器部分功能实现。 目录 推荐排行榜优化 设置歌手、单曲跳转链接 排行榜列表渲染优化 视图修改如下&#xff1a; 模板修改如下&#xff1a; 单曲详情修改 排行榜列表 设置路由 视图处理…

【Mysql】Mysql的启动选项和系统变量(二)

概述 在Mysql的设置项中一般都有各自的默认值&#xff0c;比方说mysql 5.7服务器端允许同时连入的客户端的默认数量是 151 &#xff0c;表的默认存储引擎是 InnoDB &#xff0c;我们可以在程序启动的时候去修改这些默认值&#xff0c;对于这种在程序启动时指定的设置项也称之为…

MySQL建表操作和用户权限

1.创建数据库school&#xff0c;字符集为utf8 mysql> create database school character set utf8; 2.在school数据库中创建Student和Score表 mysql> create table school.student( -> Id int(10) primary key, -> Stu_id int(10) not null, -> C_n…

【Python 零基础入门】 Numpy

【Python 零基础入门】第六课 Numpy 概述什么是 Numpy?Numpy 与 Python 数组的区别并发 vs 并行单线程 vs 多线程GILNumpy 在数据科学中的重要性 Numpy 安装Anaconda导包 ndarraynp.array 创建数组属性np.zeros 创建np.ones 创建 数组的切片和索引基本索引切片操作数组运算 常…

C# 使用 RSA 加密算法生成证书签名产生“The system cannot find the file specified”异常

使用 C# 中 RSA&#xff08;System.Security.Cryptography.RSA&#xff09; 加密算法生成证书签名进行身份验证&#xff0c;在 VS2022 开发工具本地运行应用程序一切正常。 但将应用程序部署到远程服务器&#xff08;如&#xff1a;Azure App Services&#xff09;&#xff0c…

alsa音频pcm设备之i2c调试

i2cdetect 列举 I2C bus i2cdetect -l ls /dev/i2c* 列出I2C bus i2c-7 上面连接的所有设备,并得到i2c设备地址 i2cdetect -y 7 发现i2c设备的位置显示为UU或表示设备地址的数值,UU表示设备在driver中被使用. I2cdump i2c设备大量register的值 i2cdump -y 7 0x40 I2cset设置…

ROS中的图像数据

无论是USB摄像头还是RGBD摄像头&#xff0c;发布的图像数据格式多种多样&#xff0c;在处理这些数据之前&#xff0c;我们首先需要了解这些数据的格式。 二维图像数据 连接USB摄像头到PC端的USB接口&#xff0c;通过以下命令启动摄像头&#xff1a; roslaunch usb_cam usb_ca…