c++ ,python监控 进程 状态 fork

【精选】操作系统实验二 观察Linux进程状态_linux什 么时候出现运行状态、暂停状态、可中断阻塞状 态、不可中断阻塞状态、僵_Ace2NoU的博客-CSDN博客

Linux C/C++ 监控进程变化_mob649e81583204的技术博客_51CTO博客

Boost.Process库来监控进程

基于c++ boost库实现进程管理_boost 进程管理-CSDN博客

Linux僵尸进程以及wait函数_僵死进程-CSDN博客

#include <sys/types.h>
#include <sys/wait.h>

pid_t pid;
int status;

pid_t child_pid = fork();
if (child_pid < 0) {
    // 创建子进程失败,错误处理
} else if (child_pid == 0) {
    // 子进程代码
    // 子进程结束后使用 exit() 函数退出
    exit(0);
} else {
    // 父进程代码



while ((pid = waitpid(child_pid, &status, WNOHANG | WUNTRACED | WCONTINUED)) > 0) {
    if (WIFEXITED(status)) {
        // 子进程正常退出,可以进行相应处理
    } else if (WIFSIGNALED(status)) {
        // 子进程被信号终止,可以进行相应处理
    } else if (WIFSTOPPED(status)) {
        // 子进程被暂停,可以进行相应处理
    } else if (WIFCONTINUED(status)) {
        // 子进程被恢复继续执行,可以进行相应处理
    }
}

if (pid < 0) {
    // 监控子进程出错,错误处理
}



}



分析为什么出现以上现象,并对其进行总结:什么时候出现运行状态、暂停状态、可中断阻塞状态、不可中断阻塞状态、僵尸状态?

1、在查看运行状态的实验中,该进程在0:51时获得CPU正在运行,处于R状态。在查看暂停状态时,进程一开始处于R状态,由于向其发送了SIGSTOP信号,所以转为T状态,后来又向其发送了SIGSCON信号,进程又转为R状态。在查看可中断阻塞状态时,进程一开始处于S状态,由于使用了kill命令,进程被中断。在查看不可中断阻塞状态时,进程一开始处于D状态,使用了kill命令,但进程并没有被中断。在查看僵尸进程时,子进程迅速结束,进入Z状态,而父进程陷入阻塞,进入S状态。

2、出现各种状态的情况:

(1)可运行状态R:当创建一个新进程,系统调用创建原语,该进程为就绪状态,或者进程执行唤醒原语,把处于阻塞状态进程的状态改为就绪状态,或者进程获得CPU正在运行,处于执行状态。

(2)可中断阻塞状态S:进程调用阻塞原语把状态改为阻塞状态,在资源有效时,能被信号或中断唤醒进入到运行态队列。  可以kill

(3)不可中断阻塞状态D:进程调用阻塞原语把状态改为阻塞状态,不可被其他进程唤醒,只有被使用wake_up()函数明确唤醒时才能转换到可运行的就绪状态。  不可以kill

(4)暂停状态T:当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时就会进入暂停状态。可向其发送SIGCONT信号,让进程转换到可运行状态。

(5)僵死状态Z:表示进程停止但尚未消亡的一种状态。此时进程已经结束运行并释放掉大部分资源,但父进程尚未收回其PCB。
 

python代码

import psutil

def check_process_status(pid):
    try:
        process = psutil.Process(pid)
        status = process.status()
        
        if status == psutil.STATUS_RUNNING:
            return "Running"
        elif status == psutil.STATUS_SLEEPING:
            return "Sleeping"
        elif status == psutil.STATUS_ZOMBIE:
            return "Zombie"
        elif status == psutil.STATUS_DEAD:
            return "Dead"
        elif status == psutil.STATUS_IDLE:
            return "Idle"
        else:
            return "Unknown"
    except psutil.NoSuchProcess:
        return "Process not found"

# 使用进程的PID来检查其状态
pid = 1234  # 替换为你要检查的进程的PID
status = check_process_status(pid)
print(f"Process status: {status}")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值