zoukankan      html  css  js  c++  java
  • 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] = '';
    
                    /* 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] == '') {
                                    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
    ",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
    ", pid_t[i]);
            }
    
            return 0;
    }
  • 相关阅读:
    mysql索引
    springboot mybatis 后台框架平台 shiro 权限 集成代码生成器
    java 企业网站源码模版 有前后台 springmvc SSM 生成静态化
    java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
    activiti工作流的web流程设计器整合视频教程 SSM和独立部署
    .Net Core中的ObjectPool
    文件操作、流相关类梳理
    .Net Core中的配置文件源码解析
    .Net Core中依赖注入服务使用总结
    消息中间件RabbitMQ(一)
  • 原文地址:https://www.cnblogs.com/sanchrist/p/3939850.html
Copyright © 2011-2022 走看看