2013-02-12 81 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