1

私たちの割り当てでは、ログのコピーが与えられ、wtmpそれを解析して、の出力と同様にソートされた形式で出力することが期待されますlast

wtmpこれで、ファイルが構造のリストで構成されていることがわかりましたutmp。提供されるファイルには、少なくとも1つのutmp構造が含まれていることが保証されており、バイナリファイル内のすべての構造が正しく構築されていると想定しています。

man utmp読み通し、提供されたバイナリファイルから構造体を読み込むプログラムを正常に作成しました。(長い印刷方法についてお詫びします)

#include <stdio.h>
#include <string.h>
#include <utmp.h>
#include <stdlib.h>

void utmpprint(struct utmp *log);

int main() {

    int logsize = 10;
    FILE *file;
    struct utmp log[logsize];
    int i = 0;

    file = fopen("wtmp", "rb");

    if (file) {
            fread(&log, sizeof(struct utmp), logsize, file);
            for(i = 0; i < logsize; i++) {
                    utmpprint(&log[i]);
            }
    } else {
            return(0);
    }
    return(0);
}


void utmpprint(struct utmp *log) {
    printf("{ ut_type: %i, ut_pid: %i, ut_line: %s, ut_id: %s,
        ut_user: %s, ut_host:   %s, ut_exit: { e_termination: %i,
        e_exit: %i }, ut_session: %i, timeval: { tv_sec: %i, tv_usec: %i },
        ut_addr_v6: %i }\n\n", log->ut_type, log->ut_pid, log->ut_line,
        log->ut_id, log->ut_user, log->ut_host, log->ut_exit.e_termination,
        log->ut_exit.e_exit, log->ut_session, log->ut_tv.tv_sec,
        log->ut_tv.tv_usec, log->ut_addr_v6);
}

さて、私が抱えている問題は、これを実行すると、の出力がut_id期待したものと異なることです。

から:man utmp

char ut_id[4];      /*Terminal name suffix, or inittab(5) ID */

私の出力:

... ut_line: pts/2, ut_id: ts/2jsmith, ut_user: jsmith, ...

ここで何が起こっているのかよくわかりません。起こっていると思うのは、ut_idフィールドが、私が読み込んでいる構造体に存在しない可能性があるということです。これが、ut_idフィールドが両側のフィールドとして一緒に押しつぶされて表示されている理由を説明していると思います。

fprintf書式を使用してフィールドを正しく表示できると思いましたが、文字列内から特定の部分を取得することはできず、char配列の片側にのみテキストを書式設定できるようです。

そうでなければ、私はかなり迷っています。これは、構造体についての私の理解のギャップにすぎませんか?

答えを探しているのではなく、正しい方向に進んでいるだけです。

また、端末名のサフィックスは正確には何ですか?それは後に続く数字だけpts/ですか?

4

1 に答える 1

2

man utmpは、「文字列フィールドは、フィールドのサイズよりも短い場合、ヌルバイト('\ 0')で終了します」と述べています。したがって、特に、フィールドと同じサイズの場合、ヌルバイトで終了することはありません。整形式のC文字列は、ヌルバイトで終了する必要があります。フィールドが4文字の長さの「ts/2」であるように見えるという事実ut_idは、終了ヌルバイトがないことを示しています。

への%sformatting引数を使用してchar配列を出力していますprintf。これにより、ヌルバイトに達するまで印刷が続行されます。の各フィールドを、構造体のサイズより1つ大きいutmp一時的なchar配列にコピーする必要があることをお勧めします。その一時配列の最後のバイトがヌルバイトであることを確認してください。そうすれば、正常に出力されます。utmp

于 2012-06-19T01:29:47.180 に答える