判断进程是否存在的几种方法

判断进程是否存在的几种方法


参考

注意

通过 pid 去判断一个程序是否还在运行并不是很妥当,因为:

  • 因为内核会在进程消亡时回收进程ID,这个 ID 可能被分配给其他进程,所以随着时间的推移,相同的进程ID可能指向不同的进程。
  • 一个进程 ID 存在,但是该进程是一个僵尸进程(例如,一个已经死亡,但其父进程还没有执行 wait() 来获得其终止状态的进程)

方法一:发送 0 号信号法

  • 当向一个进程发送 0 号信号(所谓的 null 信号)时,该信号并不会被真的发送,但是 kill() 函数会进行错误检查,查看该 pid 指向的进程是否能够接收信号

    man 3 kill 的中的说明是这样的:
        #include <signal.h>
        int kill(pid_t pid, int sig);
    
        If sig is 0 (the null signal), error checking is performed but no signal is actually sent. The null signal can be used to check 
        the validity of pid.
    
        Upon successful completion, 0 shall be returned. Otherwise, -1 shall be returned and errno set to indicate the error.
    
        errno:
            EINVAL The value of the sig argument is an invalid or unsupported signal number.
            EPERM  The process does not have permission to send the signal to any receiving process.
            ESRCH  No process or process group can be found corresponding to that specified by pid.
    
  • 若检查出错

    • EINVAL:sig无效
    • EPERM:进程存在,但当前进程无权限向 pid 发送信号
    • ESRCH:pid 指向的进程不存在
  • 若执行成功,表示进程存在

方法二:wait() 系统调用,监视子进程

  • 只有当被监视的进程是调用者的子进程时,才可以使用它们

方法三:信号量和排他文件锁

  • 如果被持续监视的进程持有一个信号量或文件锁,那么,如果我们可以获得信号量或锁,我们就知道进程已经终止。

方法四:IPC通道(如管道和 fifo )

  • 被监视的进程保持一个打开的文件描述符,以便在通道上写入。
  • 监视进程保持通道的读描述符为打开状态,并且当通道的写端关闭时(因为它看到文件结束符),它知道被监视的进程已经终止。

方法五:检查 /proc 下是否存在对应 pid 的文件夹

  • 例如,如果进程 ID 为12345的进程存在,那么存在目录 /proc/12345 将存在
  • 我们可以使用 stat() 这样的调用来检查这个情况。

以上的方案中,除了第一种和最后一种,都不受进程 id 回收的影响。但是第五种方法你可以通过检查 /proc/[pid] 目录下更多的信息来确认是否是目标进程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值