免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2576 | 回复: 0
打印 上一主题 下一主题

[C++] linux下daemon脚本问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-20 12:43 |只看该作者 |倒序浏览
用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呢?

谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP