作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
今天的第二个问题,第一个问题确实有帮助。
这是我的代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/procfs.h>
#include <sys/fcntl.h>
#include <pwd.h>
char *getWaitChannel(int pid);
char *getPath(int pid);
char *getUserName(int uid);
int getBytes(int pid);
int main(int argc, char *argv[])
{
long x;
if (argc < 2){
//error message
}
x = strtol(argv[1], NULL, 10);
printf("Good 1\n");
get_info(x, argc, argv);
}
int get_info(pid_t pid)
{
char path[40], line[100], *p, stateChar[100], Name[100];
FILE* statusf;
char buf[100];
printf("This is pid %d\n", pid);
int uid, vM;
snprintf(path, 40, "/proc/%d/status", pid);
statusf = fopen(path, "r");
if(statusf == NULL)
return -1;
while(fgets(buf,sizeof buf, statusf) != NULL){
sscanf(buf, "State: %s", stateChar);
sscanf(buf, "Name: %s", Name);
sscanf(buf, "Uid: %d", &uid);
sscanf(buf, "VmPeak: %d", &vM);
}
char *channel = getWaitChannel(pid);
char *full_path = getPath(pid);
char *user = getUserName(uid);
int b = getBytes(pid);
printf("State: %s\n", stateChar);
printf("Name: %s\n", Name);
printf("Uid: %d\n", uid);
printf("Username: %s\n", user);
printf("Max Virtual Memory: %d\n", vM);
printf("Full Path: %s\n", full_path);
printf("Bytes written to storage layer: %d\n", b);
printf("Waiting channel: %s\n", channel);
}
char *getUserName(int uid)
{
struct passwd *pw = getpwuid(uid);
if (pw)
{
return pw->pw_name;
}
return "";
}
int getBytes(int pid)
{
FILE* statusf2;
char path[40];
char buf2[100];
int storage_bytes;
snprintf(path, 40, "/proc/%d/io", pid);
statusf2 = fopen(path, "r");
if(statusf2 == NULL)
return -1;
while(fgets(buf2,sizeof buf2, statusf2) != NULL){
sscanf(buf2, "write_bytes: %d", &storage_bytes);
return storage_bytes;
}
}
char *getPath(int pid)
{
FILE* statusf3;
char path[40];
char buf3[100];
char *fullpath;
snprintf(path, 40, "/proc/%d/cmdline", pid);
statusf3 = fopen(path, "r");
if(statusf3 == NULL)
return "";
while(fgets(buf3,sizeof buf3, statusf3) != NULL){
sscanf(buf3,"/ %s", fullpath);
return fullpath;
}
}
char *getWaitChannel(int pid)
{
FILE* statusf4;
char path[40];
char buf4[100];
char *channel;
snprintf(path, 40, "/proc/%d/stack", pid);
statusf4 = fopen(path, "r");
if(statusf4 == NULL)
return "";
while(fgets(buf4,sizeof buf4, statusf4) != NULL){
sscanf(buf4,"[<c0227f4e>] %s", channel);
return channel;
}
}
我正在获取有关名称、状态、UID 和用户名以及 VmPeak 的信息。他们正在按照我想要的方式工作。但其他 3 个是我似乎无法使它们工作的问题,我无法找出原因(完整路径、写入存储层的字节和等待 channel )。所以我的问题是如何访问它们并打印信息。
最佳答案
如 alk 所示,修改 getWaitChannel() 为 channel 分配内存。稍后不需要 channel 数据时需要释放内存。
char *getWaitChannel(int pid)
{
FILE* statusf4;
char path[40];
char buf4[100];
char *channel;
channel = malloc(1024);
/* Add error handling for malloc failure here */
snprintf(path, 40, "/proc/%d/stack", pid);
statusf4 = fopen(path, "r");
if(statusf4 == NULL)
return "";
while(fgets(buf4,sizeof buf4, statusf4) != NULL){
sscanf(buf4,"[<c0227f4e>] %s", channel);
return channel;
}
}
检查您的代码,看看是否有任何其他变量(例如完整路径)需要内存分配,并通过注释代码的某些部分来捕获错误来执行逐步调试。
关于c - 如何从/proc/pid/打印信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35871340/
我是一名优秀的程序员,十分优秀!