鍍金池/ 問答/C  Linux  網(wǎng)絡(luò)安全  HTML/ who命令實現(xiàn)

who命令實現(xiàn)

在閱讀unix/linux編程實踐教程時閱讀到第二章有個疑問,參看如下代碼

#include <stdio.h>
#include <stdlib.h>
#include <utmp.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>

void showtime( long );
void show_info( struct utmp * utbufp );
int main()
{
    struct utmp    current_record;
    int        utmpfd;
    int        reclen = sizeof( current_record );

    if ( ( utmpfd = open( UTMP_FILE, O_RDONLY ) ) == -1 ){
        perror( UTMP_FILE );
        exit( 1 );
    }

    while ( read( utmpfd, &current_record, reclen ) == reclen )
        show_info( &current_record );
    close( utmpfd );
    return 0;
}

void show_info( struct utmp *utbufp )
{
    if ( utbufp->ut_type != USER_PROCESS )
        return;
    printf("%-8.8s ", utbufp->ut_name );
    printf("%-8.8s ", utbufp->ut_line );
    showtime( utbufp->ut_time );
#ifdef SHOWHOST
    if ( utbufp->ut_host[ 0 ] != '\0' )
        printf("(%s)", utbufp->ut_host);
#endif
    printf("\n");
}

void showtime( long timeval )
{
    char    *cp;
    cp = ctime( &timeval );

    printf("%12.12s", cp + 4 );
}

前面一些介紹就不管了,在show_info函數(shù)中打印了ut_name結(jié)構(gòu)成員,可是我找到該結(jié)構(gòu)體定義的地方發(fā)現(xiàn)該結(jié)構(gòu)沒有這個成員,這就很奇怪了。
圖片描述
可是我去掉ut_name,確又不顯示登錄的用戶名了,現(xiàn)在只能懷疑我找的定義的地方不對,我找到的地方是:
vi /usr/include/x86_64-linux-gnu/bits/utmp.h

另外關(guān)于printf中 -8.8s存在疑問,一般格式控制中-8.8s,左對齊,小數(shù)點前8位,小數(shù)點之后8位,可是printf對應(yīng)的卻是字符串,這該如何解釋?

回答
編輯回答
尐懶貓
可是我找到該結(jié)構(gòu)體定義的地方發(fā)現(xiàn)該結(jié)構(gòu)沒有這個成員,這就很奇怪了。

ut_user應(yīng)該起的就是ut_name的作用, 你找下, 應(yīng)該文件頂部#define ut_name ut_user過了

另外關(guān)于printf中 -8.8s存在疑問,一般格式控制中-8.8s,左對齊,小數(shù)點前8位,小數(shù)點之后8位,可是printf對應(yīng)的卻是字符串,這該如何解釋?

小數(shù)點前面的數(shù)限定了整個打印長度多長, 小數(shù)點后面的數(shù)限定了能顯示的字符串的最大長度:

#include <stdio.h>
int main()
{
    char str[] = "abcdefghij";
    printf("Here are 10 chars: %8.4s\n", str);
    printf("Here are 10 chars: %4.8s\n", str);
    printf("Here are 10 chars: %-8.4s\n", str);
    printf("Here are 10 chars: %-4.8s\n", str);
    return 0;
}   
 clang prog.c -Wall -Wextra -std=c89 -pedantic-errors 

output:

Here are 10 chars: abcd
Here are 10 chars: abcdefgh
Here are 10 chars: abcd
Here are 10 chars: abcdefgh

雖然沒有在標(biāo)準(zhǔn)里面找, 但是我開了-pedantic-errors, 所以這的確是標(biāo)準(zhǔn)里面規(guī)定而不是編譯器的擴(kuò)展, 所以字符串是能這樣格式化輸出的

2018年1月8日 11:31