Как превратить статус выхода программы в имя сигнала

Команда pkexecиспользуется в графическом интерфейсе для открытия файла, в который обычно может записывать только root. Например, если вы хотите использовать geditдля открытия файла, вы должны использовать для него pkexec.

Однако ваша вставка ошибки, которую вы пытались открыть с помощью pkexec, показывает, что вы, скорее всего, не находитесь в графическом интерфейсе, поскольку переменная $DISPLAYпуста (согласно этому сообщению):

Gtk-WARNING **: 20:18:25.529: cannot open display: 

Возможно, вы находитесь в графическом интерфейсе, но каким-то образом потеряли настройку $DISPLAY. Например, если вы подключены по ssh к другому компьютеру, вам нужно использовать параметры пересылки X11 ssh(-Xили, возможно, -Y), чтобы перенаправить отображение графического интерфейса, чтобы клиенты на этом компьютере могли отображать на вашем.

Если вы не возражаете против использования текстового редактора терминала, такого как nano, просто используйте sudoнапрямую:

$ sudo nano /usr/share/applications/xampp-control-panel.desktop

Или,еще лучше, используйтеsudoedit(или эквивалентsudo -e)с путем к файлу, который вы хотите отредактировать, если вы правильно настроили свой редактор, и в этом случае sudoсоздаст копию файла, которую вы можете редактировать, затем откройте свой редактор как непривилегированный пользователь и, наконец, скопируйте измененное содержимое обратно в исходное место, перезаписав файл, который вы хотели изменить.

0
13.10.2021, 17:11
2 ответа

Аналогично strerror(n), есть strsignal(n), который дает подробное имя, например, SIGINT -> «Прерывание». Но это не то, чего ты действительно хотел.

Этот ответ на Stackoverflow предлагает sigabbrev_np(), который должен быть доступен в glibc 2.32 :​https://stackoverflow.com/a/68481682/6372809

Аббревиатуры сигналов, а также аббревиатуры номеров ошибок известны препроцессору, поэтому вы можете вручную создать список, как в этом ответе на Code Review:https://codereview.stackexchange.com/a/252825/111089

Немного поработал над кодом, чтобы уменьшить количество повторений с #оператор препроцессора, эта программа знала бы имена некоторых сигналов по номеру:

#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define init_signame(x) [x] = #x

static const char *signames[] = {
    init_signame(SIGINT),
    init_signame(SIGSTOP),
    init_signame(SIGTERM),
    init_signame(SIGKILL),
    init_signame(SIGHUP),
    [0] = ""
};

const char *getsig(int sig) {
    if (sig <= 0 || sig >= sizeof(signames) / sizeof(*signames) || !signames[sig])
        return "UNKN";

    return signames[sig];
}

int main(int argc, char *argv[])
{
    int i = 0;
    if (argc > 1) {
        i = atoi(argv[1]);
    }
    printf("%d = %s = %s\n", i, getsig(i), strsignal(i));
}

Это дает, например,.:

$./signame2 1
1 = SIGHUP = Hangup

Проблема здесь в том, чтобы вычислить все имена для заполнения таблицы...

Для этого одним из вариантов может быть создание дампа компилятором известных ему определений, например.:

$ gcc -dM -E - <<< '#include <signal.h>' |grep -E '#define SIG[A-Z]+ ' 
#define SIGBUS 7
#define SIGTTIN 21
#define SIGTTOU 22
...

А затем с помощью скрипта соберите из этого что-нибудь полезное. Просто обратите внимание, что могут быть такие записи, как эти:

#define SIGCLD SIGCHLD
#define SIGRTMAX (__libc_current_sigrtmax ())

И я не уверен, имеют ли сигналы реального времени -индивидуальные определения где-либо, или они просто SIGRTMIN+0, SIGRTMIN+1и т. д. до SIGRTMAX.

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

0
13.10.2021, 18:11

Если у вас есть glibc 2.32 или новее, вы можете использоватьsigabbrev_np:

The sigabbrev_np() function returns the abbreviated name of the signal, sig. For example, given the value SIGINT, it returns the string "INT".

Таким образом, вам просто нужно добавить SIG, чтобы получить SIGINT.

0
13.10.2021, 18:08

Теги

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