Linux 父进程退出后如何进入子进程调试

paodan 2011-01-18 10:58:50
在调试守护进程过程中,遇到exit(0)后,程序 就退出了,如何让调试继续进行?例子:

#include<stdio.h>
#include<sys/types.h>
#include<sys/param.h>
#include<unistd.h>
#include<signal.h>
#include<sys/stat.h>
#include<time.h>
#include<syslog.h>
#include <dlfcn.h>
#include <errno.h>

int daemon_init(void)
{
pid_t pid;
int fd;
int i;
pid = fork();
if(pid<0)
{
perror("Fail to creat child process.\n");
return -1;
}
else if(pid>0)
{
printf("daemon parent exit,pid = %d\n",pid);
exit(0);//结束父进程,使得子进程成为后台进程
}

setsid();//建立一个新的进程组
pid = fork();
if(pid<0)
{
perror("Setsid failed.\n");
return -1;
}
else if(pid > 0)
{
exit(0);
}
for(i = 0; i < NOFILE; close(i++));
chdir("/");

umask(0);

return 0;

}

void sig_term(int signo)
{
if(signo == SIGINT)
/* catched signal sent by kill(1) command */
{
syslog(LOG_INFO, "program terminated.");
closelog();
exit(0);
}
}

int main(int argc,char **argv)
{
time_t now;
if(argc == 2)
{

if(!strcmp(argv[1],"-a"))
{

if(daemon_init() == -1)
{
printf("can't fork self\n");
exit(0);
}
openlog("Test", LOG_PID, LOG_USER);
syslog(LOG_INFO, "program started.");
signal(SIGTERM, sig_term); /* arrange to catch the signal */


while(1)
{
sleep(8);
time(&now);
syslog(LOG_USER|LOG_INFO,"系统时间: \t%s\t\n",ctime(&now));
}

}

return 0;

}

time(&now);
syslog(LOG_USER|LOG_INFO,"系统时间2: \t%s\t\n",ctime(&now));

}
...全文
166 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
leeyiqun 2011-01-18
  • 打赏
  • 举报
回复
在 setsid();//建立一个新的进程组
后面加一个:
signal(SIGHUP, SIG_IGN);
试试
你可以加多一些调试信息看看。
比如你可以在
setsid();//建立一个新的进程组
上面一行加一个打印信息看能不能进入到这里来。
paodan 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 justkk 的回复:]
没用过,关注一下
[/Quote]哈哈,谢谢,网上搜一下,有调试子进程的,但是还没有知道怎么避开exit后调试
http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧