Denis Colisnichenko, Peter Allen - linux teljes útmutató - p 149

26. fejezet
A folyamat interakció Linux alatt

26.1. Az interakció módszerei

A folyamatok, mint például az emberek, egymással kommunikálhatnak, vagyis információt cserélhetnek. A 3. fejezetben röviden megvizsgáltam az interprocess kommunikáció két eszközt (IPC, Inter-Process Communication); fél duplex csatornák (csővezetékek) és jelek, de a UNIX-rendszereken ezek az alapok sokkal nagyobbak. Ebben a fejezetben felsorolom a többi IPC-eszközt, és megmutatom, hogyan kell használni őket a kódban.

Az ősi idők óta vannak nevei a FIFO csatornák (First In-First Out) és a hálózati aljzatok (sockets). A csővezetékekkel és jelekkel együtt BSD típusú IPC-t alkotnak. Az ATT a System V operációs rendszerrel együtt három új IPC típust kínál:

A Linux operációs rendszerben az IPC mindkét típusa támogatott - a V-rendszer és a BSD, vagyis a Linux-ban a fenti IPC-módszerek használatával.

26.2. Half-duplex csatornák

Hadd emlékeztessem önöket arra, hogy egy csatorna az egyik szabványos kimenet egy másik szabványos bemenetéhez való csatlakoztatásának egyik módja. A csatornák UNIX régi időmérők: a UNIX első verzióiban jelentek meg. A fél-duplex csatornák lehetővé teszik az információcserét csak egy irányban. Ha az őstermelési folyamat a szabványos kimenetről a gyermek standard bemenetére továbbít, akkor ez egy fél duplex csatorna példája.

Mi a bemeneti / kimeneti átirányítás és hogyan kell használni a parancssorból, amit már tudsz (3.4.6. Szakasz). Most megmutatom, hogyan kell végrehajtani a szoftver átirányítását, azaz felhasználói beavatkozás nélkül.

FÁJL * popen (const char * parancs, const char * hozzáférési mód);

A popen () hívás FILE * mutatót vagy null mutatót ad NULL-nak, ha a hívás sikertelen. Ahogyan szokásos fájlokkal is dolgozik, az I / O művelet befejezése után a pclose () meghívásával le kell zárnia a csatornát. Ha egy szálat használsz, ajánlom az fflush () hívást. A pufferelés okozta késések elkerülése érdekében.

Most néhány egyszerű példa. Tegyük fel, hogy szabványos kimenetre kell nyomtatni az aktuális könyvtárban lévő összes szövegfájl nevét. Ezt nagyon egyszerűen hívhatja a rendszer ():

Ez elég triviális feladat - csak adatokat adunk ki, de ne dolgozzuk fel. Hogyan juthat el a szöveges fájlok összes nevéhez és feldolgozza azokat a programban?

FÁJL * fp = popen ("ls * .txt", "r");

// a ciklusban olvassa el az összes szövegfájl nevét