linux有一个命令行工具叫做pidof,可以根据用户输入的进程名字查找到进程号,但有时候我们需要在程序里实现,不想调用system,在查阅了很多版本的pidof源代码后,没有发现一个自己感觉比较好的,所以就参照linux上的pidof的源代码,改写出了一版,供大家参考使用。

/***************************************************************************
* File name : findpidbyname.c
* Function : like pidof
* Author : [email protected]
* Date : 2012/12/
* Version : v1.0
* Description : Find process's pid by name in linux.
* ModifyRecord :
****************************************************************************/ #include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h> int find_pid_by_name( char* ProcName, int* foundpid)
{
DIR *dir;
struct dirent *d;
int pid, i;
char *s;
int pnlen; i = ;
foundpid[] = ;
pnlen = strlen(ProcName); /* Open the /proc directory. */
dir = opendir("/proc");
if (!dir)
{
printf("cannot open /proc");
return -;
} /* Walk through the directory. */
while ((d = readdir(dir)) != NULL) { char exe [PATH_MAX+];
char path[PATH_MAX+];
int len;
int namelen; /* See if this is a process */
if ((pid = atoi(d->d_name)) == ) continue; snprintf(exe, sizeof(exe), "/proc/%s/exe", d->d_name);
if ((len = readlink(exe, path, PATH_MAX)) < )
continue;
path[len] = '\0'; /* Find ProcName */
s = strrchr(path, '/');
if(s == NULL) continue;
s++; /* we don't need small name len */
namelen = strlen(s);
if(namelen < pnlen) continue; if(!strncmp(ProcName, s, pnlen)) {
/* to avoid subname like search proc tao but proc taolinke matched */
if(s[pnlen] == ' ' || s[pnlen] == '\0') {
foundpid[i] = pid;
i++;
}
}
} foundpid[i] = ;
closedir(dir); return ; } int main(int argc, char *argv[])
{
int i, rv, pid_t[];
if ( argc != )
{
fprintf(stdout,"Usage %s procname\n",argv[]);
return ;
} rv = find_pid_by_name( argv[], pid_t);
if(!rv) {
for(i=; pid_t[i] != ; i++)
printf("%d\n", pid_t[i]);
} return ;
}
05-06 06:49