Linux下的C程序:如何确定是否有其他程序正在运行

时间:2011-10-01 08:56:58

标签: c linux process

在Linux下运行的我的C程序希望通过名称找出另一个程序是否正在运行。怎么做?

4 个答案:

答案 0 :(得分:6)

基本上有两种方式:

  • 使用popen("pgrep yourproc", "r");,然后使用fgets
  • 使用opendirreaddir来解析/proc - 这基本上是ps(1)所做的

不是最干净的,但我会选择其中的第一个。

答案 1 :(得分:3)

真正追踪/proc并不比popen()更难。基本上你做3件事

  • 打开所有数字格式的/proc条目。
  • 通过/proc/<PID>/command /
  • 获取命令调用
  • 对所需进程的名称执行正则表达式匹配。

为了清晰起见,我省略了一些错误处理,但它应该做你喜欢的事情。

int 
main()
{
    regex_t number;
    regex_t name;
    regcomp(&number, "^[0-9]+$", 0);
    regcomp(&name, "<process name>", 0);
    chdir("/proc");
    DIR* proc = opendir("/proc");
    struct dirent *dp;
    while(dp = readdir(proc)){
         if(regexec(&number, dp->d_name, 0, 0, 0)==0){
              chdir(dp->d_name);
              char buf[4096];
              int fd = open("cmdline", O_RDONLY);
              buf[read(fd, buf, (sizeof buf)-1)] = '\0';
              if(regexec(&name, buf, 0, 0, 0)==0)
                    printf("process found: %s\n", buf);
              close(fd);
              chdir("..");
         }
    }
    closedir(proc);
    return 0;
}

答案 2 :(得分:2)

在unix中,程序不运行。 进程运行。可以将进程视为程序的实例。进程可以使用其他名称操作或更改其名称,或者根本没有名称。此外,在运行时,程序甚至可以停止退出(在磁盘上)并且仅存在于核心中。以下面的程序为例:( / dev / null实际运行吗?我不这么认为......)

#include <unistd.h>
#include <string.h>

int main(int arc, char **argv)
{

if (strcmp(argv[0], "/dev/null") ) {
    execl( argv[0], "/dev/null", NULL );
    }

sleep (30);
return 0;
}

答案 3 :(得分:0)

如果您想查看“正确”的方法,请查看以下内容:

Linux API to list running processes?