- 论坛徽章:
- 0
|
用C++写了一程序,想以daemon方式运行,在写启停脚本的时候碰到以下问题:
start()时,不管程序启动是否成功,返回的都是成功
daemontest.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <syslog.h>
#include <signal.h>
int daemon_init(void)
{
pid_t pid;
if((pid = fork()) < 0)
return(-1);
else if(pid != 0)
exit(0); /* parent exit */
/* child continues */
setsid(); /* become session leader */
chdir("/"); /* change working directory */
umask(0); /* clear file mode creation mask */
close(0); /* close stdin */
close(1); /* close stdout */
close(2); /* close stderr */
return(0);
}
void sig_term(int signo)
{
/* catched signal sent by kill(1) command */
if(signo == SIGTERM) {
syslog(LOG_INFO, "program terminated.");
closelog();
exit(0);
}
}
int main(void)
{
if(daemon_init() == -1) {
printf("can't fork self\n");
exit(-1);
}
//此处可模拟初始化错误,立即返回-1
// exit(-1);
openlog("daemontest", LOG_PID, LOG_USER);
syslog(LOG_INFO, "program started.");
signal(SIGTERM, sig_term); /* arrange to catch the signal */
while(1) {
sleep(1); /* put your main program here */
}
return(0);
}
testd 脚本:
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
# Check that networking is up
[ ${NETWORKING} = "no" ] && exit 0
ulimit -c unlimited
RETVAL=0
prog1="daemontest"
username="sch"
progpath="/home/sch/run/daemon_run"
start() {
# Start daemons.
echo -n $"Starting $prog1: "
cd $progpath
daemon ./$prog1
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $progpath/"$prog1.lock"
# && success $"$base startup" || failure $"$base startup"
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down $prog1: "
killproc $prog1 -SIGTERM
RETVAL=$?
sleep 1
result=`ps -e | grep $prog1`
if [ "$result" != "" ]; then
killall -9 $prog1
fi
echo
[ $RETVAL -eq 0 ] && rm -f $progpath/"$prog1.lock"
return $RETVAL
}
# See how we were called.
case "$1" in
start)
if [ -f $progpath/"$prog1.lock" ]; then
echo $"$prog1 is running."
exit 1
fi
start
;;
stop)
stop
;;
restart|reload)
stop
start
RETVAL=$?
;;
status)
status $prog1
RETVAL=$?
;;
*)
echo $"Usage: $0 (start|stop|restart|status)"
exit 1
esac
exit $RETVAL
现在不管主程序 int main() 返回什么,脚本都认为启动成功,估计是因为fork()后父进程立即退出返回的值被脚本认为是程序返回值,但现在若是在main() 中初始化有错误而立即退出并返回-1,较本怎样才能得到-1呢?
谢谢! |
|