Bla*_*iev 73
发出kill(2)系统调用0作为信号.如果调用成功,则表示存在具有此pid的进程.
如果调用失败并errno设置为ESRCH,则不存在具有此类pid的进程.
引用POSIX标准:
如果sig为0(空信号),则执行错误检查但实际上没有发送信号.空信号可用于检查pid的有效性.
请注意,您在竞争条件下不安全:目标进程可能已退出,同时已启动具有相同pid的另一个进程.或者,在您检查过程后,该过程可能会很快退出,您可以根据过时的信息做出决定.
只有当给定的pid是子进程(fork从当前进程编辑)时,您才可以使用waitpid(2)该WNOHANG选项,或尝试捕获SIGCHLD信号.这些在竞争条件下是安全的,但仅与子进程相关.
Jan*_*sen 15
使用procfs.
#include <sys/stat.h>
[...]
struct stat sts;
if (stat("/proc/<pid>", &sts) == -1 && errno == ENOENT) {
// process doesn't exist
}
Run Code Online (Sandbox Code Playgroud)
轻松携带
the*_*aul 12
kill(pid, 0)是典型的方法,正如@ blagovest-buyukliev所说.但是,如果您正在检查的进程可能由其他用户拥有,并且您不想采取额外的步骤来检查是否errno == ESRCH,那么事实证明
(getpgid(pid) >= 0)
Run Code Online (Sandbox Code Playgroud)
是一种有效的一步法,用于确定任何进程是否具有给定的PID(因为即使对于不属于您的进程,您也可以检查进程组ID).