2013-02-12 80 views
0

我有一个问题,当我在bashscript文件中运行该程序时,select()不会超时。这是我的实现:直接运行该程序后select()在bash脚本中没有给出超时

#include <sys/select.h> 

bool checkKeyPressed() 
{ 
    struct timeval tv; 

    tv.tv_sec = 1; 
    tv.tv_usec = 0; 

    fd_set descriptor; 
    const int input = 0; 

    FD_ZERO(&descriptor); 
    FD_SET(input, &descriptor); 

    return select(1, &descriptor, NULL, NULL, &tv) > 0; 
} 

// strace的结果(正确的,是有超时)

select(1, [0], NULL, NULL, {1, 0})  = 0 (Timeout) 

// strace的结果来运行bash脚本文件中的应用程序(无超时)

select(1, [0], NULL, NULL, {1, 0})  = 1 (in [0], left {0, 999996}) 
read(0, "", 1)       = 0 

我怎样才能改变得到它与bashscript下也运行工作的功能?

在此先感谢。

回答

0

如果仔细观察跟踪中的read调用,您会注意到它返回零意味着文件结束。

当文件描述符位于EOF(或远程套接字关闭等)时,描述符是可读的,read返回零。

如果您将在交互shell已按CTRL +d,你会得到相同的结果。

+0

是的,这很清楚。我的问题是,当我将程序包装到bashscript中时,如何更改代码以获取select(1,[0],NULL,NULL,{1,0})= 0(Timeout)。谢谢 – olidev 2013-02-12 09:56:58

+0

@olidev看来你不行。你必须以其他方式解决这个问题。 – 2013-02-12 10:31:31

+0

select()的任何替代方法?谢谢 – olidev 2013-02-12 10:40:16

0

如果您只需要1秒的超时时间,请勿将任何文件描述符传递到select()。在这种情况下,select()可用作便携式sleep()功能。

+0

下运行程序你的意思是:select(1,NULL,NULL,NULL,&tv)然后我不知道是否有按键被按下? – olidev 2013-02-12 15:58:44

+0

我的意思是'select(0,NULL,NULL,NULL,&tv)'。 – 2013-02-12 16:09:29

+0

无论如何,@JoachimPileborg给了你正确的答案。 – 2013-02-12 16:10:25