免费注册 查看新帖 |

Chinaunix

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

[C++] linux下如何让程序启动之后转为在进程中运行不占据命令行呢? [复制链接]

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-01 15:32 |只看该作者 |倒序浏览
     如题,标题可能有点词不达意。
    大概是这样。现在在linux下编译程序生成可执行文件test。
    用SeccureCRT登录的linux机器。我在命令行用./test启动程序test之后,它在命令行输出一些字符串,然后就一直占据着命令行。如果把那个界面关了,test的进程也被关了。
    看了下main函数里,在进行完一系列操作之后往屏幕上输出一些字符串,之后程序走进一个死循环,循环体内代码的作用是判断kill信号,当收到kill信号就执行exit(0)退出程序。问题就是这个死循环就让test启动之后一直占据着命令行。走不到下面的return 0;
    我在想如果把这个死循环屏蔽掉的话,代码往下走到return 0;的话程序是不是也就自动退出了。我想要实现的是输出完字符串后程序就不再占据命令行,即命令行能够继续敲命令,程序在进程里继续运行着。
    代码大致如下:
int main(int argc, char **argv)
{
     ....  //一些代码实现 里面会输出一些字符串
   for(;;)
   {
           ....            //检测终止信号的代码,检测到后即执行exit(0)
     }
     return 0;
}
    如果实现程序启动后输出完字符串即不占据命令行转而在进程中运行这个效果,该怎么来修改我的代码呢?对linux下的c++编程了解不是太多,希望知道的帮我解答一下疑惑,不要嫌我的问题太低级啊,tks!

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
2 [报告]
发表于 2013-11-01 15:34 |只看该作者
fork个子进程,父进程退出。

详细搜索下 守护进程

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
3 [报告]
发表于 2013-11-01 15:48 |只看该作者
回复 2# pandaiam


如果添加这样的功能函数
BOOL makechild()
{
    pid_t pid = fork();
       
    if (pid > 0)      
    {
        exit(0);
    }
    else if (pid == 0)  
    {
        if (setpgrp() == -1)
        {
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }
    else
    {
        return FALSE;
    }
    return FALSE;
}

然后main函数改成这样:
int main(int argc, char **argv)
{
     ....  //一些代码实现 里面会输出一些字符串
    if( makechild() == FALSE )
     {
            return -1;
     }
     return 0;
}

这样是否能起到我说的那个效果吗?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2013-11-01 15:52 |只看该作者
这个容易, 程序不用改,用
a.out >output.txt&

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
5 [报告]
发表于 2013-11-01 16:08 |只看该作者
回复 1# demongunner


    输出信息之后调用daemon或者fork & setsid或者其它daemonize方法。

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
6 [报告]
发表于 2013-11-01 16:15 |只看该作者
回复 5# myworkstation


    麻烦帮我看下3楼的那段代码是否可以实现这样的功能呢?谢谢
   我记得以前看子进程好像是从执行父进程创建它之后的代码来着的。。。具体实现不是太清楚了。。请帮我看一下吧

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
7 [报告]
发表于 2013-11-01 16:33 |只看该作者
其实就是


  1. main()
  2. {
  3.         /* 输出 */
  4.         pid = fork();
  5.         if (pid == -1) {/*fork错误*/
  6.                 return -1;
  7.         } else if (pid > 0) {/*父进程*/
  8.                 return 0;
  9.         }

  10.         for(; ;) {
  11.                 /* .... */
  12.         }

  13. }
复制代码

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
8 [报告]
发表于 2013-11-01 16:46 |只看该作者
回复 6# demongunner


    你还需要控制终端吗?如果不需要那应该用setsid而不是setpgrp,否则终端关闭后这个程序也会被终止。

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
9 [报告]
发表于 2013-11-01 16:53 |只看该作者
回复 8# myworkstation


    这个程序是个中间件,等于是它在后台启动着 然后服务端与客户端通过它进行通信 我启动之后不对这个程序做操作 关它的进程的话就直接用kill杀掉进程
这样该选择setsid还是setpgrp呢?

论坛徽章:
0
10 [报告]
发表于 2013-11-01 18:10 |只看该作者
nohup or screen
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP