【发布时间】:2019-07-31 09:20:44
【问题描述】:
我有一个软件能够从标准输入读取命令以在单独的线程中进行调试。当我的软件作为前台进程运行时read 的行为与预期一样,它会阻塞并等待用户输入,即线程休眠。
当软件作为后台进程运行时,read 不断返回0(可能检测到 EOF?)。
这里的问题是,这个特定的读取是在while(true) 循环中。它尽可能快地运行,并在我的嵌入式设备上窃取宝贵的 CPU 负载。
我尝试将/dev/null 重定向到进程,但行为是相同的。我在 ARM Cortex A5 板上运行我的自定义 Linux。
有问题的代码如下并在其自己的线程中运行:
char bufferUserInput[256];
const int sizeOfBuffer = SIZE_OF_ARRAY(bufferUserInput);
while (1)
{
int n = read(0, bufferUserInput, sizeOfBuffer); //filedes = 0 equals to reading from stdin
printf("n is: %d\n", n);
printf("Errno: %s",strerror(errno));
if (n == 1)
{
continue;
}
if ((1 < n)
&& (n < sizeOfBuffer)
&& ('\n' == bufferUserInput[n - 1]))
{
printf("\r\n");
bufferUserInput[n - 1] = '\0';
ProcessUserInput(&bufferUserInput[0]);
} else
{
n = 0;
}
}
我正在寻找一种方法来防止read 在后台运行时不断返回并等待用户输入(当然永远不会出现)。
【问题讨论】:
-
如果使用文件作为输入调用发布的代码,也将无法正确处理输入,例如
app < input.txt。在这种情况下,read()将完全填充bufferUserInput,然后您的代码将丢弃该输入,因为n将等于sizeOfBuffer。此外,read()返回ssize_t,而不是int。 -
一个文件永远不会是输入,它只是用于读取值的简短调试命令。你对返回值的权利。
标签: c linux background-process