当前位置: 首页 > news >正文

linux进程处理

1.测试这样没意义,要向后加

wait等待进程结束

1.

2.测试

发送异常结束的信号,通过kill

二、子进程的回收
    对于子进程的结束而言,都希望父进程能够知道并作出一定的反应,通过 wait、waitpid 函数可以知道子进程是如何结束的以及它的结束状态码
    pid_t wait(int *status);
    功能:等待子进程结束,并获取结束状态码
    status:输出型参数,接收结束状态码
    返回值:结束的子进程的ID
        1、如果所有子进程都还在运行,则阻塞
        2、如果有一个子进程结束,立即返回该进程的结束状态码和ID
        3、如果没有子进程返回-1
    WIFEXITED(status)
        判断进程是否是正常结束,如果是返回真
    WEXITSTATUS(status)
        如果进程是正常结束的,可以获取到正确的结束状态码
    WIFSIGNALED(status)
        判断进程是否异常结束,如果是返回真
    WTERMSIG(status)
        如果进程是异常结束的,可以获取到杀死进程的信号
    

    pid_t waitpid(pid_t pid, int *status, int options);
    功能:等待回收指定的某个或某些进程
    pid:
        >0  等待该进程结束
        0   等待同组的任意进程结束
        -1  等待任意进程结束,功能与wait等价
        <-1 等待abs(pid) 进程组中的任意进程结束
    status:输出型参数,接收结束状态码
    options:
        WNOHANG 非阻塞模式,如果当前没有子进程结束,则立即返回0
        WUNTRACED 如果有子进程处于暂停态,返回该进程的状态
        WCONTINUED  如果有子进程从暂停态转为继续运行,返回该子进程的状态

    WIFSTOPPED(status)
        判断子进程是否转为暂停态,是返回真
    WSTOPSIG(status)
        获取导致子进程进入暂停态的信号
    WIFCONTINUED(status)
        判断子进程是否由暂停转为继续,是返回真

    int system(const char *command);
    功能:通过创建子进程去执行一个可执行文件
    返回值:子进程结束后才返回
    注意:该函数底层调用了fork、vfork、exec、waitpid函数

#include <stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<sys/types.h>
#include<signal.h>
//父进程收到信号会进来
void sigchld(int num)
{//子进程结束的时候父进程会接收到SIGCHLD信号,就会进入注册的处理函数int status=0;pid_t pid =wait(&status);printf("进程%d结束",pid);//if(pid==-1) exit(0); //无效if( WIFEXITED(status)){printf("是正常结束的,状态码是%d\n",   WEXITSTATUS(status));}else{printf("该进程异常结束,被%d信号杀死", WTERMSIG(status));}}int main(int argc,const char* argv[])
{signal(SIGCHLD,sigchld);for(int i=0;i<10;i++){if(0==fork()){srand(i);printf("这是子进程%u i=%d\n",getpid(),i);sleep(rand()%8+3);//0-10if(i%2) kill(getpid(),9);//发信号当前信号,9	向当前进程发出异异常结束return i;}sleep(1);//防止信号还没来的及处理}for(;;){//父进程自己在干事情printf("*");//在缓冲区中????fflush(stdout);//刷新缓冲区sleep(1);/*int status=-1;pid_t pid=wait(&status);if(-1==pid) break;printf("子进程%d结束了,status=%d\n",pid,status);if( WIFEXITED(status)){printf("是正常结束的,状态码是%d\n",   WEXITSTATUS(status));}else{printf("该进程异常结束,被%d信号杀死", WTERMSIG(status));}*/}printf("没有了子进程\n");return 0;
}

2.

#include <stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<sys/types.h>
#include<signal.h>
/*
//父进程收到信号会进来
void sigchld(int num)
{//子进程结束的时候父进程会接收到SIGCHLD信号,就会进入注册的处理函数int status=0;pid_t pid =wait(&status);printf("进程%d结束",pid);//if(pid==-1) exit(0); //无效if( WIFEXITED(status)){printf("是正常结束的,状态码是%d\n",   WEXITSTATUS(status));}else{printf("该进程异常结束,被%d信号杀死", WTERMSIG(status));}}*/int main(int argc,const char* argv[])
{//	signal(SIGCHLD,sigchld);for(int i=0;i<10;i++){if(0==fork()){srand(i);printf("这是子进程%u 父进程%u i=%d\n",getpid(),getppid(),i);sleep(rand()%8+3);//0-10if(i%2){ exit(i);//发信号当前信号,9	向当前进程发出异异常结束}else{kill(getpid(),20);	}//	return i;}sleep(1);//防止信号还没来的及处理}for(;;){//父进程自己在干事情printf("*");//在缓冲区中????fflush(stdout);//刷新缓冲区int status=-1;pid_t pid=waitpid(0,&status,WNOHANG |WUNTRACED |WCONTINUED );if(pid>0){if( WIFSTOPPED(status)){printf("子进程%d进暂停,导致的信号%d\n",pid,   WSTOPSIG(status));}else if( WIFCONTINUED(status)){printf("子进%d程有暂停转为继续运行", pid);}else{printf("子进程%d结束,status=%d\n",pid,   WEXITSTATUS(status));	}}sleep(1);}return 0;
}

3.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Shader学习笔记
  • C#中的Array.Sort()和Reverse()
  • JAVA-JVM 内存模型类加载器GC算法GC调优
  • 【技巧】Excel检查单元格的值是否在另一列中
  • LuaJit分析(一)LuaJit交叉编译
  • 今日算法:蓝桥杯基础题之“切面条”
  • VS2022出现C1001内部编译器错误的情况分析
  • 性能测试⼯具-——JMeter
  • 关于位结构体及位操作总结
  • 项目拆解:短视频冷门赛道—ai绘画+温馨小屋,引流变现全攻略
  • 传统CV算法——基于opencv的答题卡识别判卷系统
  • 机器学习项目——基于机器学习(RNN LSTM 高斯拟合 MLP)的锂离子电池剩余寿命预测方法研究(代码/论文)
  • python办公自动化:使用`Python-PPTX`的样式与格式
  • C++ ─── List的模拟实现
  • Datawhale X 李宏毅苹果书 AI夏令营-深度学习进阶task3:批量归一化
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • angular2开源库收集
  • Apache的基本使用
  • conda常用的命令
  • CSS居中完全指南——构建CSS居中决策树
  • Git学习与使用心得(1)—— 初始化
  • java8-模拟hadoop
  • Javascript 原型链
  • Javascript设计模式学习之Observer(观察者)模式
  • js对象的深浅拷贝
  • js学习笔记
  • Just for fun——迅速写完快速排序
  • PHP面试之三:MySQL数据库
  • React-生命周期杂记
  • 创建一个Struts2项目maven 方式
  • 从零开始的无人驾驶 1
  • 从伪并行的 Python 多线程说起
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 小程序开发中的那些坑
  • 异常机制详解
  • 优化 Vue 项目编译文件大小
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • !!Dom4j 学习笔记
  • # .NET Framework中使用命名管道进行进程间通信
  • # centos7下FFmpeg环境部署记录
  • # 透过事物看本质的能力怎么培养?
  • #FPGA(基础知识)
  • #ifdef 的技巧用法
  • #QT(串口助手-界面)
  • #前后端分离# 头条发布系统
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)计算机毕业设计高校学生选课系统