请问已知一个进程ID,如何用C函数检查该进程是在运行还是已经退出了???

lxw_6 2004-04-08 09:56:20
请问已知一个进程ID,如何用C函数检查该进程是在运行还是已经退出了???

我说的是用C编程的方式,而不是系统命令去查看。
...全文
105 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbcb 2004-04-08
  • 打赏
  • 举报
回复
if( kill(pid,SIGUSR2) == EOF )进程pid已不存在
fierygnu 2004-04-08
  • 打赏
  • 举报
回复
to passingguy:
有这种可能,不过进程号一般是顺序使用,不是填空,所以要看楼主的实际环境可能性是否很大。如果要求很高,需要在二者之间用心跳来检测,只检测文件名也是不行的(文件名不是唯一的)。
fierygnu 2004-04-08
  • 打赏
  • 举报
回复
有些系统不支持/proc,而kill是POSIX标准。
kkk16自己man kill
kkk16 2004-04-08
  • 打赏
  • 举报
回复
kill(pid,0)是什么意思?谁能解释一下吗?
EternalBlue 2004-04-08
  • 打赏
  • 举报
回复
直接用access查/proc/<pid>文件是否存在不就行了?
passingguy 2004-04-08
  • 打赏
  • 举报
回复
to: fierygnu(va_list)
我有一个问题~~
用kill(pid,0)的时候,你不能保证你监测的进程真正是你想监测的进程。
因为有可能进程早就结束了,然后unix重用了进程号~~
这怎么解决呢?

我还是觉得用 ps|grep id|grep name 保险一些~~
fierygnu 2004-04-08
  • 打赏
  • 举报
回复
kill(pid, 0);
passingguy 2004-04-08
  • 打赏
  • 举报
回复
waitpid不行~~
waitpid只能监测自己的子进程的状态~

其实 ps 是最简单的
如果一定要用C,我不知道unix有没有这样的接口,所以只能提出替代方案。
FILE* fs = popen("ps -ef|grep id|awk '{print $2}'","r");
char buf[10];
memset(buf,'\0',10);
fgets(buf,10,fs);
然后通过判断buf的内容(id or 空)来判断进程是否存在~

方法笨了一点,如果谁有好的方案我也想知道~~
谢谢
icedust 2004-04-08
  • 打赏
  • 举报
回复
waitpid
longenic 2004-04-08
  • 打赏
  • 举报
回复
这也是进程间的通信问题。方法也有很多,


如果是一台机子上,用waitpid就可以了.

如果是网络中,就麻烦一点
longenic 2004-04-08
  • 打赏
  • 举报
回复
这是我写的一个监控程序部分, 请各位指点,

longenic 2004-04-08
  • 打赏
  • 举报
回复
/*+++++++++++++++++++++++++ FUNCTION DESCRIPTION ++++++++++++++++++++++++++++++
*
* NAME : UTL_FindProc FOR UNIX
*
* DESCRIPTION : Finds out if a given process is still running
* on the system.
*
* COMPLETION
* STATUS : UTL__NORMAL
* Success; Service has completed succesfully.
*
* UTL__INVPID
* Failure; Invalid process number given.
*
* UTL__PIDNOTFOUND
* Failure; Process is not active.
*
*-----------------------------------------------------------------------------
*/
MSG_ID_T UTL_FindProc(
pid_t pd) /*- input: process id to find -*/
{

MSG_ID_T sts; /*- return status of findproc -*/
int rtn; /*- return status of getprio -*/
#ifdef SUN
pcparms_t pcparms;
#endif

sts = UTL__NORMAL;

if (pd < UTL_PRC_2)
{
sts = UTL__INVPID;
}
else
{
if (pd != getpid())
{
errno = 0;
rtn = 0;
#ifndef AIX
#ifdef SUN /* important to administe the processes */
pcparms.pc_cid = PC_CLNULL;
rtn = priocntl(P_PID, pd, PC_GETPARMS,(char *) &pcparms);
#else
rtn = getpriority(PRIO_PROCESS, pd);
#endif /* SUN */
#else
rtn = getpri(pd);
#endif /* AIX */
if (rtn == -1)
{
if (errno == ESRCH)
{
sts = UTL__PIDNOTFOUND;
}
else if ((errno != NULL) && (errno != EPERM))
{
ERR_SignalError("Utilities Package",
"UTL_FindProc fct",
errno) ;
exit( EXIT_FAILURE );
}
}
}
}

return(sts);


} /*- UTL_FindProc -*/

#endif /* end of UNIX code */
rexp 2004-04-08
  • 打赏
  • 举报
回复
kill(pid,0),看返回值。
fierygnu 2004-04-08
  • 打赏
  • 举报
回复
SIGUSR2会导致pid进程退出。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧