Задать вопрос
  • Как экранировать символы в .bash-aliases?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Решил, как порядочный линуксоид вынести алисы в отдельный файл.

    $'/var/www/www-root/data/www\r'

    \r в конце намекает на то, что в этом отдельном файле концы строк виндовые а не юниксовые. dos2unix .bash-aliases должен это пофиксить.
    Ответ написан
    2 комментария
  • Почему не отрабатывает exit на третьем уровне скрипта?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Написали многоуровневое меню при помощи функций, работает без проблем все, кроме выхода.
    Примерно на 2-3 уровне меню "Exit" не выходит из скрипта, а возвращается на уровень выше.

    всё зависит от того, как эти функции вызываются. Если так:

    clear; ./1_1_ipmi_menu.sh ; unem ;;

    то разумеется вызов exit внутри скрипта 1_1_ipmi_menu.sh приведёт в возврату в unem, вы же тут отдельный процесс создаёте.
    Чтобы exit в функциях приводил к выходу из приложения нужно импортировать (source) функции из этих скриптов и вызывать функции вместо запуска скриптов.
    Типа того:
    #!/bin/bash
    unem() {
            read b
            case $b in
              1) clear ; … ; unem ;;
              2) clear; PMI ; unem ;;
              3) clear ; menu ;;
              0) exit 0 ;;
            esac
    }
    source 1_1_ipmi_menu.sh
    source 1_1_system_menu.sh
    unem
    Ответ написан
    Комментировать
  • Почему ptrace если не через execl не работает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Потому что PTRACE_TRACEME не останавливает вызывающий процесс, а значит у родителя нет возможности заказать остановку по системному вызову. Останавливают трассируемый процесс только сигналы и явно запрошенные трассировщиком события.
    В частности, вызов execve трассируемым процессом вызывает отправку ему сигнала SIGTRAP.
    Можно вставить перед 20й строкой какой-нибудь asm volatile ("int3"); и это тоже вызовет доставку сигнала, останов и трассировку последующих вызовов write.
    Ответ написан
  • Ubuntu выводит -bash: nohub: command not found, что делать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    -bash: nohub: command not found,

    команда называется nohup, сокращение от no hangup.
    Ответ написан
    3 комментария
  • Почему не получается скомпилировать файл через wsl на c?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    make mario.c

    говорит, что нужно собрать mario.c, но собирать ведь надо не его, mario.c -- это исходник. Пиши make mario чтобы собрать mario из mario.c. И да, это работает без Makefile за счёт втроенных в make правил только для таких простых случаев. Для более сложных надо будет писать Makefile.
    Ответ написан
    2 комментария
  • Как сделать вызов функции из терминала чтобы обработчик динамически искал и вызывал функцию?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    обработчик динамически ищет и выполняет функцию

    У этой задачи есть два больших класса решений -- системно-независимые и системно-зависимые, в зависимости от дополнительных условий. Для начала надо ответить на вопрос "где ищет". Если ответ на этот вопрос -- "в твоём приложении", а набор функций фиксированный, то можно построить отображение "имя функции" -> "адрес функции" с использованием какого-нибудь массива или хеш-таблицы и искать с его помощью.
    Если набор функций не фиксирован во время сборки приложения, или искать надо за пределами приложения, нужно ответить ещё на один вопрос: "знают ли функции о том, что их будут выполнять или нет". Если знают -- опять же построить отображение "имя функции" -> "адрес функции" и каким-нибудь образом сделать его доступным приложению. Если речь идёт о вызове произвольных заранее неизвестных функций, остаётся вариант с динамической загрузкой и поиском имён -- dlopen/dlsym или LoadLibrary/GetProcAddress для венды.
    Ответ написан
    Комментировать
  • Выдаёт ошибку - This program cannot be run in DOS mode.при этапе компоновки и линковки?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    при этапе компоновки и линковки ml.exe /c /coff program.asm
    link.exe /subsystem:windows program.obj выдаёт ошибку - This program cannot be run in DOS mode.

    Не нужно запускать виндовые исполняемые файлы в досе. Ассемблируй и линкуй под виндой, либо используй досовские программы коль скоро уж ты собираешь приложение для win32.

    call GetWindowReact

    call GetWindowsDC

    у тебя тут опечатки в названиях функций, правильные названия -- GetWindowRect и GetWindowDC.

    сделать так чтобы изображение окружности было вписано в квадрат

    Нарисуй квадрат, нарисуй эллипс по координатам углов квадрата, а не по координатам десктопа, как у тебя сейчас написано.
    Ответ написан
  • Как вернуть изменения только одного файла из коммита, который уже был отправлен в удаленный репозиторий?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    изменения в файле "C" нужно вернуть к изначальному состоянию
    Как это сделать?

    git checkout HEAD~1 "C"
    git commit или git commit --amend, в зависимости от того, нужно ли закоммитить отмену изменений С отдельно или убрать изменения С из предыдущего коммита.
    Ответ написан
    1 комментарий
  • Может ли прерывание прервать выполнение конструктора / деструктора в С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может ли прерывание прервать выполнение конструктора / деструктора в С++?

    Да, конечно может, как и любой другой код, явно не защищённый от прерываний.

    нужно ли в конструкторах / деструкторах защищать код критическими секциями?

    Нужно защищать любое состояние, к которому может обращаться код из разных контекстов выполнения -- например из разных потоков или из потока и обработчика прерывания. В ядре linux (где разных типов контекста много и разных способов синхронизации тоже много) есть руководство, что и когда использовать.
    Ответ написан
    Комментировать
  • Как объединить последний коммит и одним из предыдущих не трогая остальные?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Попробовал git rebase -i HEAD~5
    но если в открывшемся списке напротив "коммит 4" ставлю флаг "s"
    то у меня объединяются почему-то "фикс 4-го коммита" и "коммит 1"

    нужно перенести строчку "фикс 4-го коммита" после строчки "коммит 4". squash объединяет коммит на котором он стоит с предыдущим в этом списке.
    Ответ написан
    Комментировать
  • Очень странная ошибка MPI?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    в чем ее суть

    в том, что процесс с rank == 0 посылает сообщение самому себе, и это становится для него неожиданностью.

    как с ней бороться

    как вариаент -- не посылать сообщение самому себе из процесса с rank == 0. Например так:
    if(rank == 0){
            for(size_t i = 1; i < size; i++){

    надо будет, конечно, пересмотреть все места где работа разделяется на size частей, и скорректировать для size - 1.
    Ответ написан
    Комментировать
  • Как собрать библиотеку из кода для 16-bit ОС для работы в 32-bit \ 64-bit ОС?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как пере собрать её под 32 \ 64 разрядную ОС?

    Судя по тому, что делают приведённые куски кода -- никак. Только переписать в виде ядерного драйвера + интерфейсной библиотеки.
    Ответ написан
    Комментировать
  • Почему компилятор не генерирует конструктор по умолчанию в отдельной единице трансляции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему компилятор не генерирует конструктор

    потому что нигде не написано, что он должен? Я вижу, что в коде генерируемом gcc инициализация таблицы виртуальных функций инлайнится по месту создания объекта, вне зависимости от опций оптимизации.
    Ответ написан
    1 комментарий
  • Почему можно не указывать virtual в файле реализации?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему можно не указывать virtual в файле реализации?

    Не то чтобы "можно не указывать". Нужно не указывать. Потому что так говорит стандарт.
    И потому что виртуальность функции -- это не свойство функции, а свойство класса которому она принадлежит. Код функции не зависит от того, виртуальная она или нет.
    Ответ написан
    4 комментария
  • Почему виснит программа на MPI?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему виснет программа на MPI?

    Потому что процесс с rank = 0 хочет послать VEC_SIZE сообщений, а процессы с rank > 0 обрабатывают каждый только по одному сообщению, после чего завершаются. Тебе нужно как-то объяснить исполнителям, сколько запросов они должны обработать перед завершением. Например так:

    if(rank == 0){
                    for(int i = 0; i < VEC_SIZE; i++){
                            …
                    }
                    for (int i = 1; i < size; ++i) {
                            int q = -1;
                            MPI_Send(&q, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
                    }
            }else{
                    for (;;) {
                            int index;
                            MPI_Status status;
                            MPI_Recv(&index, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
                            if (index < 0)
                                    break;
                            …
                    }
            };


    Отдельно стоит сказать о том, что цикл который посылает задачу процессу и тут же ждёт результата от этого же самого процесса не имеет смысла с точки зрения улучшения производительности. Имеет смысл сначала разослать задания свободным исполнителям, а только после этого начинать ждать от них ответов.

    И ещё по мелочи:
    for(size_t i = 0; i < VEC_SIZE; i++){
                size_t num_process = (i % (size - 1)) + 1;
                MPI_Send(&i, 1, MPI_INT, static_cast<int>(num_process), 0, MPI_COMM_WORLD);

    размер size_t i может отличаться от размера int, подразумеваемого типом MPI_INT. Этот код точно будет работать неправильно на big-endian архитектурах с LP64 ABI.
    Ответ написан
    Комментировать
  • Как увеличить FPS в системе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как увеличить FPS в системе?

    Ты уже задавал этот вопрос в комментариях к предыдущему вопросу, там есть ответ:

    Основной способ стандартный -- не перерисовывать всё, если можно этого избежать.

    Нет нужды перерисовывать весь интерфейс в бэк-буфере, если ничего не изменилось кроме положения мыши. Указатель мыши вообще можно рисовать прямо во фрейм-буфере, когда он перемещается копировать маленький квадратик из бэк-буфера и рисовать стрелку в новом месте.
    Ответ написан
  • Почему не работает двойная буферизация?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    VIDEO_BUFFER_SEGMENT = 0xA000
    VIDEO_BUFFER_OFFSET = 0xFA00
    VIDEO_SEGMENT = 0xA000
    VIDEO_OFFSET = 0x0000

    как ты думаешь, сколько памяти в сегменте VIDEO_BUFFER_SEGMENT доступно начиная со смещения VIDEO_BUFFER_OFFSET и что там идёт дальше?

    Если в твоём коде сделать вот такие изменения, то всё работает:
    diff --git a/lib/video.inc b/lib/video.inc
    index 3a26f43e2f79..d7054e194da9 100644
    --- a/lib/video.inc
    +++ b/lib/video.inc
    @@ -3,8 +3,8 @@ VIDEO_INC equ 0
     
     include "memory.inc"
     
    -VIDEO_BUFFER_SEGMENT = 0xA000
    -VIDEO_BUFFER_OFFSET = 0xFA00
    +VIDEO_BUFFER_SEGMENT = 0x6000
    +VIDEO_BUFFER_OFFSET = 0x0000
     VIDEO_SEGMENT = 0xA000
     VIDEO_OFFSET = 0x0000
     VIDEO_SIZE_DB = 0xFA00
    @@ -79,11 +79,11 @@ macro video!flip {
            mov ax, VIDEO_SEGMENT
            mov bx, VIDEO_BUFFER_SEGMENT
            mov es, ax
    -       mov ds, ax
    +       mov ds, bx
            mov cx, VIDEO_SIZE_DB
            cld
            mov si, VIDEO_BUFFER_OFFSET
    -       xor di, VIDEO_OFFSET
    +       mov di, VIDEO_OFFSET
            rep movsb
            pop ds es
     }
    diff --git a/os.asm b/os.asm
    index 1949e95b4e99..e5ebb3d280aa 100644
    --- a/os.asm
    +++ b/os.asm
    @@ -91,9 +91,9 @@ kernel.routine.startup:
     kernel.routine.video:
            cli
            video!fill 0x4E
    -       ;video!window 30, 40, 100, 60, 0x1A, 0xFF, 13 , 0x1F
    -       ;video!cursor
    -       ;video!flip
    +       video!window 30, 40, 100, 60, 0x1A, 0xFF, 13 , 0x1F
    +       video!cursor
    +       video!flip
            sti
            ret
    Ответ написан
  • Как исправить движение мыши?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    mov al, [bp+12]
      mov bl, al
      mov cl, 3
      shl al, cl
    
      sbb dh, dh
      cbw
      mov dl, [bp+8]
      mov al, [bp+10]

    Этот кусок кода из обработчика перемещений мыши должен делать знаковое расширение 9-битных координат, но я вижу, что в существующем коде в обработчик перемещений всегда приходят нули в координатах x и y, а из-за этого знакового расширения отрицательные dx и dy всегда становятся равными -256. Если добавить вызов функции initialize (0xc205) прерывания 0x15 в mouse.init с 3-байтными пакетами:
    kernel.routine.mouse.init:
      push es bx
      int 0x11
      test ax, 4
      jz kernel.routine.mouse.init.error
      mov ax, 0xC205
      mov bh, 3
      int 0x15
      jc kernel.routine.mouse.init.error
      mov ax, 0xC203
      mov bh, MOUSE_RESOLUTION
      int 0x15
      jc kernel.routine.mouse.init.error

    то у меня всё начинает работать как ожидалось.
    Кстати в ответе на SO по твоей ссылке вызов этой функции есть, непонятно зачем ты его выкинул.
    Ответ написан
    2 комментария
  • Не работает деструктор. В чем ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Не работает деструктор

    "Не работает деструктор" -- это когда программу компилируешь, запускаешь, а деструктор не делает того, что в нём написано. У тебя же программа не компилируется. Из-за того, что в настройках компилятора стоит "трактовать предупреждения как ошибки" и "предупреждать о неэффективном коде С++". Ну и вдобавок, предупреждение тебе правильно говорит, что если ты не реализовал конструктор копирования и оператор присваивания для класса самостоятельно управляющего памятью, то жди проблем, когда начнёшь копировать объекты этого класса.
    Ответ написан
    6 комментариев
  • Как сделать сжатие и распаковку char* в C++ с помощью zlib?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что я делаю не так?

    Несколько вещей. В compress_char ты сначала выделяешь strlen(source) байт для вывода, а потом находишь compSize, который может быть и больше чем strlen(source). Ты не возвращаешь compSize после вызова compress, а он может измениться. Ты возвращаешь только char*, как будто это строка, но это не строка, там могут быть нулевые байты.
    В uncompress_char почти те же самые ошибки. Плюс какая-то путаница между length, compSize и ucompSize. На вход uncompress в параметре compSize должен попасть настоящий размер сжатых данных, а не догадка о нём на основе вызова compressBound.
    Я бы поменял код как-то так:
    char* compress_char(const char* source, size_t *outCompSize, size_t *outUcompSize)
    {
        uLong ucompSize = strlen(source) + 1;
        uLong compSize = compressBound(ucompSize);
        char* bytes = malloc(compSize);
        compress((Bytef *)bytes, &compSize, (Bytef *)source, ucompSize);
        *outCompSize = compSize;
        *outUcompSize = ucompSize;
        return bytes;
    }
    
    char* uncompress_char(const unsigned char source[], size_t inCompSize, size_t inUcompSize)
    {
        uLong ucompSize = inUcompSize;
        uLong compSize = inCompSize;
        char* message = malloc(ucompSize);
        uncompress((Bytef *)message, &ucompSize, (Bytef *)source, compSize);
        return message;
    }
    
    void foo(void)
    {
        size_t a, b;
        char *p = compress_char("{\"a2\":\"b\"}", &a, &b);
        char *p1 = uncompress_char(p, a, b);
        printf("%s, %zd -> %zd\n", p1, b, a);
    }


    Плюс ты не обрабатываешь коды возврата из compress/uncompress.
    Ответ написан
    Комментировать