Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

linux pipe-fork-msg que sorusu


Dark_Soul

Öne çıkan mesajlar



Ş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ş

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ş

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ş

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ş

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ş

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ş

×
×
  • Yeni Oluştur...