在Linux下运行的我的C程序希望通过名称找出另一个程序是否正在运行。怎么做?
答案 0 :(得分:6)
基本上有两种方式:
popen("pgrep yourproc", "r");
,然后使用fgets
opendir
和readdir
来解析/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)
如果您想查看“正确”的方法,请查看以下内容: