Должен ли я выводить имя программы при возникновении предупреждения или ошибки?

Порт 59070 - это эфемерный порт - порт, который может использоваться для исходящих TCP-соединений любым процессом. (Как и порт 59071, так что это не совсем хорошее обходное решение...)

В Solaris диапазон эфемерных портов задается параметрами tcp_smallest_anon_port и tcp_largest_anon_port tunable. По умолчанию используется диапазон от 32 768 до 65 535. Любой порт в этом диапазоне может использоваться в любое время исходящим TCP-соединением.

Как сказано в ответе @Jeff Schaller, порты используются в порядке поступления, поэтому единственный способ "зарезервировать" порт - это постоянно иметь что-то привязанное к нему. Обратите внимание, что в этом ответе есть вероятность того, что другой процесс может захватить рассматриваемый порт за время между убийством скрипта "port saver" и "нормальным" процессом, который использует порт, фактически bind()привязываясь к нему. Это не вероятно, конечно, но это может произойти. И если ваша обработка критична, я бы подумал, что вам стоит беспокоиться об этом.

Я бы рекомендовал не использовать эфемерный порт и/или настроить ваш процесс на постоянный запуск, или использовать inetadm для настройки службы, которая будет запускать ваш процесс автоматически. Это заставит процесс inetd постоянно связываться с "вашим" портом, эффективно резервируя его для вашего использования.

13
23.05.2017, 15:39
2 ответа

Если программа вызывается как часть сценария в котором вызываются многие другие программы, и если он не выводит свое имя, пользователям будет трудно (э-э) выяснить, откуда исходит ошибка.

(Если ошибка связана с каким-то неожиданным внутренним состоянием, которое может потребовать отладки, вам нужна дополнительная информация: не только имя программы, но и исходный файл, и номер строки, и, возможно, обратная трассировка.)

8
27.01.2020, 19:52

Обычной практикой является сохранение 0-го аргумента, переданного программе на C main , и использование его в качестве параметра для perror - для простых программ:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char *foo = malloc(9999999999L);
    if (foo == 0)
        perror(argv[0]);
    return 0;
}

называют эту программу «foo», и запуск ее иллюстрирует суть:

> ./foo
./foo: Cannot allocate memory

Сложные программы могут добавлять к тексту (или использовать только имя файла без пути), но сохранение имени программы позволяет вам найти, откуда пришла некорректно работающая программа. из.

Не существует общепринятой схемы для сообщений об ошибках, но некоторые широко используемые программы (например, gcc) добавляют категорию сообщений, например «Ошибка» или «Предупреждение». Вот пример из одного из моих журналов сборки:

compiling fld_def (obj_s)
../form/fld_def.c: In function '_nc_Copy_Argument':
../form/fld_def.c:164:14: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
        res = (TypeArgument *)argp;
              ^

В этом примере gcc разделяет поля двоеточиями и добавляет категорию «предупреждение» после имени файла, номера строки, номера столбца - и перед фактическим сообщением. Но есть несколько вариантов, что усложняет анализ информации программами (такими как vi-like-emacs ).

Для компиляторов использование категории в сообщении упрощает обнаружение фатальных ошибок (которые не могут быть немедленно фатальными ) и предупреждений. Если ваша программа завершается с ошибкой, это мало что говорит о том, что некоторые из них действительно являются предупреждениями, а некоторые - ошибками. Но когда он ведет себя иначе (или продолжает работать более или менее), категория помогает диагностировать возникшую проблему.

16
27.01.2020, 19:52

Теги

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