您的位置:首页 > 运维架构 > Linux

linux下根据进程名字获取PID,类似pidof(转)

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

/***************************************************************************
* File name    :        findpidbyname.c
* Function     :        like pidof
* Author       :        zhangzhao@tass.com.cn
* 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 = 0;
foundpid[0] = 0;
pnlen = strlen(ProcName);

/* Open the /proc directory. */
dir = opendir("/proc");
if (!dir)
{
printf("cannot open /proc");
return -1;
}

/* Walk through the directory. */
while ((d = readdir(dir)) != NULL) {

char exe [PATH_MAX+1];
char path[PATH_MAX+1];
int len;
int namelen;

/* See if this is a process */
if ((pid = atoi(d->d_name)) == 0)       continue;

snprintf(exe, sizeof(exe), "/proc/%s/exe", d->d_name);
if ((len = readlink(exe, path, PATH_MAX)) < 0)
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] = 0;
closedir(dir);

return  0;

}

int main(int argc, char *argv[])
{
int i, rv, pid_t[128];
if ( argc != 2 )
{
fprintf(stdout,"Usage %s procname\n",argv[0]);
return 0;
}

rv = find_pid_by_name( argv[1], pid_t);
if(!rv) {
for(i=0; pid_t[i] != 0; i++)
printf("%d\n", pid_t[i]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: