免费注册 查看新帖 |

Chinaunix

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

daemon start) 返回问题请教 [复制链接]

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

谢谢!

论坛徽章:
0
2 [报告]
发表于 2008-06-20 21:46 |只看该作者
c++不是很懂,你可以运行你的程序,然后运行echo $?来看看返回值到底是什么。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
3 [报告]
发表于 2008-06-20 22:16 |只看该作者
daemon ./$prog1

daemon 是个什么命令?

$? 是上一个命令的返回值,只要daemon ./$prog1 这个命令执行了,那就返回0。
可以这样试试:
RETVAL=$(daemon ./$prog1)
[ "$RETVAL" != "can't fork self" ] && touch $progpath/"$prog1.lock"

论坛徽章:
0
4 [报告]
发表于 2008-06-21 13:29 |只看该作者
daemon 是 redhat 的一个预置脚本,就是将待运行的程序以daemon方式运行。

可以不用daemon,而直接运行 ./prog1,可其返回值 $? 始终还是0,也就是fork()后的返回值,现在我是希望得到子进程的返回值,以便知道子进程的启动结果。

论坛徽章:
0
5 [报告]
发表于 2008-06-21 19:29 |只看该作者
aa=`./prog1`;echo $aa

论坛徽章:
0
6 [报告]
发表于 2008-06-21 21:36 |只看该作者
返回始终是0
我现在想知道如何得到 int main() 返回的-1

论坛徽章:
0
7 [报告]
发表于 2008-06-22 01:01 |只看该作者
你可以把错误打印到 stderr里,fprintf(stderr,"-1");然后用变量接收这个值,aa=`./prog1`;echo $aa

论坛徽章:
0
8 [报告]
发表于 2008-06-22 11:07 |只看该作者
楼上的方法试了不行。

论坛徽章:
0
9 [报告]
发表于 2008-06-22 13:56 |只看该作者
[err7dd@localhost sh]$ cat tt.c
#include "stdio.h"
int main()
{
  fprintf(stderr,"-1");
  return -1;
}
[err7dd@localhost sh]$ cc tt.c -o tt
[err7dd@localhost sh]$ aa=`./tt`;echo $a
-1
[err7dd@localhost sh]$

论坛徽章:
0
10 [报告]
发表于 2008-06-24 12:29 |只看该作者
楼上忘记看我提供的程序了:

        if(daemon_init() == -1)        {
                printf("can't fork self\n");
                exit(-1);
                }
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP