Модели обработки исключений GCC

Используйте метод sockaddr() для IO :: Socket:

use strict;
use warnings;

use IO::Socket::INET;

my $socket = IO::Socket::INET->new(
    PeerAddr => 'localhost:3306'
) or die "$!\n";

print inet_ntoa($socket->sockaddr()), "\n";

Пример вывода:

$ perl dummy.pl
127.0.0.1

РЕДАКТИРОВАТЬ: обратите внимание, что вы должны используйте sockaddr на принятом сокете для клиента, а не на сокете прослушивания. В прослушивающем сокете вы увидите только те адреса, к которым он привязан, это может быть IN_ADDR_ANY (AKA 0.0.0.0).

15
задан bhadra 25 November 2008 в 18:22
поделиться

2 ответа

Ну, dwarf2 создает таблицы для каждой функции, которые содержат то, что сохраненные регистры вызываемого и где в стеке они сохраняются, и где указатель/обратный адрес кадра в стеке вызовов, и некоторый другой материал. При использовании dwarf2 компилятор может использовать их информация и эффективно восстановить регистры и перейти назад вызывающим сторонам в случае исключения. Бэкенды должны предоставить информацию в прологе своих реализаций, генерирующем код, для сообщения GCC, какие регистры сохраняются вызываемыми, и когда указатель кадра был сохранен и такой материал.

Используя setjmp/longjmp просто взлом. Так как setjmp/longjmp не знает о структуре функционального броска, это восстановит все регистры, сохраненные в буфере перехода setjmp, даже если они не были переопределены функцией броска. Я не действительно эксперт для этого, но я думаю, что очевидно, что это не будет эффективно. Кроме того, каждый раз Вы запускаете блок попытки, setjmp нужно назвать для установки буфера, содержащего сохраненные регистры, в то время как при использовании dwarf2, компилятор уже предоставляет всю необходимую информацию во время компиляции.

Если бэкенды не предоставят необходимую информацию, то GCC будет автоматически, нейтрализация к setjmp/longjmp основывала обработку исключений.

Обратите внимание, что я не эксперт GCC. Я просто портировал набор инструментальных средств к некоторому легкому процессору моего преподавателя, включая GCC. Я надеюсь, что мог помочь Вам немного.

16
ответ дан 1 December 2019 в 02:47
поделиться

Избегайте sjlj. Каждый блок "попытки" назовет setjmp, который сохраняет регистры, хит производительности, даже когда никакие исключения не повышены. Используя таблицы, нормальный поток управления не несет расходов выполнения. Только то, когда исключение повышено, делает механизм обработки исключений, должны унизиться через таблицы для выяснения, что сделать.

10
ответ дан 1 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

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