0

私の関数は からプロセス リストを読み込み/proc、次にプロセスpsinfoファイルを適切な構造に読み込み、このファイルに関するデータを読み込んで出力します。問題は、これらの構造のデータの一部が間違っていることです。いつものように、プログラムが部分的に動作する瞬間が最も混乱します。常に 0 である PID (pr_pid) と、これも常に 0 であるファイルの UID を除いて、すべてのデータを正しく読み取ります。なぜですか? データが部分的に正しく読み込まれる可能性はありますか? 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.ネット/人/2/統計

コード:

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));
}
4

1 に答える 1

2

これを見てください:

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

最初の行で pData を buffer の内容に設定してから解放しています。pData が指すものは失われ、実際には次の malloc で再利用される可能性があります。上記の最後の行でそれを使用しようとすると、誰が何を知っているかを読んでいます。この場合、あなたは積極的に解放しすぎています。使い終わるまで、pData を解放しないでください (バッファーを介して間接的に)。

于 2013-04-09T13:09:10.087 に答える