如果有誰知道如何判斷標準輸入或bash的標準輸出綁定到一個插座或不是,在C我想知道?如何判斷標準輸入綁定到一個插座或不是,在C
回答
我不知道爲什麼人們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級別選項。這會告訴你你有什麼樣的套接字。
參見:
這是一個有趣的建議,但是您能否詳細說明一下您不確定的內容?這個代碼是否工作?爲什麼這不是「真正的最終答案」?爲什麼你「不是100%肯定」?我想,如果你會不怕麻煩來測試你的代碼:) – 2014-10-31 09:16:08
我對規範的理解,告訴我必須工作,但我沒有測試它,所以我不能保證它的工作原理:) – fjardon 2014-10-31 09:25:16
見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! */
}
- 1. 如何判斷插座是否連接?
- 2. 如何使用C#綁定到標準輸入和輸出?
- 3. 如何判斷一個參數是標準的,輸出還是參考?
- 4. INSERT IGNORE - 如何判斷是否插入?
- 5. 將節點管道連接到標準輸出 - 如何判斷是否排幹?
- 6. C:重定向標準輸入,標準輸出到管道
- 7. 如何判斷一個Python程序是否有任何要從標準輸入讀取的內容?
- 8. C#進程中斷大標準輸入
- 9. 如何判斷是否存在一個或多個XML節點
- 10. 我如何判斷一個Hibernate實體是隻讀的或不
- 11. 如何判斷NSString是否在NFD中被標準化?
- 12. 如何中斷另一個標準輸入流
- 13. 如何使用fgets()而不是fscanf()在標準輸入C中?
- 14. socat阻斷標準輸入
- 15. 如何判斷事件綁定到某個對象?
- 16. 如何處理標準輸入到標準輸出在PHP?
- 17. Fgets沒有得到任何來自標準輸入的輸入或標準輸入不等於輸入?
- 18. 如何判斷一個標籤是網站還是圖片?
- 19. 如何判斷Request.Form中的值是否是一個數字? (C#)
- 20. 如何斷開FireBase插座?
- 21. 從標準輸入在C#
- 22. 如何判斷JPA EntityManager.merge是否正在執行插入操作或更新
- 23. 如何判斷用戶是否正在刪除或插入行 - Excel VBA
- 24. 如何判斷單元格是否在cellForRowAtIndexPath中插入或重新加載?
- 25. 如何判斷一個目錄是否可以在Objective-C中寫入?
- 26. 如何判斷遠程tty是否在等待輸入?
- 27. 如何調用/ jQuery的日期選擇器綁定到一個標籤或DIV,而不是輸入字段
- 28. 如何判斷一個插件將運行在哪個階段?
- 29. 如何判斷C++程序何時等待輸入?
- 30. 如何判斷輸入是否是退格
這是很難準確地瞭解你想知道的東西。你有什麼嘗試?你能說明你的情況嗎? (示例bash會話會是什麼樣子?)您是否在尋找['isatty'](http://linux.die.net/man/3/isatty)? – 2014-10-31 08:18:24
可以[測試](http://rosettacode.org/wiki/Check_output_device_is_a_terminal#C)如果一個文件句柄被綁定到一個終端與否;我不認爲你可以測試任何比這更具體的東西(例如,如果它綁定到套接字)。 – Amadan 2014-10-31 08:18:56
嚴格地說,答案是'$(/ usr/bin/false)',因爲你不能直接將stdin或stdout連接到bash中的套接字。您可以將其文件描述符連接到連接到套接字的設備文件(如果您的操作系統允許的話),但仍然可以讀取或寫入文件。 – mfro 2014-10-31 08:34:19