赞
踩
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>
- #include <stdlib.h>
- #define BUF_SIZE 1024
- char* getPidByName(char* task_name, char * pid)
- {
- 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);
- strcpy(pid, ptr->d_name);
-
- }
- fclose(fp);
- }
-
-
- }
- closedir(dir);//关闭路径
- }
- return ptr->d_name;
- }
-
- 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];
- char *pid = (char*)calloc(10,sizeof(char));
- strcpy(task_name, argv[1]);
- printf("task name is %s\n", task_name);
- getPidByName(task_name, pid);
- printf("---pid is %s\n", pid);
- sprintf(text, "/proc/%s/oom_score_adj", pid);
- fd = open(text, O_WRONLY);
- if (fd >= 0)
- {
- sprintf(text, "%d", -1000);
- write(fd, text, strlen(text));
- close(fd);
- }
- sleep(15);
- }
对转载内容进行了小修改http://www.jb51.net/article/45012.htm
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。