Hi,
bayufa wrote:
Saya pernah bikin sniffer ..tapi di Windows konsepnya sama seperti mas Andrew.. kita bisa menggunakan "bounded buffer"
namun , rasanya kok ada cara yg lebih mudah ya pake API message queue di Linux saja.. tidak repot2 , harus bikin buffer dan sinkronisasi
Message queue ini bukan utk sinkronisasi, tapi utk komunikasi antar process atau IPC. Process nggak bisa share global data, jadi perlu IPC kayak pipe, fifo, message queue, dsb.
Bisa juga dipake dengan thread, tapi bukannya kelebihan dari thread adalah mudahnya komunikasi/sharing lewat global variable? Jadi nggak perlu IPC (atau minimum dikurangin).
Juga message queue ini punya fitur kalo satu process nulis data ke queue lalu terminate, data tersebut nggak bakal hilang. Data itu ada di queue terus sampe ada process lain yg mencomot dari queue. Kalo nggak ada yg nyomot, message queue itu bakal ada terus dan bisa di hapus kalo pake "ipcs" program.
IMHO, message queue ini kayaknya agak "repot" ngurusnya karena mesti ngecheck ada nggak queue yg "nyantol" lalu mesti dibersihkan.
Alternative lain sih pake FIFO. Tapi juga resehnya kalo pake FIFO mesti readernya jalan dulu sebelon writernya.
Memang kalo pake message queue/fifo/pipe ini enaknya kalo queue lagi kosong, coba ngebaca dari queue tersebut akan nge-block. Ini agak mirip dengan bounded buffer dimana thread akan nunggu (blocking) sampe ada data di queue. Cuma bedanya bounded buffer juga bakal ngeblock kalo buffernya penuh.
Saya rasa ini sih tergantung kebutuhan. Kalo pake thread yah pake global variable dan sinkronisasi. Kalo pake process mesti pake IPC dan mungkin perlu sinkronisasi juga.
Seperti motto Perl: "There's more than one way to do it" :-)
Salam, Andrew...
capture_engine -----> queue ----> processor
----- Original Message ----- From: "Andrew Hadinyoto" <[EMAIL PROTECTED]> To: <[email protected]> Sent: Sunday, February 13, 2005 4:35 PM Subject: Re: [linux-programming] Thread di C/C++
Hi,
durung_lulus wrote:
memang sepertinya ada hubungan dengan time slice dari OS-nya, dan sayangnya saya ngga tahu cara setting timeslice ini. Kebetulan saya make freebsd 5.1.
Sebenarnya permasalahan saya seperti ini, saya membuat 2 buah program. program pertama adalah sniffer, yang selalu menyimpan packet yang datang dari eth kedatabase/file/memory. Dan process ini harus meminimalisasi packet loss, karena akan sangat berpengaruh pada program yang kedua.
Program yang kedua akan berjalan, jika sebuah koneksi telah berakhir dan melakukan analisa koneksi yang berakhir tersebut. Berhubung pada tahap ini processnya cukup banyak perhitungan matematis, maka jika menggunakan loop program bagian pertama akan ketinggalan dalam menangkap paket, dan dapat membuat program kedua salah dalam analisa.
Mungkin ada masukan gimana enaknya metode untuk invoke/signalling program ke-2?
Anda perlu metode sinkronisasi "Producer/Consumer" atau dikenal juga sebagai "Bounded Buffer".
Intinya, anda pake semacam buffer, lalu buffer tersebut di sinkronisasi. Program pertama sniff lalu datanya disimpan di buffer. Program kedua ngebaca dari buffer tersebut. Kalo buffer lagi kosong - program no. 2 di-block (berhenti) Kalo buffer ada isisnya - program no. 2 disignal utk memprosess Kalo buffer-nya penuh - program no. 1 di-block (mungkin dalam kasus anda, sniffernya berhenti sniff dulu).
Utk thread, anda bisa lihat di: man pthread_cond_wait (dan kawan2) Kalo pake interprocess communication: man sem_wait (dan kawan2)
Salam, Andrew...
-- Berhenti langganan: [EMAIL PROTECTED] Arsip dan info: http://linux.or.id/milis.php
-- Berhenti langganan: [EMAIL PROTECTED] Arsip dan info: http://linux.or.id/milis.php
