V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wbing
V2EX  ›  问与答

LINUX 下的 C++程序,在前台运行时 CPU 正常,然后用 nohup 将程序跑在后台瞬间飙到 90+以上,怎么回事??

  •  
  •   wbing · 2016-07-16 13:53:21 +08:00 · 3183 次点击
    这是一个创建于 3071 天前的主题,其中的信息可能已经有所发展或是发生改变。
    google 了下有看到也有其他人遇到这问你,就是没有说出是为啥
    第 1 条附言  ·  2016-07-16 15:32:12 +08:00
    找到原因了。谢谢各位

    我这边的程序时开一个进程去执行服务,主进程就一直循环等待用户输入去显示菜单。

    类似

    string aa;
    while(true)
    {
    cin >> aa;
    if(aa=="***")
    break;
    }

    我写了个 demo ,然后用 nohup ./demo  &  cpu 直接飙上 100 。


    不过不知道为何在前台跑的时候 cpu 就不会上 100 ,等我找下为什么
    第 2 条附言  ·  2016-07-16 16:17:30 +08:00
    原来 nohup 后台执行程序时,标准输入一直不断输入空字符。
    第 3 条附言  ·  2016-07-18 18:58:05 +08:00
    看来还是得好好补基础了。

    ios 类定义了这四个常量 badbit, eofbit, failbit, goodbit 中的两种,这四个标志常量就是取对应标志位的掩码,也即输入的四种异常情况!
    以上四个常量对应的取值为:
    ios::badbit 001 输入(输出)流出现致命错误,不可挽回
    ios::eofbit 010 已经到达文件尾
    ios::failbit 100 输入(输出)流出现非致命错误,可挽回
    ios::goodbit 000 流状态完全正常, 各异常标志位都为 0



    nohup 后台跑时, cin 标准输入,直接到达文件末尾,所以 cin.eof()返回 1 ,因此我的代码中可以判断 cin.good()的返回值,如果错误,则跳出循环。


    此问题结束。
    10 条回复    2016-07-16 22:32:39 +08:00
    jemyzhang
        1
    jemyzhang  
       2016-07-16 14:01:41 +08:00 via Android
    strace
    wbing
        2
    wbing  
    OP
       2016-07-16 14:26:01 +08:00
    @jemyzhang strace 貌似怎么和 nohup 共用??
    我用 strace -cp $(nohup ./MyExe &)
    只显示了重定向错误到标准输出,然后就没打印其他了,而我这程序只有在用 nohup ./MyExe & 时才会 cpu 上 100
    gulucn
        3
    gulucn  
       2016-07-16 14:36:24 +08:00 via Android
    strace -p 可以指定进程号。
    wbing
        4
    wbing  
    OP
       2016-07-16 14:40:17 +08:00
    @gulucn

    我 2 楼上面那个命令就是这个, 我先执行 nohup ./MyExe & ,再执行 strace -p MyPID 的话,
    就只输出了 “ Process MyPID attached",其他什么都没显示
    redsonic
        5
    redsonic  
       2016-07-16 15:12:23 +08:00
    程序前台执行的时候有很多输出吗?如果有, nohup ./MyExe > /dev/null 再试试,如果这个就 ok 了,回头再看看之前 top 输出的 wa 是不是很高,如果是,检查硬盘是不是满了或硬盘故障。
    wbing
        6
    wbing  
    OP
       2016-07-16 15:30:00 +08:00
    @redsonic

    是个服务来的,很多日志。

    现在知道问题原因了,是卡在标准输入上面了。
    9hills
        7
    9hills  
       2016-07-16 17:35:55 +08:00 via iPhone
    nohup. Xxx </Dev/null
    lean
        8
    lean  
       2016-07-16 18:00:23 +08:00 via Android
    nohup ./demo >/dev/null 2>&1 & 遇到过类似的情况,不知这样是否可行
    wbing
        9
    wbing  
    OP
       2016-07-16 21:28:17 +08:00
    @9hills

    你这样也是同样的情况的,还是标准输入一直有个空的进去.

    @lean
    你这是只是把错误输出和标准输出重定向到 /dev/null , 对于标准输入那边还是没作用的

    ------------------------------------------------

    我这边有个类似的 demo

    ```

    #include<iostream>
    #include<string>
    using namespace std;


    int main()
    {
    string aa;
    while(true)
    {
    cin >> aa;
    if(aa=="q")
    break;
    if(aa=="")
    cout << "empty" << endl;
    }
    return 0;
    }


    ``

    然后用 nohup 后台跑起来,top 查看该进程,cpu 一个核直接上 100%.

    一开始试了下用 select 去处理,但发现一直有输入,所以没作用.

    目前我是让其当遇到空输入时,就 sleep 100 毫秒. 就没有这种问题出现了. 不知道还有没更好的解决办法
    9hills
        10
    9hills  
       2016-07-16 22:32:39 +08:00 via iPad
    @wbing 呵呵,不解释
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4646 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 09:42 · PVG 17:42 · LAX 01:42 · JFK 04:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.