如何在程序中判断另外一个进程是否正在运行?

内核编译和嵌入式产品的设计与开发
回复
magic1136
帖子: 94
注册时间: 2006-01-02 0:37

如何在程序中判断另外一个进程是否正在运行?

#1

帖子 magic1136 » 2009-09-08 14:29

我现在正在做一个特定环境下的浏览器,在某些页面需要播放一些视频内容,
当用户点击一个视频链接的时候,我启动一个播放器对视频进行播放,但是现在遇到一个问题
,当用户对一个视频点击多次的时候,播放器也会启动多次,造成系统反应速度极慢。
我现在希望做的是,当用户不管点击多少次视频内容,始终只使用一个播放器进行播放,这里就需要判断该进程是否正在运行,
起初我写了一个shell进行判断,但是有局限性,因为设备的不同,shell的命令也不同,不易维护,希望有经验的开发人员给予帮助!

感谢!
头像
linjiework
帖子: 240
注册时间: 2009-07-07 19:52

Re: 如何在程序中判断另外一个进程是否正在运行?

#2

帖子 linjiework » 2009-09-09 14:50

1. 比较笨的办法就是程序运行起来后,创建一个文件,第二个程序运行起来后,检查这个文件,发现存在,则退出,不存在则继续运行。程序退出后,删除该文件即可。
这个方法实现起来比较简单,但容易出问题。比如程序意外崩溃。

2. 可以按照 1 的思路,采用别的方法,比如互斥量等来实现。

3. 可以用 ps -aux | grep programname 来判断程序是否运行。

4. 查 /proc 下的进程名。例程如下 :

/*****************************************************************************
Function: int CheckProcess(char *processname);
Description: check the process.
*****************************************************************************/
int CheckProcess(char *processname)
{
int i, procfd, ret, n, num=0,pid = -1;
struct dirent **namelist;
char fname[100], buffer[100];
char *ptr = NULL;

n = scandir("/proc", &namelist, 0, alphasort);

for(i=0; i<n; i++){
// directly open the cmd if exist
sprintf(fname, "/proc/%s/cmdline", namelist->d_name);
procfd = open(fname, O_RDONLY);
if(procfd > 0){
memset(buffer, 0, sizeof(buffer));
ret = read(procfd, buffer, sizeof(buffer) - 1);
close(procfd);
ptr = strstr(buffer, processname);
if(ret > 0 && ptr != NULL){
if (strlen(ptr) == strlen(processname)){
pid = atoi(namelist->d_name);
num ++;
}
}
}
free(namelist);
}
free(namelist);
return num > 0? num:0;
}
阿呆 : 天下第一呆!
回复