Nevesitett csővezeték kiolvasás hogyan?
Így kód tekintetébe látatlanba hagyni nem a legkézenfekvőbb hagyni a válaszírókat.
Gondolom írás után lezártad a fájlt avagy a csövet az író oldalon. Ne zárd le csak akkor ha mindent beleírtál már!
A csőbe történő írás pufferelt módon történik, ténylegesen akkor történik meg az írás alapesetben ha megtelt a puffer. Ekkor üríti a puffert és kiírja, a fogadó oldal ekkor tudja csak kiolvasni a tartalmát. Ha lezárod akkor üríti a puffert és kiírja az adatokat lezárás előtt, de ekkor többet nem lehet írni ugyanazzal a file descriptor-al és az olvasó fájlvége jelzést kap.
Flush-olással mi magunk írhatjuk ki majd ürítjük a puffer tartalmát, ekkor ténylegesen kiírásra is kerül, a fogadó oldal ekkor azonnal olvasni tudja.
Az író program így néz ki:
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int fd;
char * myfifo = "/tmp/myfifo";
mkfifo(myfifo, 0666);
fd = open(myfifo, O_WRONLY);
write(fd, "ez van a fifoban", sizeof("ez van a fifoban"));
close(fd);
unlink(myfifo);
return 0;
}
Az olvasó pedig:
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#define MAX_BUF 1024
int main()
{
int fd;
char * myfifo = "/tmp/myfifo";
char buf[MAX_BUF];
fd = open(myfifo, O_RDONLY);
read(fd, buf, MAX_BUF);
printf("kiolvasva: %s\n",buf);
close(fd);
return 0;
}
És ezután kéne hogy kiolvastam, megint írni az elsőben és kiolvasni. Bele kéne még írni mikor megnyitom írásra a fifot, hogy O_NONBLOCK, meg az olvasásnál is?:
Sosem kezeltem fájlt így, elkezdtem próbálgatni hol működött hol nem. Ha pl egy másodpercet késeltetem a következő írási művelet előtt akkor működik. A puffer tartalma az olvasóhoz képest elég furcsán elcsúszhat.
Késeltetés nélkül a csőbe írt adatok egy részét nem kapja meg a fogadó.
Végül is ha meggányolom akkor megcsinálja, de nem garantálom , hogy mindig működik is. Amiket használsz open, read , write rendszerhívások eszköz fájlok kezelésére valók. Ha pl írsz egy kernelmodult ami közvetlenül hozzáfér a merevlemezhez akkor ezekkel a rendszerhívásokkal megteheted, de nem erre való amire használni akarod.
Megoldás:
író : [link]
olvasó : [link]
Szívesen.
Persze, hogy nem egymás alá írja mert nem raktam sortörést.(Nem is akartam.) Az asfd után \n-el raktam sortörést.
(Nem gondoltam, hogy ezt a szádba kell rágni.)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!