Prosessi 1:
write(fd, &jotain, sizeof(jotain));
Prosessi 2:
if(read(fd, &jotain, sizeof(jotain)) == sizeof(jotain)) {
funktio(&jotain);
}
Jos edellä olevassa fd on piippu, niin edellä oleva näyttää käytännössä toimivan hyvin.
Kysymys: Onko tuo piippujen (pipes) kohdalla täysin luotettavaa, vai voiko joskus käydä niin, että luettu datamäärä onkin jotain muuta kuin nolla tai sizeof(jotain)? Tällöin nämä kaksi toistensa kanssa kommunikoivaa prosessia joutuvat epätahtiin.
Jos fd on sarjaportti, niin on silloin on täysin selvää selvää, että prosessit voivat joutua epätahtiin, kun datansiirto vie äärellisen ajan, mutta entä piippujen kohdalla?
write(fd, &jotain, sizeof(jotain));
Prosessi 2:
if(read(fd, &jotain, sizeof(jotain)) == sizeof(jotain)) {
funktio(&jotain);
}
Jos edellä olevassa fd on piippu, niin edellä oleva näyttää käytännössä toimivan hyvin.
Kysymys: Onko tuo piippujen (pipes) kohdalla täysin luotettavaa, vai voiko joskus käydä niin, että luettu datamäärä onkin jotain muuta kuin nolla tai sizeof(jotain)? Tällöin nämä kaksi toistensa kanssa kommunikoivaa prosessia joutuvat epätahtiin.
Jos fd on sarjaportti, niin on silloin on täysin selvää selvää, että prosessit voivat joutua epätahtiin, kun datansiirto vie äärellisen ajan, mutta entä piippujen kohdalla?
Vastaukset 5
Vanhimmat
se voi joutua "epätahtiin" vaikkapa siksi, että toinen prosessi kaatuu.
"se voi joutua 'epätahtiin' vaikkapa siksi, että toinen prosessi kaatuu. "
Ei kaadu. Jos yksi prosesseista kaatuu, niin muillakaan ei ole enää mitään virkaa. Silloin epätahtisuudella ole enää väliä. Eikä koko laitteellakaan, vaan huoltomiehen pitäisi käydä boottaamassa se. Ja lasku tulisi perässä.
Ajattelin lähinnä sitä että onko piipuissa sisäisiä semaforeja tms jotka estävät sen että tietoa ei lueta piipusta samaan aikaan kuin sinne kirjoitetaan?
http://manpages.courier-mta.org/htmlman7/pipe.7.html
Kiitos vinkistä.
Kirjoittaminen näyttää olevan atomista tietyin ehdoin. Ja tämähän merkitsee sitä että lukupuolella data on saatavissa joko kokonaan tai ei ollenkaan. Eli on turvallista mun tapauksessa, sillä mulla datan koko on aina < PIPE_BUF.
Palaan vielä aiemmin mainittuun kaatumiseen. Mulle ei riitä että ohjelma näyttää toimivan, mun pitää _tietää_ että se toimii. Jos edellä oleva kirjoittaminen ei olisi ollut atomista ja olisin käyttänyt em menetelmää, niin ohjelma olisi voinut toimia monta päivää tai kuukautta moitteetta. Siten kun sattuisi yhtäaikainen kirjoitus ja luku, niin sitten tapahtuisi virhe.
Aivan liian moni koodaaja tekee koodia joka "näyttää toimivan". Seuraus tästä asenteesta on epäluotettavat ohjelmat.
"Aivan liian moni koodaaja tekee koodia joka "näyttää toimivan". Seuraus tästä asenteesta on epäluotettavat ohjelmat."
Microsoftilla tuo homma handlataan oikein hyvin :)