1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > linux c 通过 pid 获取 进程相关信息 cmdline

linux c 通过 pid 获取 进程相关信息 cmdline

时间:2021-02-04 06:35:35

相关推荐

linux c 通过 pid 获取 进程相关信息 cmdline

linux系统命令ps和top都是通过读取/proc/$PID 目录下的信息获取进程的相关信息, 它遍历/proc目录下的首字符为数字的目录,获取系统进程的信息。

我们经常会把pid写到/var/run/xxx.pid中,可能会有获取该进程相关信息的需要,可以通过读取/proc/$PID取得ps命令可获取的一切进程信息。

下面是通过PID获取进程cmdline的实现:

/** getcmdline.c** Copyright (C) crazyleen <ruishenglin@>* */#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>/** get cmdline from PID. Read progress info form /proc/$PID. */static int read_to_buf(const char *filename, void *buf, int len){int fd;int ret;if(buf == NULL || len < 0){printf("%s: illegal para\n", __func__);return -1;}memset(buf, 0, len);fd = open(filename, O_RDONLY);if(fd < 0){perror("open:");return -1;}ret = read(fd, buf, len);close(fd);return ret;}static char *get_cmdline_from_pid(int pid, char *buf, int len){char filename[32];char *name = NULL;int n = 0;if(pid < 1 || buf == NULL || len < 0){printf("%s: illegal para\n", __func__);return NULL;}snprintf(filename, 32, "/proc/%d/cmdline", pid);n = read_to_buf(filename, buf, len);if(n < 0)return NULL;if(buf[n-1]=='\n')buf[--n] = 0;name = buf;while(n) {if(((unsigned char)*name) < ' ')*name = ' ';name++;n--;}*name = 0;name = NULL;if(buf[0])return buf;return NULL;}int main(int argc, char **argv){char buf[1024];printf("============\n");printf("argv[0]: %s\n", argv[0]);get_cmdline_from_pid(getppid(), buf, 1024);printf("PPID [ %d ] cmdline: %s\n", getppid(), buf);;printf("PID [ %d ] cmdline: %s\n", getpid(), get_cmdline_from_pid(getpid(), buf, 1024));printf("init [ 1 ] cmdline: %s\n", get_cmdline_from_pid(1, buf, 1024));printf("============\n");return 0;}

输出结果:

$ gcc getcmdline.c && ./a.out -d 22============argv[0]: ./a.outPPID [ 21751 ] cmdline: /bin/bash PID [ 22515 ] cmdline: ./a.out -d 22 init [ 1 ] cmdline: /sbin/init============

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。