如何从进程ID获取进程名?
例如,我执行cat file1.txt命令,但我想知道该命令及其参数在系统中的进程ID。 是否有一个结构体可以确定它或类似的东西? 有什么想法吗?
在 Unix 中没有通用的方法来做到这一点。
每个操作系统处理这个问题的方式都不同,有些非常困难。但是你提到了 Linux。对于 Linux 来说,信息存储在 /proc 文件系统中。
要获取进程 ID 为 9999 的命令行,请读取文件 /proc/9999/cmdline
。
/proc/9999/comm
。 - Skippy le Grand Gourou/proc/$pid/comm
似乎将输出截断为15个字符。这非常...非常糟糕... - Artfaith/proc/<PID>/comm
达到 16 个字符或 TASK_COMM_LEN,它将被截断,更好的方法是读取 /proc/<PID>/exe
的 realpath
。如此所示 here。 - RikuPotato/proc/
目录。尝试键入man proc
以获取更多信息。 /proc/$PID/cmdline
的内容将为您提供进程$PID
运行的命令行。还有一个/proc/self
用于检查自己 :)libproc
。请参见libproc.h。POSIX C并没有提供一种标准API来通过PID获取进程名。
在Linux中,您可以通过LINUX Proc API获取名称:/proc/$PID/cmdline。相应的代码如下:
const char* get_process_name_by_pid(const int pid)
{
char* name = (char*)calloc(1024,sizeof(char));
if(name){
sprintf(name, "/proc/%d/cmdline",pid);
FILE* f = fopen(name,"r");
if(f){
size_t size;
size = fread(name, sizeof(char), 1024, f);
if(size>0){
if('\n'==name[size-1])
name[size-1]='\0';
}
fclose(f);
}
}
return name;
}
要获取进程ID为9000的进程名称,请使用以下命令:
ps -p 9000 -o comm=
1111
通过pipe
创建进程2222
时(至少是我听说的),/proc/2222/cmdline
并不能给出正确的进程名称,而是会给出类似于1111_1
的东西。我必须使用/proc/2222/comm
来获取正确的进程名称。在Linux中使用以下命令:
最初的回答
ls -l /proc/[pid]/exe
它将提供进程/应用程序名称
",其中保留了HTML标签。ps --pid <pid> -o comm h
:
该命令可提供可执行文件名称。例如,如果您运行脚本name.sh,则上述命令的输出为bash
ps --ppid <pid> -o comm h
:
该命令的输出为name