Воспроизведение команды Linux stat в C

Я пишу свою собственную версию команды stat, и мне трудно получить правильный вывод для Device поле.

Когда я запускаю Linux stat Команда на пустой файл в рабочем каталоге я получаю:

Device: 801h/2049d  

Чтобы повторить это, я попытался извлечь из stat структура, st_dev поле.

Но печать st_dev дает мне

Device: 801

Я скучаю по h в конце, и я не уверен, где 2049d происходит от.

Первая часть - просто проблема форматирования? Я печатаю в hex формат. И как я могу извлечь 2049d?

1 ответ

Решение

С (шестнадцатеричное) 0x801 == 2049 (десятичное число), вы можете получить результат, который вы ищете:

printf("Device: %xh/%dd\n", st.st_dev, st.st_dev);

h в формате h который появляется в конце 801h; %x означает "напечатать число в шестнадцатеричном виде". Точно так же %d означает печать в десятичном виде, и завершающий d это d в 2049d,

Кстати, на Linux и других платформах POSIX вы также можете избежать повторения st.st_dev аргумент. Например:

#include <stdio.h>

int main(void)
{
    printf("Device: %1$xh/%1$dd\n", 0x801);
    return 0;
}

Это также производит:

Device: 801h/2049d

Чтобы понять почему, прочитайте printf() Спецификация очень тщательно. Обратите внимание, что если вы используете один из 1$ модификаторы, вы должны (должны) использовать его с каждой спецификацией преобразования.

Другие вопросы по тегам