write() / read()

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?
5134
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

se voi joutua "epätahtiin" vaikkapa siksi, että toinen prosessi kaatuu.

Äänestä
  • "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?

    Äänestä

  • 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.

    Äänestä

  • old_profile_37095 kirjoitti:

    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 :)

    Äänestä

Kommentoi aloitusta


barium kirjoitti:

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?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu