光辉45听歌 2022-06-27 11:23 采纳率: 0%
浏览 147
已结题

popen 导致进程崩溃

 {
        do
        {
            if (cmd.empty())
            {
                reason = PARAMS_ERROR ":empty cmd";
                break;
            }
            FILE *pipe = popen(cmd.c_str(),"r");
            if (!pipe)
            {
                reason = SERVER_ERROR ":popen failed:" + Common::String(strerror(errno));
                break;
            }
            char buff[1024] = {0};
            while(!feof(pipe))
            {
                if(fgets(buff,1024,pipe))
                    result += buff;
            }
            pclose(pipe);
            return true;
        } while (0);
        return false;
}

请问各位,上面代码调用频率大概一分钟有10次,偶尔会产生coredump,一直找不到原因,上生产用的就出问题,虽然不影响业务,但是一堆core文件看着很头疼。系统是centos7
以下是coredump文件的堆栈信息。

#0  0x00007fd8ca0e05ae in _IO_proc_open@@GLIBC_2.2.5 () from /lib64/libc.so.6
#1  0x00007fd8ca0e066c in popen@@GLIBC_2.2.5 () from /lib64/libc.so.6
#2  0x000000000042d508 in xxxx::xxxx (this=<optimized out>, cmd=..., result=..., reason=...) at xxxx.cpp:1011
#3  0x0000000000517b2a in Common::ServerCallI::execute (this=0x4a0db80) at ../../.././src/Common/CommonI.cpp:1381
#4  0x0000000000513755 in Common::EventManagerI::processExecute (this=<optimized out>, processor=..., execute=0x4a0dba0) at ../../
#5  0x0000000000518c38 in Common::EventManagerI::process (this=0x29ae000, processor=...) at ../../.././src/Common/CommonI.cpp:1851
#6  0x0000000000519693 in Common::Processor::onRun (this=0x29ab590) at ../../.././src/Common/CommonI.cpp:1301
#7  0x00000000005ea408 in Common::Thread::entry (params=0x29ab590) at ../../.././src/Common/UtilI.cpp:1548
#8  0x00007fd8cae6dea5 in start_thread () from /lib64/libpthread.so.0
#9  0x00007fd8ca16e9fd in clone () from /lib64/libc.so.6

会是哪些原因导致的,帮我指明一下调查方向或者有哪些解决方案

  • 写回答

1条回答 默认 最新

  • 於黾 2022-06-27 13:41
    关注

    这代码写的有够烂的
    1.do...while(0)是个什么鬼,为什么要写这种垃圾代码
    2.既然你要跟硬盘文件交互,肯定要加try呀,你不能保证你在打开文件的时候没有别的进程已经打开了文件,或者你自己的进程重复打开文件。
    只有纯内存操作才可以不用加try,而完全用if来判断是否执行成功。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月26日
  • 创建了问题 6月27日

悬赏问题

  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码