Qt 应用程序中使用 close系统调用函数 注意问题
因qt QWidget有QWidget::close()函数,与系统调用函数close同名,这是qt设计不好的地方,因此在QWidget派生类函数中调用close系统调用就要使用全局域符号“::”。
当时我出问题的代码如下:
void ButtonWindow::mousePressEvent ( QMouseEvent * e )//鼠标单击事件响应
{
int i;
int bfd;
int rt;
std::cout << "mouse clicked!\n";
bfd = open("/dev/Buzzer", 0);
if (bfd!=-1)
printf("open '/dev/Buzzer success!'\n");
else
{
printf("open '/dev/Buzzer fail!'\n");
printf(strerror(errno));
return;
}
rt = close(bfd); //注意此处使用错误,未加全局域符号,默认调用ButtonWindow::close函数,应改为rt=::close(bfd)
printf("close:rt=%d\n", rt);
printf("close '/dev/Buzzer'!\n");
}
当时发现很奇怪,close函数总是返回1,与标准close函数返回值不符,且调用此句函数后,qt线程变为了僵尸线程。后来猛然发现qt QWidget有QWidget::close()函数,这也就能解释为什么qt界面没有了,并成为僵尸线程了。这个问题我找了一天多,最后总算找到了。在此做下记录,希望也能给遇到同样问题的朋友提供参考吧。