Составление “недостающей памяти” от sysctl

[

] для удаления последних []n[] символов из строки, которая не использует []sed[] или []awk[]: [

] [
> echo lkj | rev | cut -c (n+1)- | rev
] [

], например, последний символ []один символ [] можно удалить, используя следующее:[

] [
> echo lkj | rev | cut -c 2- | rev

> lk
] [

] из меню []rev[]:[

] [
] [

]DESCRIPTION[
]. Утилита rev копирует указанные файлы в стандартный вывод, изменение порядка символов в каждой строке. Если ни один файл не является специфицированным... fied, считывается стандартный вход.[

] [
] [

]UPDATE:[

] [

]если вы не знаете длину строки, попробуйте:[

] [
$ x="lkj"
$ echo "${x%?}"
lk
]
1
24.12.2014, 19:27
1 ответ

Я сделал некоторую глупую ошибку по математике в коде Python?

На самом деле, это ваш C-код, который не так.

Наиболее прямое исправление к вашему коду является это:

#include <stdio.h>
#include <sys/sysctl.h>

int main(void)
{
    int64_t bytes;
    size_t len = sizeof(bytes);
    sysctl({ CTL_HW, HW_PHYSMEM64 }, 2, &bytes, &len, NULL, 0);
    int megs = bytes / 1024 / 1024;
    printf("AMT MEM: %d MiB\n", megs);
}

, если вы используете вместо этого HW_PHYSMEM , он работает только на машинах с до 2 GIB оперативной памяти, поскольку он хранит количество байтов в Предполагается, что переменная составляет 32 бита в размерах. Изменение на 64-битный аргумент требует нового SYSCTL значение, чтобы избежать нарушения обратной совместимости. Вот почему Page Sysctl (3) Sysctl (3) . HW_PHYSMEM устарели.

Я сделал несколько свобод в коде выше. Я делаю часть математики в C-коде C, чтобы я мог прочитать вывод, не подавая его через калькулятор. Я также фиксировал несколько предупреждений типа целого типа и переименовал в NUM_ в байта Для ясности.

Этот код работает нормально на некоторых BSDS, ², но не на OS X или FreeBSD.

При взгляде на страницу OS X кажется, что они хотят, чтобы вы использовали SYSCTLBYNAME (3) вместо этого. Это хорошо работает здесь на Йосемите:

#include <stdio.h>
#include <sys/sysctl.h>

int main(void)
{
    int64_t bytes;
    size_t len = sizeof(bytes);
    sysctlbyname("hw.memsize", &bytes, &len, NULL, 0);
    int megs = bytes / 1024 / 1024;
    printf("AMT MEM: %d MiB\n", megs);
}

У меня 16 Gib физической оперативной памяти, и он правильно сообщает 16384 MIB.

Если вы попробуете это на FreeBSD, хотите, вы получаете 0 как ответ. Немного покринга говорит, что он хочет hw.physmemem вместо.

И еще раз мы ударили стену, потому что пытаясь , что SysctlbyName значение на OS X придает тому, что приводит к тому, что вы обнаружены.

Следовательно, нижний ответ - это то, что все это высокосистематично. Если вам нужно, чтобы это был кроссплатформенный, вам понадобится много #ifdefs .


Сноски:

  1. Извините, у меня нет моих полномочий 2 запомнились в миллиарды. :)

  2. Испытано на OpenBSD 5.5 и NetBSD 6.0.1.

2
27.01.2020, 23:37

Теги

Похожие вопросы