Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Как вернуть число из signal handler?


Автор: Goryachev 27.3.2007, 16:40
Ловлю SIGABRT в хандлере.
Возможно ли вернуть число при заканчивании сигнала обработчика? (в системму)

Автор: MAKCim 27.3.2007, 18:52
нет, можно только установить глобальную переменную
Код

static sig_atomic_t variable; /* тип sig_atomic_t обязателен */
void sigabrt_handler(int signal) {
...
/* установка variable */
}

Автор: Goryachev 29.3.2007, 10:10
MAKCim
будет ли эта глобальная переменная видна в другом процессе, из которого я создаю этот процесс?

Автор: MAKCim 29.3.2007, 11:27
Цитата(Goryachev @  29.3.2007,  10:10 Найти цитируемый пост)
будет ли эта глобальная переменная видна в другом процессе, из которого я создаю этот процесс? 

в Linux используется COW (Copy On Write) стратегия при создании процесса, это значит, что до попытки изменения (записи) порожденным процессом глобальной переменной, ее значение совпадает в обоих процессах (по сути это разделяемый read-only ресурс). При попытке записи порожденным процессом в эту переменную происходит #PF (страничное исключение): для этого процесса выделяется страница памяти, туда копируется содержимое страницы памяти, в которую он пытался записать данные и происходит перезапуск инструкции записи, которая вызвала #PF (mov например). Т. е я хочу сказать, что в родительском процессе изменения не будут видны
Если у тебя идет работа именно с процессами, то используй IPC, например Message Queue
т. е создается очередь сообщений, которая по мере вызова обработчиков сигналов заполняется
в качестве ключа конкретного сообщения можно взять pid процесса
Код

struct msg {
    long type;
    <твои данные>
};

static int msg_id; /* главный процесс создает очередь сообщений */

static void handler(int signal) {
    ...
    struct msg msg;
    msg.type = getpid(); /* получаем pid процесса */
/* заполнение остальных элементов структуры */
    msgsnd(msg_id, &msg, sizeof(struct msg) - sizeof(long), 0);
}

Автор: Goryachev 29.3.2007, 13:02
MAKCim
спасибо за ответ, но эти техники я знаю. Меня интересовало, можно ли только по возвращённому с хандлера узнать, что вернулось. Потому, что по обычному выходу процесса, я получаю значение, возвращённое с процесса, 0 - 255 (байт).
Я пренципиально не хотел пользоватся IPC, потому что создаёт лишний overhead.
Но благодарю за ответ smile

Автор: MAKCim 29.3.2007, 21:01
Цитата(Goryachev @  29.3.2007,  13:02 Найти цитируемый пост)
Я пренципиально не хотел пользоватся IPC, потому что создаёт лишний overhead.

а по другому с процессами не получится  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)