为什么某些功能可以减少睡眠(n)进入睡眠状态(0)?

时间:2015-04-22 08:58:18

标签: c unix sleep getchar

我在C中有一个非常奇怪的问题。来自专有库的函数会将睡眠(n)减少到睡眠状态(0)。

我的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>  /*sleep() */

int main(int argc, char** argv){
   //...
   AStreamEngine.init();
   AStreamEngine.setCodec(3);

   AStreamEngine.start(); //problematic function

   printf("a");
   sleep(100);
   printf("b");
   return 0;
}

如果有问题的功能被注释掉,则在100秒后打印“b”后打印“a”。但如果没有注释掉,则打印“ab”。所以程序很快结束,我无法注意到引擎是否正常工作。

我发现:

  1. 如果我用getchar()替换sleep(),引擎就能正常工作。
  2. 如果我通过for循环进行主动等待,那么它也可以正常工作。
  3. 有谁知道为什么会这样?以及如何修复(绕过)此功能/错误?我不想使用getchar和主动等待。

    更新 我没有图书馆的来源。我只有二进制.so文件。

    根据回复,我添加了以下代码添加结束:

    struct timespec to_sleep = { 1, 0 }; 
    int ret = nanosleep(&to_sleep,&to_sleep);
    printf("%d\n",ret);
    if(ret == -1){
        printf(" break sleep : %d %s", errno,strerror(errno));
    }
    

    我得到输出:

      

    -1
      break sleep:4中断系统callc

    现在我尝试绕过线程。

3 个答案:

答案 0 :(得分:3)

&#34;睡眠&#34;可以被信号打断 - 见http://man7.org/linux/man-pages/man3/sleep.3.html。我的猜测是&#34;开始&#34;函数启动了一个可能导致信号发送到程序的线程。把&#34;睡觉&#34;在这样的循环中:

notifyDataSetChanged()

另一点:printf可能是行缓冲的。在该模式下,只有在打印&#34; \ n&#34;字符。尝试使用&#34; a \ n&#34;。

答案 1 :(得分:1)

正如Jack所说,睡眠和睡眠可以通过信号传递中断(例如,存在ioctl,读取,写入函数调用)。

避免此问题的一个明智方法是使用nanosleep。像睡眠和睡眠一样,nanosleep也可以通过信号的传递来中断,但不同的是,它的第二个参数告诉你剩余的时间。

您可以使用此参数确保代码在指定的时间内休眠。用含有nanosleep的while循环替换你的睡眠和usleep功能。以下是示例用法,

struct timespec to_sleep = { 1, 0 }; // Sleep for 1 second
while ((nanosleep(&to_sleep, &to_sleep) == -1) && (errno == EINTR)); 

当然,此解决方案不适用于需要精确睡眠量​​的应用,但在执行下一个功能之前需要最小延迟的情况下非常有用。

答案 2 :(得分:0)

经过检查,我认为使用sleep()函数对你的情况没用。

确实,睡眠功能使用 pause()功能,该功能等待信号并在您的进程收到信号呼叫时停止。

在您的情况下,它可能是问题所在,它解释了当您调用 AStreamEngine.start()函数时 sleep()函数停止的原因。

我认为最好的解决方案是使用 usleep()功能,如果您的进程收到信号,该功能不会停止。

试试这个:

usleep(VALUE_IN_MILISECONDS);
祝你好运! :)