Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185922
  • 博文数量: 49
  • 博客积分: 2065
  • 博客等级: 大尉
  • 技术积分: 413
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-08 17:04
文章分类

全部博文(49)

文章存档

2012年(2)

2010年(17)

2009年(30)

我的朋友

分类: C/C++

2010-01-19 14:36:11



/* find_pid_by_name()
 *  
 *  This finds the pid of the specified process.
 *  Currently, it's implemented by rummaging through
 *  the proc filesystem.
 *  Returns a list of all matching PIDs
 */

long* find_pid_by_name( char* pidName)
{
    DIR *dir;
    struct dirent *next;
    long* pidList=NULL;
    int i=0;

    dir = opendir("/proc");
    if (!dir)
    {
        //perror_msg_and_die("Cannot open /proc");
        fprintf(stderr, "Cannot open /proc\n");
         return pidList;
    }

    while ((next = readdir(dir)) != NULL)
    {
        FILE *status;
        char filename[READ_BUF_SIZE];
        char buffer[READ_BUF_SIZE];
        char name[READ_BUF_SIZE];

        /* Must skip ".." since that is outside /proc */
        if (strcmp(next->d_name, "..") == 0)
            continue;

        /* If it isn't a number, we don't want it */
        if (!isdigit(*next->d_name))
            continue;

        sprintf(filename, "/proc/%s/status", next->d_name);

        if (! (status = fopen(filename, "r")) )
        {
            continue;
        }

        //Read first line in /proc/?pid?/status

        if (fgets(buffer, READ_BUF_SIZE-1, status) == NULL)
        {
            fclose(status);
            continue;
        }

        fclose(status);

        // Buffer should contain a string like "Name:   binary_name"

        sscanf(buffer, "%*s %s", name);
        if (strcmp(name, pidName) == 0)
        {
            pidList=realloc( pidList, sizeof(long) * (i+2));
            pidList[i++]=strtol(next->d_name, NULL, 0);
        }
    }

    if (pidList)
    {
        pidList[i]=0;
    }
//   else
//    {
//       pidList=realloc( pidList, sizeof(long));
//       pidList[0]=-1;
//    }
    return pidList;
}
阅读(949) | 评论(0) | 转发(0) |
0

上一篇:判断ip是否有效

下一篇:sudo几个小技巧

给主人留下些什么吧!~~