免费注册 查看新帖 |

Chinaunix

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

unix平台程序后台启动后,关闭启动终端,程序不工作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-21 16:29 |只看该作者 |倒序浏览
使用ssh登陆到unix系统之后,启动程序。程序启动的时候,调用fork命令将程序转入后台,程序运行正常,但是关闭了终端,比如网络中端了,导致ssh终端关闭,此时有可能程序就出现异常(哪怕当时终端使用exit命令退出了),表现为程序僵死,程序进程仍在,日志不再打印,线程不工作,偶尔出现,有人遇到过这种问题吗?

论坛徽章:
0
2 [报告]
发表于 2009-12-21 16:36 |只看该作者
文件描述符0,1,2全部dup2到/dev/null

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2009-12-21 16:40 |只看该作者
加上这句吧
if ((fd = open("/dev/tty",O_RDWR)) >= 0) { ioctl(fd,TIOCNOTTY,NULL); }
告诉系统你此时和终端没有关系

论坛徽章:
0
4 [报告]
发表于 2009-12-21 18:02 |只看该作者
原帖由 cjaizss 于 2009-12-21 16:40 发表
加上这句吧
if ((fd = open("/dev/tty",O_RDWR)) >= 0) { ioctl(fd,TIOCNOTTY,NULL); }
告诉系统你此时和终端没有关系


程序里面用 setsid() 函数设置新会话的领头进程了,这两种方法,都可以起到同样的作用吧

论坛徽章:
0
5 [报告]
发表于 2009-12-21 18:03 |只看该作者
而且很郁闷的是,并不是每次都这样,大部分时间,都没问题。。。。

论坛徽章:
0
6 [报告]
发表于 2009-12-21 19:02 |只看该作者
Windows NT Telnet 服务器更奇怪,当会话空闲超时或者用户主动退出时,默认是终止会话打开的所有程序。但假如在超时前发生通讯故障导致连接被重置,那么先前的程序仍然在运行。

论坛徽章:
0
7 [报告]
发表于 2009-12-21 22:58 |只看该作者
mark,楼主参考下守护进程的写法试试

论坛徽章:
0
8 [报告]
发表于 2009-12-22 03:56 |只看该作者
就是参考了守护进程的写法……

INT16 DaemonInit( void )
{
        pid_t pid;

        pid = fork();

        if ( pid < 0 )
                return -1;

        if ( pid > 0 )              //父进程
                exit(0);

        if ( setsid() < 0 )
                return -2;

        pid = fork();              //

        if ( pid < 0)
                return -3;

        if ( pid > 0 )
                exit(0);                //第一子进程

        umask(0);//重设文件创建掩模

        signal( SIGCHLD, SIG_IGN );

        return 0;
}

论坛徽章:
0
9 [报告]
发表于 2009-12-22 10:40 |只看该作者
你应该还要

  1. /*
  2.      * Change the current working directory to the root so
  3.      * we won't prevent file systems from being unmounted.
  4.      */
  5.     if (chdir("/") < 0)
  6.         err_quit("%s: can't change directory to /");

  7.     /*
  8.      * Close all open file descriptors.
  9.      */
  10.     if (rl.rlim_max == RLIM_INFINITY)
  11.         rl.rlim_max = 1024;
  12.     for (i = 0; i < rl.rlim_max; i++)
  13.         close(i);

  14.     /*
  15.      * Attach file descriptors 0, 1, and 2 to /dev/null.
  16.      */
  17.     fd0 = open("/dev/null", O_RDWR);
  18.     fd1 = dup(0);
  19.     fd2 = dup(0);
复制代码

参考APUE

论坛徽章:
0
10 [报告]
发表于 2009-12-22 11:18 |只看该作者
原帖由 bsdc 于 2009-12-22 10:40 发表
你应该还要

/*
     * Change the current working directory to the root so
     * we won't prevent file systems from being unmounted.
     */
    if (chdir("/") < 0)
        err_quit("%s:  ...


在书上是看到这个了,不过这个有必要性吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP