2012-01-02 73 views
1

我想使用一個線程通過使用tshark實用程序(使用system()命令)獲取數據包的字段,然後將輸出重定向到文件。同一個文件需要被另一個線程同時讀取,以便它可以根據文件中觀察到的字段進行運行時決策。通過兩個線程同時讀/寫文件(互斥鎖不幫助)

我現在的問題是即使第一個線程正在寫入文件,第二個線程無法讀取它(它從文件中讀取NULL)。我不確定它爲什麼這樣表現。我認爲這可能是由於同時訪問同一個文件。我想過使用互斥鎖,但會阻塞讀線程,因爲第一個線程只會在程序終止時結束。

有關如何去解決它的任何想法?

+0

你爲什麼要這樣做,而不是簡單地使用libpcap或winpcap來捕獲你想要直接在你的程序中的數據包? – 2012-01-02 15:25:18

+0

,因爲我只需要幾個字段,tshark能夠準確地給出那些字段... – user1126425 2012-01-02 15:30:35

回答

2

如果您使用該文件進行進程間通信,則可改爲使用命名管道或消息隊列。它們使用起來更容易,並且不需要同步,因爲一個線程寫入數據並且另一個數據可用時讀取。

編輯:對於線程間通信,您可以簡單地使用共享變量和條件變量來指示何時生成了一些數據(生產者 - 消費者模式)。例如:

// thread 1 
while(1) 
{ 
    // read packet 
    // write packet to global variable 
    // signal thread 2 
    // wait for confirmation of reading 
} 

// thread 2 
while(1) 
{ 
    // wait for signal from thread 1 
    // read from global variable 
    // signal thread 2 to continue 
} 

信號部分可以用條件變量實現:pthread_cond_t

+0

不,我正在使用該文件進行內部線程通信..我可以使用管道/隊列嗎?你能提供一個資料來了解更多關於這些的信息嗎? – user1126425 2012-01-02 15:33:02

+0

@ user1126425:我做了一個編輯。希望能幫助到你。 – Tudor 2012-01-02 15:40:51

+0

感謝都鐸的提示。我剛剛發現問題不在於線程,而是將輸出從tshark實用程序重定向到文件。當我終止進程(使用ctrl + c)時,重定向操作符只會將tshark的輸出寫入文件...這就是爲什麼其他線程無法看到任何數據......任何想法? – user1126425 2012-01-02 17:06:16