您當前的位置:首頁 > 遊戲

執行一個守護程序

作者:由 Jianlong Liu 發表于 遊戲時間:2015-11-07

#include

#include

#include

#include

extern

void

init_daemonize

const

char

*

command

);

//初始化守護程序

extern

int

already_running

void

);

//保證守護程序只能執行一次

extern

void

reload

void

);

//過載守護程序配置檔案

void

*

signal_handler

void

*

arg

);

//執行緒處理程式

sigset_t

mask

int

main

int

argc

char

*

argv

[])

{

char

*

command

struct

sigaction

sa

pthread_t

signal_thread

if

((

command

=

strrchr

argv

0

],

‘/’

))

==

NULL

command

=

argv

0

];

else

command

++

init_daemonize

command

);

if

already_running

())

{

syslog

LOG_ERR

“daemon alreay running ”

);

exit

EXIT_FAILURE

);

}

//init_daemonize 修改sighup訊號了! 還原回去;

sa

sa_handler

=

SIG_DFL

sigemptyset

&

sa

sa_mask

);

sa

sa_flags

=

0

if

sigaction

SIGHUP

&

sa

NULL

<

0

{

syslog

LOG_ERR

“restore SIGHUP to default”

);

exit

EXIT_FAILURE

);

}

if

pthread_create

&

signal_thread

NULL

signal_handler

NULL

!=

0

{

syslog

LOG_ERR

“thread create %m”

);

exit

EXIT_FAILURE

);

}

sigfillset

&

mask

);

if

((

err

=

pthread_sigmask

SIG_BLOCK

&

mask

NULL

))

<

0

{

syslog

LOG_ERR

“block failure %s”

strerror

err

));

//一會接著寫 16:05 nov。 7 2015

}

return

0

}

void

*

signal_handler

void

*

arg

{

int

signo

while

true

{

if

sigwait

&

mask

&

signo

=

0

{

syslog

LOG_ERR

“signal wait %m”

);

exit

EXIT_FAILURE

);

}

switch

signo

{

case

SIGHUP

syslog

LOG_INFO

“re-reading configration file %m”

);

reread

();

return

0

case

SIGTERM

syslog

LOG_INFO

“88”

);

return

0

default

syslog

LOG_INFO

“unexpected signal %d”

signo

);

return

void

*

-

1

}

}

}

標簽: syslog  log  void  SA  signal