] для удаления последних []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
] Я сделал некоторую глупую ошибку по математике в коде 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
.
Сноски:
Извините, у меня нет моих полномочий 2 запомнились в миллиарды. :)
Испытано на OpenBSD 5.5 и NetBSD 6.0.1.