亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2786 | 回復(fù): 9
打印 上一主題 下一主題

daemon start) 返回問題請(qǐng)教 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-06-20 21:40 |只看該作者 |倒序?yàn)g覽
用C++寫了一程序,想以daemon方式運(yùn)行,在寫啟停腳本的時(shí)候碰到以下問題:
start()時(shí),不管程序啟動(dòng)是否成功,返回的都是成功

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);
                }

        //此處可模擬初始化錯(cuò)誤,立即返回-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


現(xiàn)在不管主程序 int main() 返回什么,腳本都認(rèn)為啟動(dòng)成功,估計(jì)是因?yàn)閒ork()后父進(jìn)程立即退出返回的值被腳本認(rèn)為是程序返回值,但現(xiàn)在若是在main() 中初始化有錯(cuò)誤而立即退出并返回-1,較本怎樣才能得到-1呢?

謝謝!

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2008-06-20 21:46 |只看該作者
c++不是很懂,你可以運(yùn)行你的程序,然后運(yùn)行echo $?來看看返回值到底是什么。

論壇徽章:
23
15-16賽季CBA聯(lián)賽之吉林
日期: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聯(lián)賽之山東
日期:2017-12-21 16:39:1915-16賽季CBA聯(lián)賽之廣東
日期:2016-01-19 13:33:372015亞冠之山東魯能
日期:2015-10-13 09:39:062015亞冠之西悉尼流浪者
日期:2015-09-21 08:27:57
3 [報(bào)告]
發(fā)表于 2008-06-20 22:16 |只看該作者
daemon ./$prog1

daemon 是個(gè)什么命令?

$? 是上一個(gè)命令的返回值,只要daemon ./$prog1 這個(gè)命令執(zhí)行了,那就返回0。
可以這樣試試:
RETVAL=$(daemon ./$prog1)
[ "$RETVAL" != "can't fork self" ] && touch $progpath/"$prog1.lock"

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-06-21 13:29 |只看該作者
daemon 是 redhat 的一個(gè)預(yù)置腳本,就是將待運(yùn)行的程序以daemon方式運(yùn)行。

可以不用daemon,而直接運(yùn)行 ./prog1,可其返回值 $? 始終還是0,也就是fork()后的返回值,現(xiàn)在我是希望得到子進(jìn)程的返回值,以便知道子進(jìn)程的啟動(dòng)結(jié)果。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-06-21 19:29 |只看該作者
aa=`./prog1`;echo $aa

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-06-21 21:36 |只看該作者
返回始終是0
我現(xiàn)在想知道如何得到 int main() 返回的-1

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-06-22 01:01 |只看該作者
你可以把錯(cuò)誤打印到 stderr里,fprintf(stderr,"-1");然后用變量接收這個(gè)值,aa=`./prog1`;echo $aa

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2008-06-22 11:07 |只看該作者
樓上的方法試了不行。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 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 [報(bào)告]
發(fā)表于 2008-06-24 12:29 |只看該作者
樓上忘記看我提供的程序了:

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

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP