sleep()导致分段错误

时间:2013-04-09 23:08:34

标签: c++

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

#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)中的0x00007ffff7bd863c位于src.cpp:8
  8睡觉(numsec);

感谢您的帮助:)

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

2 个答案:

答案 0 :(得分:9)

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

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

如果这是对POSIX sleep函数的调用,则在<unistd.h>中声明它。添加#include <unistd.h>后,您应该可以这样调用它:

::sleep(numsec);

答案 1 :(得分:0)

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)返回到虚拟对象以解决冲突以及检查返回值(例如,如果呼叫被信号中断)。