我有一个后台程序的应用程序用C语言编写,目前正在使用Solaris 10的机器上没有已知问题运行。我在过将它移植到Linux的过程。我不得不做最小的改动。在测试过程中通过了所有的测试案例。有与它的功能没有问题。然而,当我在我的Solaris机器上“空闲”它是使用围绕0.03%的CPU查看其CPU使用率。在运行红帽企业Linux 4.8虚拟机相同的过程使用所有可用的CPU(通常介于90%+的范围)。

我的第一个想法是,一定出事了与事件循环。事件循环是一个无限循环(while(1))通过调用select()。该timeval中的设置,使timeval.tv_sec = 0timeval.tv_usec = 1000。这似乎是什么过程做得不够合理。作为一个测试,我碰到了timeval.tv_sec 1。即使这样做,我看到了同样的问题后。

有什么我缺少有关Linux下如何选择作品与Unix的?或者它与不同和操作系统在虚拟机上运行的工作吗?或者,也许还有别的东西,我完全失踪?

还有一两件事我不知道正在使用的VMware Server的版本。据刚刚更新大约一个月前,虽然。

有帮助吗?

解决方案

我相信Linux写入select()调用的时间参数返回剩余时间和Solaris没有。这意味着,一个程序员谁是不知道POSIX规范的可能无法重置调用选择的时间参数。

这将导致具有1000微秒超时而使用0微秒超时所有其他呼叫的第一个呼叫。

其他提示

正如咱山猫所说,的timeval通过选择在Linux上改性,因此每个选择呼叫之前应重新分配正确的值。此外,我建议检查是否一些文件描述符的是在特定状态下(例如文件结束,对等连接关闭...)。也许移植是表示返回值(FD_ISSET等)的analisys一些潜在的错误。这对我来说太多年前在选择驱动周期的端口:我是在错误的方式使用返回的值,并封闭FD添加到rd_set,导致选择失败。在旧平台上的错误FD被用来比maxfd高的值,所以它被忽略了。因为同样的错误,程序不承认选择失败(选择()== - 1)和永久循环。

再见!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top