相关疑难解决方法(0)

在C到毫秒内是否有替代睡眠功能?

我有一些在Windows上编译的源代码.我正在将其转换为在Red Hat Linux上运行.

源代码包含<windows.h>头文件,程序员使用该Sleep()函数等待一段时间.这不适用于Linux.

但是,我可以使用该sleep(seconds)函数,但在几秒钟内使用整数.我不想将毫秒转换为秒.有没有替代睡眠功能,我可以在Linux上使用gcc编译?

c linux sleep

120
推荐指数
5
解决办法
27万
查看次数

sleep()背后的算法是什么?

现在有一些我一直想知道的事情:sleep()是如何实现的?

如果只是使用操作系统中的API,那么API是如何制作的?

这一切都归结为在CPU上使用特殊的机器代码吗?那个CPU是否需要一个特殊的协处理器或其他小玩意,没有它你就不能睡觉()?

睡眠()的最着名的化身在C语言中(更准确地说,在C编译器附带的库中,例如GNU的libc),尽管现在几乎每种语言都有它的等价物,但是在某些语言中实现了睡眠(认为Bash)不是我们在这个问题上看到的......

编辑:在阅读了一些答案之后,我看到该进程被置于等待队列中.从那里,我可以猜出两种选择

  1. 设置一个计时器,以便内核在适当的时间唤醒进程,或者
  2. 每当内核被允许一个时间片时,它会轮询时钟以检查是否是时候唤醒一个进程.

答案只提到备选1.因此,我问:这个计时器如何表现?如果这是一个让内核唤醒进程的简单中断,那么内核如何要求定时器"在140毫秒内唤醒我,以便我可以将进程置于运行状态"?

c algorithm sleep

41
推荐指数
7
解决办法
9648
查看次数

Linux select()vs ppoll()vs pselect()

在我的应用程序中,有一个专用的io-thread

  1. 在自定义协议中包装从应用程序接收的数据
  2. 通过tcp/ip发送数据+自定义协议数据包
  3. 通过tcp/ip接收数据+自定义协议包
  4. 展开自定义协议并将数据交给应用程序.

应用程序通过不同的线程处理数据.此外,要求规定未确认的窗口大小应为1,即任何时候应该只有一个未确认的未确认消息.这意味着如果io-thread已经通过套接字发送了一条消息,它将不再发送任何消息,直到它从接收方听到一个确认消息.应用程序的处理线程通过管道与io-thread通信.如果来自linux CLI的人键入ctrl + C,应用程序需要正常关闭.因此,鉴于这些要求,我有以下选择

  1. 在套接字和管道描述符上使用PPoll()
  2. 使用选择()
  3. 使用PSelect()

我有以下问题

  1. select()和poll()之间的决定.我的应用程序只处理少于50个文件描述符.可以假设我选择选择或民意调查没有区别吗?

    1. select()和pselect()之间的决定.我阅读了linux文档,它说明了signal和select之间的竞争条件.我没有信号经验,所以有人可以更清楚地解释竞争条件和选择()吗?它是否与某人在CLI上按ctrl + C并且应用程序没有停止有关?

    2. pselect和ppoll()之间的决定?对一个与另一个的任何想法

c linux network-programming

18
推荐指数
3
解决办法
2万
查看次数

为什么使用select()而不是sleep()?

我正在编写一个关于iPhone音频的章节,并且遇到了一段我无法理解的代码:

while (aqc.playPtr < aqc.sampleLen) 
{
    select(NULL, NULL, NULL, NULL, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

(完整代码示例在第163-166页).根据我对代码的理解,音频正在另一个线程上处理,而while循环就是为了防止主线程在音频仍在处理时终止.

我不明白的是为什么select()要用来代替sleep().

从我所读到select()的用于监视I/O的变化并传递它的NULL并没有做任何有意义的事情.我已经运行了代码sleep(),它按预期工作.(我对低级别POSIX的了解几乎不存在.)

c multithreading posix

15
推荐指数
3
解决办法
2万
查看次数