首页 > 系统相关 >linux c pid获取进程名 进程名获取pid

linux c pid获取进程名 进程名获取pid

时间:2023-08-02 09:13:03浏览次数:36  
标签:fp task name pid 获取 进程 proc

原文

Liunx中 通过进程名查找进程PID可以通过 pidof [进程名] 来查找。反过来 ,相同通过PID查找进程名则没有相关命令。
在linux根目录中,有一个/proc的VFS(虚拟文件系统),系统当前运行的所有进程都对应于该目录下的一个 以进程PID命名的文件夹 ,其中存放进程运行的N多信息。其中有一个status文件,cat显示该文件, 第一行的Name 即为进程名。

打开stardict程序,进程名为stardict;

shell中分别根据Pid获取进程名、根据进程名获取Pid

1)查找stardict的pid:pidof stardict

2)根据1)的pid查找进程名: grep "Name:" /proc/5884/status

应用:kill一个进程需要指定该进程的pid,所以我们需要先根据进程名找到pid,然后再kill;

   killall命令则只需要给定进程名即可,应该是封装了这个过程。

C程序中实现上述过程

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
 
#define BUF_SIZE 1024
 
void getPidByName(pid_t *pid, char *task_name)
{
    DIR *dir;
    struct dirent *ptr;
    FILE *fp;
    char filepath[50];
    char cur_task_name[50];
    char buf[BUF_SIZE];
 
    dir = opendir("/proc"); 
    if (NULL != dir)
    {
        while ((ptr = readdir(dir)) != NULL) //循环读取/proc下的每一个文件/文件夹
        {
            //如果读取到的是"."或者".."则跳过,读取到的不是文件夹名字也跳过
            if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0))
                continue;
            if (DT_DIR != ptr->d_type)
                continue;
           
            sprintf(filepath, "/proc/%s/status", ptr->d_name);//生成要读取的文件的路径
            fp = fopen(filepath, "r");
            if (NULL != fp)
            {
                if( fgets(buf, BUF_SIZE-1, fp)== NULL ){
                    fclose(fp);
                    continue;
                }
                sscanf(buf, "%*s %s", cur_task_name);
        
                //如果文件内容满足要求则打印路径的名字(即进程的PID)
                if (!strcmp(task_name, cur_task_name)){
                    sscanf(ptr->d_name, "%d", pid);
                }
                fclose(fp);
            }
        }
        closedir(dir);
    }
}
 
void getNameByPid(pid_t pid, char *task_name) {
    char proc_pid_path[BUF_SIZE];
    char buf[BUF_SIZE];
 
    sprintf(proc_pid_path, "/proc/%d/status", pid);
    FILE* fp = fopen(proc_pid_path, "r");
    if(NULL != fp){
        if( fgets(buf, BUF_SIZE-1, fp)== NULL ){
            fclose(fp);
        }
        fclose(fp);
        sscanf(buf, "%*s %s", task_name);
    }
}
 
void main(int argc, char** argv)
{
    char task_name[50];
    pid_t pid = getpid();
 
    printf("pid of this process:%d\n", pid);
    getNameByPid(pid, task_name);
    
    /*
    strcpy(task_name, argv[0]+2);
    printf("task name is %s\n", task_name);
    getPidByName(task_name);
    */
    printf("getNameByPid:%s\n", task_name);
    getPidByName(&pid, task_name);
    printf("getPidByName:%d\n", pid);
    sleep(15);
}

 

运行结果:

进入/proc/4173/status查看文件内容,一切对应。

Name: test
State: S (sleeping)
Tgid: 4173
Pid: 4173
PPid: 2721
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Groups: 4 24 27 30 46 109 124 1000
VmPeak: 4300 kB
VmSize: 4296 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 600 kB
VmRSS: 600 kB
VmData: 180 kB
VmStk: 136 kB
VmExe: 4 kB
VmLib: 1884 kB
VmPTE: 32 kB
VmSwap: 0 kB
Threads: 1
SigQ: 0/27055
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed: f
Cpus_allowed_list: 0-3
Mems_allowed: 00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 2
nonvoluntary_ctxt_switches: 9

 

标签:fp,task,name,pid,获取,进程,proc
From: https://www.cnblogs.com/peifx/p/17599652.html

相关文章

  • 淘宝/天猫API,获取购买到的商品订单详情
    淘宝/天猫获取购买到的商品订单详情API返回值说明buyer_order_detail-获取购买到的商品订单详情公共参数请求地址:console.open.onebound.cn/console/ind…名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在......
  • 淘宝API 接口,获取购买到的商品订单列表(官方订单 API 接口)
    淘宝/天猫获取购买到的商品订单列表API返回值说明buyer_order_list-获取购买到的商品订单列表公共参数请求地址:console.open.onebound.cn/console/?i=…名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请......
  • 请求示例curl获取淘宝1688京东等电商平台商品详情数据API接口,批量采集
    获得页面使用命令:curlhttp://curl.haxx.se这是最简单的使用方法。用这个命令获得了http://curl.haxx.se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将只显示文件头部,即HTML文档的header。要全部显示,请加参数......
  • 万邦淘宝/天猫获取购买到的商品订单物流 API 返回值说明
    onebound.taobao.buyer_order_express公共参数请求地址:console.open.onebound.cn/console/?i=…名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cache......
  • 抖音获客系统简介,精准获取,系统简介
    功能介绍功能获取获客系统主要核心数据看板名词介绍当前运行任务:系统正在运行的获客任务总数,获取客户档案:符合任务规则提取的目标客户,总分析任务:系统合计运行的获客任务,总视频数:符合任务规则提取的视频总数,剩余点数:系统所有用户剩余的任务点数,消耗点数:系统所有用户消耗的任务点数,总......
  • 数据获取系列,1688商品详情API接口
    onebound.1688.item_get公共参数注册Key和secret测试名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes,将调用缓存的数据,速......
  • 获取各大电商平台item_get商品详情api接口
    各平台的商品详情淘宝api接口的参数返回值、参数都如所下展示:以下是行业内了解到的一些情况,本帖只展示1688商品详情代码,需要更多API调试请移步获取API调用KEY以及秘钥https://console.open.onebound.cn/console/?i=Anzexiitem_get-获得1688商品详情公共参数名称类型必须描述keyStri......
  • 线上问题排查--进程重启失败,最后发现是忘了cd
    背景我前面写了几篇文章,讲c3p0数据库连接池发生了连接泄露,但是随机出现,难以确定根因,最终呢,为了快速解决问题,我是先写了个shell脚本,脚本主要是检测服务的接口访问日志,看看过去的30s内是不是接口几乎都超时了,如果是的话,咱们就重启服务。然后把这个shell加入到了crontab里,每30s调度......
  • 如何获取Oracle sql monitor报告
    ql_monitor监控执行时间超过5s的sql,或者开启并行的sql,或者加了/+monitor/的sql,应该是记录实例启动以来的sqlsetlinesize200setpages30colsql_textformata50trunccolinst_idformat99colusernameformata10trunccolsql_idformata14coldate_startformata......
  • Json格式的数据获取,电商API接口获取商品详情
    为了进行淘宝的API开发,首先我们需要做下面几件事情。1)开发者注册一个账号注册链接2)然后为每个淘宝应用注册一个应用程序键(AppKey)。3)下载淘宝API的SDK并掌握基本的API基础知识和调用4)利用SDK接口和对象,传入AppKey或者必要的时候获取并传入SessionKey来进行程序开......