linux 下根据进程名字获取进程的进程号PID

来源:互联网 发布:手机淘宝开店怎么弄 编辑:程序博客网 时间:2024/05/16 08:46
linux 下根据进程名字获取进程的进程号PID,类似pidof,C函数

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;}



0 0
原创粉丝点击