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

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-10
			if(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-10
			if(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.


http://www.kler.cn/news/289099.html

相关文章:

  • Java 输入与输出之 NIO.2【AIO】【Path、Paths、Files】【walkFileTree接口】探索之【三】
  • Qt详解QParallelAnimationGroup并行动画组
  • 【2024 CCF编程能力等级认证(GESP)C++ 】 计算机基础知识
  • 三、 3020数控铣床 笔记
  • 中国科学院声学研究所博士招生目录
  • 昇思25天学习打卡营第33天|共赴算力时代
  • 双指针(1)_数组分块_移动零问题
  • 0903,LIST(merge,splice,sort,unique),SET(insert,erase)
  • Codeforces Round (Div.3) C.Sort (前缀和的应用)
  • uniapp上传文件时用到的api是什么?格式是什么?
  • 如何从 Mac 上清空的垃圾箱中恢复误删除的文件
  • linux find 之 文件、时间、权限、深度、删除
  • Android在子线程中更新UI
  • Java导出图片到excel
  • 【算法】贪心算法解析:基本概念、策略证明与代码例题演示
  • ARM汇编指令
  • Pandas 2-读取文件
  • CSRF 概念及防护机制
  • 3D幻想空间:Scratch中探索虚拟世界的奥秘
  • 【量化分析】Python、JavaScript(Node.js)、Java、C#和Ruby五种主流语言的实例代码给大家演示一下如何获取股票实时交易数据
  • 深入理解MySQL慢查询优化(2) -- SQL的执行流程
  • OCI编程高级篇(十八) OCI连接池概念
  • 如何打造一个成功的直播矩阵
  • 【科研新人必看】什么是期刊等级,SCI、核心期刊、省刊
  • qt6 socket 不使用代理 socket error: The proxy type is invalid for this operation
  • 8.29 C++
  • 常用Pandas操作(笔记整理)
  • 前端学习笔记-Web APIs篇-02
  • 基于机器学习的工业制造缺陷分析预测系统
  • 运动多线激光三维重建