BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


[函数] 守护进程退出状态问题!!!请帮忙分析下(有代码)
首页 » 论坛 » C/C++ »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
  [已解决] 本主题悬赏 可用积分 10  
kingsu
精灵




UID:647908
注册:2007-11-29
最后登录: 2008-10-08
帖子:229
精华:0

可用积分:268 (白手起家)
信誉积分:45
专家积分:35 (本版:30)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2008-6-20 16:26 
守护进程的创建过程如下:
void server(void)
{
        int pid;
        int i;
       
        if ((pid = fork()) > 0)
        {
                exit(1);        // parent terminates
        }
        else if (pid == -1)
        {
                exit(2);        // fork() failed
        }
       
        // first child process
        setsid();
       
        if ((pid = fork()) > 0)
        {
                exit(3);        // first child terminates
        }
        else if(pid == -1)
        {
                exit(4);        // fork() failed
        }
       
        // second child
        for (i=0; i<NOFILE; ++i)        // close all files
        {
                close(i);
        }

        chdir("/");                // change directory to root
        umask(0);                // set proper file mask
}


int main()
{
    if (function1() != 0){//其它的处理函数
        return 1;
    }

    server();

    if (function() != 0){ //其它的处理函数
        return 1;
    }
    return 0;
}

说远一点吧,如果我把这个代码编译成可执行程序,然后从shell中执行它并且取得它的返回值,我如何才能得到server函数中的返回值呢?

其实对进程和退出状态有点晕,哪位大虾给讲讲整个代码执行详细流程啊。。。

这个代码是不是有多个返回值啊,因为父进程和子进程和“孙子进程“(好区别这样叫)都有退出啊,我如何得到最后的孙子进程的退出状态值呢?



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
rainysky   帅哥
侠客



UID:188807
注册:2004-10-10
最后登录: 2008-09-09
帖子:39
精华:0

可用积分:60 (白手起家)
信誉积分:100
专家积分:10 (本版:10)
空间积分:0
推广积分:0

来自:苏州
状态:...离线...

[个人空间] [短信] [博客]


     最佳答案 
2楼 发表于 2008-6-20 16:26 
流程就是你运行你的程序:
SHELL创建子进程(你程序里面所谓的父进程),然后父进程退出,SHELL得到返回值1或者2
第一个子进程继续运行,这里由于父进程退出,第一个子进程的父进程变为INIT进程,然后第一个子进程又FORK
FORK后第一个子进程退出,由于INIT会IGN子进程的退出状态,所以返回值3或者4丢弃了。
然后你的第二个子进程继续运行,父进程又变成INIT,最后退出,INIT忽略返回值。


如果DAEMON进程有问题,一般是记SYSLOG的吧。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

专业潜水
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
Godbach (To be 千里马!)
精灵使


CU奥运火炬传递手2008
UID:534931
注册:2007-3-9
最后登录: 2008-10-10
帖子:4287
精华:4

可用积分:10989 (大富大贵)
信誉积分:105
专家积分:69 (本版:1)
空间积分:2
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


3楼 发表于 2008-6-20 16:46 
LZ,生成守护进程有系统调用,daemon().



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
版主 flw   帅哥
广告杀手-老法王
侠客



UID:14893
注册:2002-8-12
最后登录: 2008-10-12
帖子:20319
精华:13

可用积分:15852 (大富大贵)
信誉积分:925
专家积分:1239 (本版:125)
空间积分:0
推广积分:11

状态:...离线...

[个人空间] [短信] [博客]


4楼 发表于 2008-6-20 17:08 


QUOTE:
原帖由 Godbach 于 2008-6-20 16:46 发表
LZ,生成守护进程有系统调用,daemon().

daemon 会禁止 core dump,用起来略微有些不便。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

data Maybe a = Nothing
             | Just a

---
如何知道一个变量是什么类型?
如何知道分配的内存有多大?
如何知道 select 的 fd_set 里哪个句柄是无效的?
如何知道指针是不是有效的?
如何通过文件句柄得到文件名?
……
如何知道我昨晚把袜子脱哪儿了?
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
Godbach (To be 千里马!)
精灵使


CU奥运火炬传递手2008
UID:534931
注册:2007-3-9
最后登录: 2008-10-10
帖子:4287
精华:4

可用积分:10989 (大富大贵)
信誉积分:105
专家积分:69 (本版:1)
空间积分:2
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2008-6-20 17:37 


QUOTE:
原帖由 flw 于 2008-6-20 17:08 发表

daemon 会禁止 core dump,用起来略微有些不便。

那就是如果想了解程序出问题时的情况是,最好还是自己写一个daemon程序吗?



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
kingsu
精灵




UID:647908
注册:2007-11-29
最后登录: 2008-10-08
帖子:229
精华:0

可用积分:268 (白手起家)
信誉积分:45
专家积分:35 (本版:30)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


6楼 发表于 2008-6-20 17:44 
同志们,同志们,请不要跑题啊~~



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
feiyang21687
精灵




UID:402069
注册:2006-4-11
最后登录: 2008-07-03
帖子:154
精华:2

可用积分:160 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


7楼 发表于 2008-6-20 18:25 


QUOTE:
原帖由 kingsu 于 2008-6-20 16:26 发表
守护进程的创建过程如下:
void server(void)
{
        int pid;
        int i;
       
        if ((pid = fork()) > 0)
        {
                exit(1);        // parent terminates
        }
        else if (pid == -1)
        {
                exit(2);        // fork() failed
        } ...

没办法获得。父进程被杀死,子进程的父进程变为Init。所以你从Shell中只能得到父进程的退出状态,也就是1



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
kingsu
精灵




UID:647908
注册:2007-11-29
最后登录: 2008-10-08
帖子:229
精华:0

可用积分:268 (白手起家)
信誉积分:45
专家积分:35 (本版:30)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


8楼 发表于 2008-6-23 10:45 
回复 #6 feiyang21687 的帖子

假如在一个多进程的程序里面,父进程没有被kill掉,各个进程按某个顺序退出,那么shell中能得到这几个进程的退出状态值么?

[ 本帖最后由 kingsu 于 2008-6-23 11:03 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
cookis
光明使者




UID:389167
注册:2006-3-20
最后登录: 2008-10-11
帖子:922
精华:3

可用积分:1606 (家境小康)
信誉积分:100
专家积分:20 (本版:20)
空间积分:0
推广积分:4

来自:BeiJing
状态:...离线...

[个人空间] [短信] [博客]


9楼 发表于 2008-6-23 11:11 
好像没有孙子进程这一说吧..



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

|  (\_/)  This is Bunny. Copy and paste Bunny
| (='.'=) into your signature to help him gain
| (")_(") world domination.
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
kingsu
精灵




UID:647908
注册:2007-11-29
最后登录: 2008-10-08
帖子:229
精华:0

可用积分:268 (白手起家)
信誉积分:45
专家积分:35 (本版:30)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2008-6-23 13:44 
回复 #8 cookis 的帖子

請注意看,我說了爲了好區別的...就是指的第二次創建的子進程啊



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?

首页 » 论坛 » C/C++ »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.100701 second(s), 4 queries , Gzip enabled