- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的函数从/proc
中读取进程列表,然后将进程psinfo
文件读入适当的结构,以及有关该文件的数据,并打印出来。问题是,这些结构中的某些数据是错误的。像往常一样,程序部分工作的时刻是最令人困惑的。它读取所有数据都是正确的,除了 PID (pr_pid) 始终为 0,文件的 UID 也始终为 0。为什么?数据是否可以部分正确加载?那应该是不可能的。如果我们谈论的是 PPID,那么 0 是可能的,但是 solaris 文档清楚地指出 pr_pid 是 PID。我认为会有答案的链接,但我找不到:
http://docs.oracle.com/cd/E19963-01/html/821-1473/proc-4.html http://linux.die.net/man/3/getpwnam http://linux.die.net/man/2/stat
代码:
void printProcessInformation(char pid[]){
//find full path name to your "stat" file
//DIR *dir;
//struct dirent *ent;
//Creating string with /proc/PID
char * s = malloc(snprintf(NULL, 0, "%s%s", "/proc/", pid) + 1);
sprintf(s, "%s%s", "/proc/", pid);
//Creating string with /proc/PID/psinfo (full path)
char * fullPath = malloc(snprintf(NULL, 0, "%s%s", s, "/psinfo") + 1);
sprintf(fullPath, "%s%s", s, "/psinfo");
free(s);
//printf("%s\n",fullPath);
//Reading data from file
FILE* file = fopen(fullPath, "r");
char* buffer;
buffer = (char*) malloc(sizeof(psinfo_t));
if(file == NULL)
{
perror("Error: Couldn't open file");
return;
}
fread((void *)buffer, sizeof(psinfo_t), 1, file);
psinfo_t* pData = (psinfo_t*) buffer;
free(buffer);
buffer = (char*) malloc(sizeof(stat));
stat(file,buffer);
struct stat* fileStat=(struct stat*) buffer;
printf("File owner id:%d\n",fileStat->st_uid);
free(buffer);
fclose(file);
struct passwd* pw=getpwuid(fileStat->st_uid);
//Loading data from structures
time_t sTime=pData->pr_start.tv_sec;
int pr_pid=pData->pr_pid;
char* fname=pData->pr_fname;
char* uid=pw->pw_name;
printf("%8s %5d %16s %.24s\n", uid, pr_pid, fname, ctime(&sTime));
}
最佳答案
看看这个:
psinfo_t* pData = (psinfo_t*) buffer;
free(buffer);
...
int pr_pid=pData->pr_pid;
您在第一行将 pData 设置为缓冲区的内容,然后释放它。 pData 指向的内容现在对您来说丢失了,它实际上可能会在下一个 malloc 中重新使用。当您尝试在上面的最后一行中使用它时,您正在阅读谁知道什么。在这种情况下,您的释放过于激进。在使用完 pData 之前不要释放它(通过缓冲区间接释放)。
关于c++ - stat() 中 UID 的错误值和 psinfo_t 中错误的 pr_pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15902446/
在 solaris 中从 procfs.h 将 psinfo 数据文件 (/proc/%d/psinfo) 中的进程信息读取到 struct psinfo_t 中时,未在 psinfo_t 结构的字段
在 Solaris 中, 我需要从内核空间和用户空间获取进程启动时间。 我找到给定进程的 2 个开始时间,它们不相等! 一个位于 proc struct (链接很旧但结构几乎相同)并且一个在 ps_i
我的函数从/proc 中读取进程列表,然后将进程psinfo 文件读入适当的结构,以及有关该文件的数据,并打印出来。问题是,这些结构中的某些数据是错误的。像往常一样,程序部分工作的时刻是最令人困惑的。
我是一名优秀的程序员,十分优秀!