Dark_Soul Mesaj tarihi: Mayıs 30, 2012 Paylaş Mesaj tarihi: Mayıs 30, 2012 Şimdi olay şu unnamed pipe ile p1 processinden p2 ye hello diye char[] gönderiliyor,p2,p1i bekliyor daha sonra p2 pid id yi msg que kullanılarak p1 e tekrar gönderiyor.En sonunda p1 pid id yi print ediyor. Adım adım: -Unnamed pipe ve msg que tanımlanıyor. -Daha sonra fork ile child proc. oluşturuyoruz. -p2 nin , gelen stringi(char[]) okumak için beklemesi lazım.Burayı anlayamadım. -Birde child proc, parent processin pid id sini bilmiyor(sanırım).Onu nasıl tekrar gönderecek parenta? Hatta mümkünse kodları şöyle adım adım anlatacak birisi varsa çok iyi olur Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Pipet Mesaj tarihi: Mayıs 30, 2012 Paylaş Mesaj tarihi: Mayıs 30, 2012 vay be ne nostalji oldu şu sahne Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Borastus Mesaj tarihi: Mayıs 30, 2012 Paylaş Mesaj tarihi: Mayıs 30, 2012 sistem ödevim vardı başlığı görmem iyi oldu ona başlayayım. şu bekleme olayını açıklayayım ben read fonksiyonu var istedigin bir pipe den veri gelinceye kadar orada bekliyor process yani birisi write ile birşeyler yazınca read okuyup devam ediyor oradan. nonblock komutu var öyle olursa bu bekleme olayları olmuyor hiç Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Fly Mesaj tarihi: Mayıs 30, 2012 Paylaş Mesaj tarihi: Mayıs 30, 2012 sorun niye boyle yapıyoruz ise : bekleme dediğin read(..) deki beklemeden mi bahsediyorsun ? write pipe'a yazarken anında yazmaz, sure gecer read de pipe'da data yoksa o anda bloke olur (işletim sistemleri dersiniz varsa i/o için sırasını devreder başka bir proesese dersem daha net anlarsın) uyandığı vakit yoksa yine uyur veri oldugu vakit p2 uyandığı zaman ceker cekebildiğini getpid kendini çağıran prosese id'sini verir child bunu kullanacak, id'sini elde edecek message queue'ye yazacak bunu parent eninde sonunda mq'ya mesaj gelmesini bekliyor tabi arada başka şeyler yapsa da parent forktan donen degerle karsilastirip evet sen evladımsın diyecek (maksat pipe mq ogrenmeniz sanirim, yoksa forktan donen deger zaten child id ?) bunun üzerine de printf cout neyse artık onunla bastıracaksın -- p2 "bekliyor" a takılıyor olabilme sebebin p1'in mesaj varsa al yoksa otur yaparken p2'de daha başka şekilde yapıyor oluşu olabilir direk posix queue kullanmadım ama ama mq mantığı sana gelen bit sürüsü yerine ayrı ayrı atıldığını algılayabildiğin mesajlarla uğraşmak p1 hello world how r u diye 5 defada bisey yazdi diyelim p2 bu sırada uyuyorsa uyandığı vakit atıyorum 1k byte bufferla 1k byte okumaya calis dersen sadece helloyu almaz, world morld pipe'da bulunan herşeyi alır mq olsaydı bunları 5 ayrı mesaj olarak algılaman mumkun olacaktı "hello" yazılırken daha "he" 'de kalmış olması muhtemel karşıdaki prosesin, hello dışında bişey beklemiyorsan 5 byte dolana kadar read yapacaksın, dolayısıyla bekleyeceksin Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Deacon Mesaj tarihi: Mayıs 31, 2012 Paylaş Mesaj tarihi: Mayıs 31, 2012 Dark_Soul said: -Unnamed pipe ve msg que tanımlanıyor. -Daha sonra fork ile child proc. oluşturuyoruz. 3-p2 nin , gelen stringi(char[]) okumak için beklemesi lazım.Burayı anlayamadım. 4-Birde child proc, parent processin pid id sini bilmiyor(sanırım).Onu nasıl tekrar gönderecek parenta? 3 icin yapman gereken sey shared semaphore. Beklemekten kasit p1 stringi gondermeden p2 bufferi okumasin. Bunun icin bi tane shared semaphore tanimla(ismi sem olsun). sem'i 0'a initialize et. p1 processinde mesaji gonderdikten sonra sem.v() yapsin. p2 de read kodundan once sem.p() yapicak ki p1 sem'i arttirmadan read koduna giremesin. 4 icin ekstra bisi yapmana gerek yok cunku fork zaten child'in pid'sini return ediyor. int pid = fork(); if(pid == 0) /* child process in yapacagi is */ else if (pid < 0) /* fork fail etti, error */ else /* fork basarili, parenttayiz. bu blokta pid degiskeni child process'in pid'sini tutuyor. */ Ben boyle yapardim. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Dark_Soul Mesaj tarihi: Mayıs 31, 2012 Konuyu açan Paylaş Mesaj tarihi: Mayıs 31, 2012 Cevaplar için thx :) Yalnız hala anlayamadıgım yerler var: -Mesela forkdan önce pipe ve msq que tanımlaman/oluşturman(tanımlaman veya yaratman dedi tam hatırlayamıyorum) gerekiyor demişti projeyi aldıgım hoca.Şimdi fork() dan önce ortada sadece 1 process var.1 process varken ile pipe oluşturmanın mantıgı nedir? -Aynı şekilde fork() ile 2. processi oluşturmadan önce msq que kullanmanın olayı ne? Sonuçta hem pipe hemde msq que ,processesler arasında data iletiyor.Yani kısacası fork() dan önce pipe ve msq que işlemlerini başlatıyor muyuz(burdan yukarıdaki soruya geliyorum tekrar) yoksa sadece değişkenlerini atayıp forkdan sonra işlemlere mi geçiyoruz? Bu arada unnamed pipe ile 2 process arasında send-recieve olayını yaptım.Kodlarıda hazır.Aynı şekilde msq que ile 2 process arasında data gonderme alma olayınıda yaptım ayrı olarak.Msq que nın olayıda kısaca; her gonderilen data için bir sıra/küme oluşturuluyor ve her birine id atanıyor, daha sonra 2. process kuyrukta olan verilerden hangisini almak istiyorsa onun id sini yazıp sadece o veriyi çekiyor. Şimdi yukarıda yazdıgım gibi fork() un NEDEN msq que ve pipe dan sonra eklenmesi(yada sadece tanımlanması) gerektiği anlayamadım.Daha doğrusu fork() fonksiyonunu kodun neresine yazmam gerektiğini kestiremedim tam olarak(sıralama pipe() , msq que ve fork() şeklindemi mi?.Birde msq que kullanarak child process getpid()ile parent proc. in idsini alıyor da bunun kod kısmı nasıl olacak onu bilmiyorum(msq dan sonra fork() ve ondan sonra child process başladıgında getpid() mi kullanmam gerekiyor?) Son olarak yukarıdaki resme göre p1 in child olması lazım,değil mi? Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Fly Mesaj tarihi: Mayıs 31, 2012 Paylaş Mesaj tarihi: Mayıs 31, 2012 said: 1 process varken ile pipe ... 2. processi oluşturmadan önce msq que kullanmanın olayı ne? ... birbirinden tamamen ayrı iki program isimsiz pipe soket shared mem ile haberleşemez çünkü dış çevreye bulaşmadan gerekli file descriptorların iki programda da olmasını sağlıyorsun ? said: doğrusu fork() fonksiyonunu kodun neresine yazmam gerektiğini kestiremedim tam olarak cevabı direk vermiyorum vermiş kadar olacak olsa da, ezberlemek yerine mantığını anlaman gereken bişey çünkü senin de dediğin gibi unnamed pipe başka bir deyişle kelalaka bir program yukarıda dediğim gibi standart bir api çağrısıyla salça olamıyor bu pipe'a, onu yine dediğim gibi baska yontemlerle yapabilirsin de konu bu değil forkun yaptığı şey prosesin ikizini oluşturmak kabaca, farklı olarak da fork bittikten sonra parenta child id donuyor olusturulan kopya bu diye, childa da 0 donuyor sen hayatına yeni baslıyorsun diye ama o ana kadar yaptıkların korunuyor (spesifik detaylara girersem cok uzar da signal handling vs miras kalıyor örneğin) bu ikizler arası parent child iliskisi varsa da birbirinden ayrı prosesler olarak işlem görüyorlar işletim sistemine göre istenen sey aralarında mesajlaşmayı sağlamak bu durumda mesajlaşma nesnelerini hazırlayıp sonra çoğaltırsan iki tarafta da gereken alet edevat hazır cogalma sonrası iki tarafa da getpid dedigin vakit iki taraftan alacagin id'ler dogal olarak farkli olacak said: Son olarak yukarıdaki resme göre p1 in child olması lazım,değil mi? ikinci diyagramda catallanan cizgi child genelde duz cizgi "duz devam" mealinde, catal alternatif yon olarak algıladığımız için yalniz semaya gore bakinca farkli oluyor bu durumda parent childa yolluyor id vsyi, ben de niye parent cocugunun idsini duymak istesin ki diyordum herhalde parent pipe'a yazacak ve mq yu bekleyecek, child da pipe'i okuyup mq'ya ok diyecek sonra child benim anam bu diyecek, ikisi de kapanacak semafora girme yalniz, programı kapama dışında işlevi yoksa mqnun daha dogru bir alternatif de konunuz degil, hoca nereden arakladınız bile yapabilir Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Dark_Soul Mesaj tarihi: Haziran 2, 2012 Konuyu açan Paylaş Mesaj tarihi: Haziran 2, 2012 eyvallah,dün verdim projeyi ,tam olarak bitmemişti kod kısmı ama algoritma kısmını güzelce anlatınca(msq que , pipe, fork vs) hoca insafa geldi, 40 kişiden projeyi kabul ettirebilen 2 kişiden 1i oldum:) Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
dasaaa Mesaj tarihi: Haziran 2, 2012 Paylaş Mesaj tarihi: Haziran 2, 2012 e o kadar yardım aldıktan sonra olsun yani... /anne mode off Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Öne çıkan mesajlar