我在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”。所以程序很快结束,我无法注意到引擎是否正常工作。
我发现:
有谁知道为什么会这样?以及如何修复(绕过)此功能/错误?我不想使用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
现在我尝试绕过线程。
答案 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);
祝你好运! :)