2013-07-23 53 views
0

我正在嘗試創建自定義tcl通道並使用它來獲取tcl Interpreter的輸出。我添加了幾個Tcl_ChannelType函數的實現,但我得到了段錯誤。創建自定義tcl通道驅動程序時出現分段錯誤

#include <tcl.h> 
#include <iostream> 

int driverBlockModeProc(ClientData instanceData, int mode) { 
    std::cout << "driverBlockModeProc\n"; 
    return 0; 
} 

int driverCloseProc(ClientData instanceData, Tcl_Interp *interp) { 
    std::cout << "driverCloseProc\n"; 
    return 0; 
} 

int driverInputProc(ClientData instanceData, char* buf, int bufSize, int *errorCodePtr) { 
    std::cout << "driverInputProc\n"; 
    return 0; 
} 

int driverOutputProc(ClientData instanceData, const char* buf, int toWrite, int *errorCodePtr) { 
    std::cout << "driverOutputProc\n"; 
    return 0; 
} 

int main() { 

    Tcl_ChannelType *typePtr = new Tcl_ChannelType; 

    typePtr->blockModeProc = driverBlockModeProc; 
    typePtr->outputProc = driverOutputProc; 
    typePtr->closeProc = driverCloseProc; 
    typePtr->inputProc = driverInputProc; 

    typePtr->seekProc = NULL; 
    typePtr->setOptionProc = NULL; 
    typePtr->getOptionProc = NULL; 
    typePtr->watchProc = NULL; 
    typePtr->getHandleProc = NULL; 
    typePtr->close2Proc = NULL; 
    typePtr->blockModeProc = NULL; 
    typePtr->flushProc = NULL; 
    typePtr->handlerProc = NULL; 
    typePtr->wideSeekProc = NULL; 
    typePtr->threadActionProc = NULL; 

    ClientData data = new char[200]; 
    Tcl_CreateChannel(typePtr, "im_chanel", data, TCL_WRITABLE | TCL_READABLE); 

} 

我無法調試段錯誤,因爲它的源不可用。我認爲segfault是因爲一個函數被調用,它是NULL。我只需要使用該通道來獲取解釋器的輸出。我不需要在這裏實現哪些功能,是解決問題的正確方向。

+0

Tcl源代碼從[core.tcl.tk](http://core.tcl.tk) –

+0

@JohannesKuhn aviable如何找到'Tcl_CreateChannel'的實現呢? – Ashot

+1

http://core.tcl。tk/tcl/artifact/61eaeb7eca488501a7bd21df744453bfb8c2d4bf –

回答

1

建議您在此級別工作時將源代碼下載到Tcl。我不確定你使用的是什麼版本,但是所有官方發佈的源代碼很長,都在the SourceForge file distribution system;爲您所獲得的版本選擇完全匹配。

創建自定義通道驅動器是容易。這涉及到大量的復​​雜性,並且沒有特別詳細地記錄通道驅動程序類型中的「方法」是必需的,什麼是可選的。 (它們不是類中的C++方法--Tcl是純粹的C代碼,原因很漫長,無法進入此處 - 但它們的功能與概念相似。)

如果我們查看Tcl_CreateChannel的文檔,我們會看到(在該頁面的相當長的一段距離)通道類型結構的定義。通道式結構應該是靜態分配(Tcl的實現假設非常強,它永遠不會改變位置),並以下字段必須設置爲有意義的事:

  • typeName - 這是通道型的名稱,用於調試!
  • version - 這是通道類型的版本;您應該將其設置爲您的目標源級別支持的最新版本。 (你建議使用至少TCL_CHANNEL_VERSION_2或事情變得相當複雜。)
  • closeProcclose2Proc - 通道必須是關閉的,但你有辦法做到這一點兩種選擇。雙向通道應該使用close2Proc,但並不嚴格要求。
  • inputProc - 只有在您閱讀時才需要;注意正確處理這個問題。
  • outputProc - 只有在你寫作時才需要;注意正確處理這個問題。
  • watchProc - 被叫告訴信道驅動器將自身安裝到事件系統以接收合適的事件(由所提供的位掩碼的指示)。沒有後臺操作系統句柄的通道使用計時器事件,或者根本不會實際生成事件(在這種情況下,從fileevent的角度看,它們永遠不會變得可讀或可寫)。

看着你的代碼,我發現你錯過了watchProc。我知道很難看到(沒有多少人寫頻道驅動程序,說實話,所以文檔不是很難「測試」),但它確實是必要的。

+0

感謝您的回覆。你對於獲得解釋者的輸出提出了什麼建議。我很長時間在解決這個問題,並嘗試了很多方法。可以做到嗎? – Ashot

+0

@Ashot「得到解釋者的輸出」在我的腦海裏有幾個可能的含義。你是什​​麼意思?什麼是用例? –

+0

我需要在GUI窗口中顯示它。默認情況下,它在shell中打印輸出。我有控制檯小部件,它接受來自用戶的命令並執行它。我需要在控制檯小部件中顯示命令的輸出。 – Ashot

相關問題