首页 文章

sleep()导致分段错误

提问于
浏览
3

我有一个带有头文件的动态库,如下所示:

#ifndef SRC_H
#define SRC_H

#include<time.h>

namespace test
{
    void sleep( int numsec );
}
#endif

和源文件如下:

#include"src.h"

namespace test
{
    void sleep(int numsec)
    {
        sleep(numsec);        
    }
}

我有一个只包含以下主文件的可执行文件

#include "linked/src.h"

int main() 
{
    test::sleep(3);    
}

我明白了

启动程序:/ usr0 / home / gschoenh / Dropbox / Code / cpp / scratch / main / app [使用libthread_db启用线程调试]使用主机libthread_db库“/lib/x86_64-linux-gnu/libthread_db.so.1” . 程序接收信号SIGSEGV,分段故障 . 在test :: sleep(numsec = 3)src.cpp中的0x00007ffff7bd863c:8 8 sleep(numsec);

谢谢您的帮助 :)

PS:我花了很多时间试图自己解决这个问题 . 我已经解决了我自己的最后100个错误 . 所以请不要像“你^#* $(#($&%(#_ . )花费更多的时间来尝试自己做#$&@(#)@ . ”谢谢 .

2 回答

  • 0
    void sleep(int numsec)
    {
        sleep(numsec);        
    }
    

    看起来像一个递归的无限循环 . 除非编译器执行尾递归消除,否则它可能会导致堆栈溢出 .

    如果这是对POSIX sleep 函数的调用,则在 <unistd.h> 中声明 . 一旦添加 #include <unistd.h> ,您应该能够像这样调用它:

    ::sleep(numsec);
    
  • 9
    void sleep(int secs)
    {
    sleep(3);
    }
    

    上面的代码导致无限递归 . 我修改了代码如:

    #include <iostream>
    #include <unistd.h>
    void sleep(int secs)
    {
    using std::cout;
    using std::endl;
    cout << "Before sleep\n";
    ::sleep(3);
    cout << "After sleep" << endl;
    }
    

    对我来说很好,g编译器版本g(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3

    另据 Linux 手册页http://linux.die.net/man/3/sleep;睡眠原型是

    unsigned int sleep(unsigned int secs)
    

    您还可以修改代码以存储从睡眠(unistd.h)返回到虚拟对象以解决冲突以及检查返回值(例如,如果呼叫被信号中断) .

相关问题