【发布时间】:2014-09-25 09:16:43
【问题描述】:
我的 C++ 程序只是一个非常简单的 while 循环,我在其中使用 getline() 阻塞函数从控制台(标准输入、标准输入)获取用户命令。为了其他目的,我必须时不时地调用一个外部 bash 脚本。该脚本与用户的操作没有直接关系,它只是在文件系统上做一些事情,但它必须在控制台标准输出 (stdout) 中打印文本行,以告知用户其计算结果。
我得到的是,一旦脚本启动并将内容打印到标准输出,getline() 函数的行为就是非阻塞(它应该阻塞,直到用户输入一些文本)。结果,while(1) 开始全速旋转,CPU 使用率飙升至接近 100%。
我将问题缩小到一个 C++ 源文件,它以完全相同的方式重现问题,这里是:
#include<iostream>
#include<string>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
int main(void)
{
int pid = fork(); // spawn
if(pid > 0)
{
// child thread
system("sleep 5; echo \"you're screwed up!!!\"");
}
else
{
// main thread
std::string input;
while(1)
{
std::cout << std::endl << "command:";
getline(std::cin, input);
}
}
}
在这种特殊情况下,5 秒后程序开始在标准输出上发送垃圾邮件“\ncommand:”,而阻止它的唯一方法是发送 SIGKILL 信号。有时您必须在程序开始发送垃圾邮件之前按键盘上的某些键。
让这段代码运行 10 秒钟,然后按键盘上的任意键。确保准备好从另一个控制台向进程发送 SIGKILL 信号。可以使用命令killall -9 progname
【问题讨论】:
-
你在哪个环境下试过?我试着运行你的程序,我得到了
command:you're screwed up!!!,程序退出了。 -
Linux CentOS6.然而,它实际上并没有退出。尝试按该控制台上的一些键,它应该开始发送垃圾邮件。
标签: c++ linux multithreading bash console