通过pid获取进程名和通过进程名获取pid

转载:http://blog.csdn.net/zhukangle/article/details/53396924

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#define BUF_SIZE 1024
void getPidByName(char* task_name)
{
    DIR *dir;
    struct dirent *ptr;
    FILE *fp;
    char filepath[50];//大小随意,能装下cmdline文件的路径即可
    char cur_task_name[50];//大小随意,能装下要识别的命令行文本即可
    char buf[BUF_SIZE];
    dir = opendir("/proc"); //打开路径
    if (NULL != dir)
    {
        while ((ptr = readdir(dir)) != NULL) //循环读取路径下的每一个文件/文件夹
        {
            //如果读取到的是"."或者".."则跳过,读取到的不是文件夹名字也跳过
            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))
                    printf("PID:  %s\n", ptr->d_name);
                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("task name is %s\n", task_name);
    getPidByName(task_name);
    sleep(15);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux环境下,我们可以通过进程ID(PID)来获取指定进程进程。 要实现这个功能,可以使用系统调用函数`prctl()`,该函数是进程控制相关的函数之一。`prctl()`的原型如下: ```c int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5); ``` 其中,`option`参数指定了要进行的控制操作。对于获取进程,我们可以使用`PR_GET_NAME`选项。 具体实现步骤如下: 1. 包含头文件`<sys/prctl.h>`。 2. 调用`prctl()`函数,传入参数`PR_GET_NAME`,并将进程存储在一个字符数组中。 3. 如果`prctl()`函数返回0,则表示获取进程成功,可以通过输出字符数组来打印出进程。 示例代码如下: ```c #include <sys/prctl.h> #include <stdio.h> int main() { char process_name[16]; // 定义一个字符数组来存储进程 if(prctl(PR_GET_NAME, process_name) == 0) { printf("Process name: %s\n", process_name); } else { printf("Failed to get process name.\n"); } return 0; } ``` 上述代码中,我们定义了一个大小为16的字符数组`process_name`,用于存储获取到的进程。然后通过调用`prctl()`函数并传入`PR_GET_NAME`选项,将进程存储在`process_name`中。最后,通过输出字符数组来打印出进程。 需要注意的是,上述代码是获取当前进程进程。如果要获取指定进程ID的进程,需要先根据进程ID使用函数`kill(pid, 0)`来判断该进程是否存在,若存在再使用`prctl()`函数获取进程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值