日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux根据pid查看进程,linux根据pid获取进程名和获取进程pid(c语言获取pid)

發布時間:2025/3/15 linux 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux根据pid查看进程,linux根据pid获取进程名和获取进程pid(c语言获取pid) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2013

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

#include

#include

#include

#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);

}

運行結果:

進入/proc/9674/status查看文件內容,一切對應。

Name: test

State:?S (sleeping)

Tgid:?9674

Pid:?9674

PPid:?7438

TracerPid:?0

Uid:?1000?1000?1000?1000

Gid:?1000?1000?1000?1000

FDSize:?256

Groups:?4 24 27 30 46 112 124 1000

VmPeak:? 4340 kB

VmSize:? 4336 kB

VmLck:? 0 kB

VmPin:? 0 kB

VmHWM:? 600 kB

VmRSS:? 600 kB

VmData:? 184 kB

VmStk:? 136 kB

VmExe:? 4 kB

VmLib:? 1920 kB

VmPTE:? 32 kB

VmSwap:? 0 kB

Threads:?1

SigQ:?0/15776

SigPnd:?0000000000000000

ShdPnd:?0000000000000000

SigBlk:?0000000000000000

SigIgn:?0000000000000000

SigCgt:?0000000000000000

CapInh:?0000000000000000

CapPrm:?0000000000000000

CapEff:?0000000000000000

CapBnd:?0000001fffffffff

Seccomp:?0

Cpus_allowed:?f

Cpus_allowed_list:?0-3

Mems_allowed:?00000000,00000001

Mems_allowed_list:?0

voluntary_ctxt_switches:?1

nonvoluntary_ctxt_switches:?4

總結

以上是生活随笔為你收集整理的linux根据pid查看进程,linux根据pid获取进程名和获取进程pid(c语言获取pid)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。