Ada_Ru форум

Обсуждение языка Ада

Обработка сигналов в демонизированной ада-программе

Оставить новое сообщение

Сообщения

Valeriy Gavrikov
Обработка сигналов в демонизированной ада-программе
2011-11-07 08:28:50

Пытаюсь сделать под линуксом демон:

with SIG;

 

with Gnat.OS_Lib;

with Interfaces.C;

 

use Gnat.OS_Lib;

use Interfaces.C;

 

procedure LADaemon is

 

pid, sid : int;

SIGTERM_Access : SIG.P_SIG_Access;

 

function Fork return int;

pragma Import (C, Fork, "fork");

 

procedure Umask (Mask : int);

pragma Import (C, Umask, "umask");

 

function Set_Sid return int;

pragma Import (C, Set_Sid, "setsid");

 

function Chdir (New_Directory : char_array) return int;

pragma Import (C, Chdir, "chdir");

 

begin

 

pid := Fork;

if pid < 0 then

OS_Exit (-1);

elsif pid > 0 then

OS_Exit (0);

end if;

 

Umask (0);

if Chdir (To_C ("/")) < 0 then

OS_Exit (-1);

end if;

 

sid := Set_Sid;

if sid < 0 then

OS_Exit (-1);

end if;

 

Close (Standin);

Close (Standout);

Close (Standerr);

 

далее пустой цикл с delay 1.0 внутри.

 

Пока все замечательно (правда уже здесь появляется странность, а именно: демон никак не реагирует на kill <ladaemon_pid>, то есть на сигнал sigterm)

В пакете SIG описан обработчик для прерываний:

with Ada.Interrupts;

with Ada.Interrupts.Names;

 

package SIG is

 

SIGTERM : Ada.Interrupts.Interrupt_ID := Ada.Interrupts.Names.SIGTERM;

protected type P_SIG (Int_ID : Ada.Interrupts.Interrupt_ID) is procedure Handler;

pragma Attach_Handler (Handler, Int_ID);

end P_SIG;

 

type P_SIG_Access is access P_SIG;

 

end SIG;

 

Теперь пытаюсь инициализировать экземпляр для обработчика (вставляю перед циклом):

SIGTERM_Access := new SIG.P_SIG (SIG.SIGTERM);

 

На этом месте демон "зависает". Вот последние строки из вывода strace -f ladaemon :

[pid 413] <... sched_yield resumed> ) = 0

Process 414 attached

[pid 412] <... clone resumed> child_stack=0,

flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,

child_tidptr=0x7f85042f09d0) = 414

[pid 413] futex(0x1b85e4c, FUTEX_WAIT_PRIVATE, 3, NULL <unfinished ...> [pid 412] exit_group(0) = ?

[pid 413] <... ???? resumed> ) = ? <unavailable>

[pid 414] umask(0) = 022

[pid 414] chdir("/") = 0

setsid(Process 412 attached (waiting for parent)

) = 414

[pid 414] close(0) = 0

[pid 414] close(1) = 0

[pid 414] close(2) = 0

[pid 414] sched_yield() = 0

[pid 414] futex(0x1b8515c, FUTEX_WAIT_PRIVATE, 5, NULL

 

Гугл ничего не дал, разве что вот такую заметку (ктото уже натыкался на это):

 

If I daemonize the process (i.e., fork a new process and detach it from console), the signal handlers become lost for some reason.

I was discussing that with AdaCore and it turned out that setting handlers for daemonized processes is more complex and I didn't have time to figure the correct apporach yet.

 

 

Собственно... что делать (и как дальше жить :) ) ??

--

Best Regards,

Gavrikov Valeriy

 

mailto:subjrs@...

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти