首页 > 代码库 > linux下根据进程名字获取PID,类似pidof(转)
linux下根据进程名字获取PID,类似pidof(转)
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;}
linux下根据进程名字获取PID,类似pidof(转)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。