LinuxC编程:监视子进程:
父进程一般通过waitpid监视子进程,下面的程序会使用此函数来监视子进程:
程序:
/**
****************************************************************************************
* @file 13_waitpid.c
* @author GuiStar-李什么恩
* @version V1.1.0
* @date 2023-4-15
* @brief 监视子进程,本程序会创建一个死循环的子进程,然后再另外一个终端进程向这个
* 子进程发送19停止信号,18继续运行信号,以及2终止信号,这三个信号的处理方式
* 都是系统默认,然后父进程通过waitpid函数监视这个子进程,并打印相关信息
****************************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
int main(void)
{
pid_t pid=fork();
switch(pid)
{
case -1:
perror("fork error");
exit(-1);
case 0://子进程
printf("I am a child,PID=%d\n",getpid());
while(1){
sleep(1);
}
//exit(0);
default://父进程
{
int ret ;
int status;
printf("I am a father,PID=%d\n",getpid());
//sleep(1);
while(1)
{
ret=waitpid(pid,&status,WUNTRACED|WCONTINUED);//检测停止的子进程和停止后继续运行的子进程
if(ret==-1)
{
perror("waitpid error!");
exit(-1);
}
else if (ret==0)
{
printf("当前没有子进程的状态发生改变\n");
}
else//如果返回大于0的值,则表示子进程的状态发生改变,返回该子进程的pid
{
if(WIFSIGNALED(status))//如果子进程是被信号终止(异常终止)的
{
printf("子进程被信号%d终止\n",WTERMSIG(status));//打印出终止子进程的信号编号
break;
}
else if(WIFEXITED(status))//如果子进程被正常终止
{
printf("子进程正常终止:%d\n",WEXITSTATUS(status));
break;
}
else if(WIFSTOPPED(status))//如果子进程被暂停
{
printf("子进程%d被信号%d暂停\n",pid,WSTOPSIG(status));
}
else if(WIFCONTINUED(status))//如果子进程被暂停
{
printf("子进程%d继续运行\n",pid);
}
}
}
exit(0);
}
}
}
实验结果:
- 运行程序:
- 向子进程发送信号:
- 父进程打印子进程状态: