2014-10-31 33 views
0

如果有誰知道如何判斷標準輸入或bash的標準輸出綁定到一個插座或不是,在C我想知道?如何判斷標準輸入綁定到一個插座或不是,在C

+3

這是很難準確地瞭解你想知道的東西。你有什麼嘗試?你能說明你的情況嗎? (示例bash會話會是什麼樣子?)您是否在尋找['isatty'](http://linux.die.net/man/3/isatty)? – 2014-10-31 08:18:24

+0

可以[測試](http://rosettacode.org/wiki/Check_output_device_is_a_terminal#C)如果一個文件句柄被綁定到一個終端與否;我不認爲你可以測試任何比這更具體的東西(例如,如果它綁定到套接字)。 – Amadan 2014-10-31 08:18:56

+0

嚴格地說,答案是'$(/ usr/bin/false)',因爲你不能直接將stdin或stdout連接到bash中的套接字。您可以將其文件描述符連接到連接到套接字的設備文件(如果您的操作系統允許的話),但仍然可以讀取或寫入文件。 – mfro 2014-10-31 08:34:19

回答

2

我不知道爲什麼人們downvote這個問題,爲什麼他們說話時,則表示該解決方案應該是在Ç解決使用bash的問題,反正有合理的用例。

我沒有真正的最終答案的問題,但如果我有這個問題,我會嘗試使用文件描述符套接字特定呼叫並檢查它是否成功。例如:

// Untested 
int socktype; 
int optlen = sizeof(int); 
if(getsockopt(sockfd, SOL_SOCKET, SO_TYPE, &socktype, &optlen) < 0) { 
    // this is maybe not a socket ... 
    if(ENOTSOCK == errno) { 
     // This is not a socket ... 
    } 
} else { 
    // probably a socket ... 
} 

返回值會告訴我(不是100%肯定雖然)描述符是一個插座或沒有。

如果它成功了,你可以用更具體的呼叫升級,就像使用IP層或TCP級別選項。這會告訴你你有什麼樣的套接字。

參見:

+0

這是一個有趣的建議,但是您能否詳細說明一下您不確定的內容?這個代碼是否工作?爲什麼這不是「真正的最終答案」?爲什麼你「不是100%肯定」?我想,如果你會不怕麻煩來測試你的代碼:) – 2014-10-31 09:16:08

+0

我對規範的理解,告訴我必須工作,但我沒有測試它,所以我不能保證它的工作原理:) – fjardon 2014-10-31 09:25:16

0

fstat。根據此手冊頁,宏S_ISSOCK不在POSIX中,因此這可能無法在所有環境中使用。

此代碼應該stdin做(未測試)。要檢查stdout,使用STDOUT_FILENO代替STDIN_FILENO

struct stat st; 

if (fstat(STDIN_FILENO, &st) < 0) { 
    perror("fstat on stdin"); 
    exit(errno); 
} 

if (S_ISSOCK(st)) { 
    /* it is a socket! */ 
} 
相關問題