執行一個守護程序
#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
;
}
}
}