stat()中的UID值与psinfo_t中的错误pr_pid错误

时间:2013-04-09 12:51:53

标签: c++ c unix solaris pid

我的函数从/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));
}

1 个答案:

答案 0 :(得分:2)

看看这个:

psinfo_t* pData = (psinfo_t*) buffer;
free(buffer);
 ...
int pr_pid=pData->pr_pid;

您将pData设置为第一行中缓冲区的内容,然后释放它。 pData指向的内容现在已经丢失了,实际上它可能会在下一个malloc中重用。当你尝试在上面的最后一行使用它时,你正在阅读谁知道什么。在这种情况下,你会过于激进。在完成使用之前,不要释放pData(间接通过缓冲区)。