[linux] named pipes
Robert Varga
niteshadow na hq.alert.sk
Čtvrtek Srpen 10 19:47:03 CEST 2000
On Thu, Aug 10, 2000 at 06:49:11PM +0200, Branislav Vartik wrote:
> Vie mi niekto poradit ako naprogramujem 2 standalone programy z ktorych
> jeden zapisuje do FIFO named pipe a druhy z nej cita? pripadne nejaky
> link example?
velmi jednoduche:
potrebujes najskuor vytvorit danu pipe... V shelly to spravis cez mkfifo(1),
v Ccku cez mknod(2).
dev_t d;
mknod("/tmp/pipe", S_IFIFO | 0600, d);
A potom tu pipe pouzvas ako normalny subor:
jeden proces si ju otvori na citanie a druhy na zapis.
proces1:
int infd = open("/tmp/pipe", O_RDONLY);
proces2:
int outfd = open("/tmp/pipe", O_WRONLY);
operacia open() blokuje na obidvoch stranach, pokial niektory iny proces
neotvori pajpu pre naprotivnu operaciu. T.z. nemozes najskuor otvorit pajpu
na zapis, potom sa forknut a az potom ju otvorit pre citanie.
Rychly priklad:
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#define PIPENAME "/tmp/pipe"
int main()
{
int fd;
dev_t d;
/* skus vytvorit pipe */
if (mknod(PIPENAME, S_IFIFO | 0600, d)) {
perror("mknod");
return 1;
}
/* Vytvor novy proces */
fd = fork();
/* Chyba */
if (fd < 0) {
perror("fork");
return 1;
}
if (fd) {
/* parent proces */
if ((fd = open(PIPENAME, O_WRONLY))) {
/* write do pajpy ... */
} else
perror("open");
} else {
/* child proces */
if ((fd = open(PIPENAME, O_RDONLY))) {
/* read z pajpy ... */
} else
perror("open");
}
/* a este zmazat pajpu. */
unlink(PIPENAME);
}
--
Kind regards,
Robert Varga
------------------------------------------------------------------------------
n na hq.sk http://hq.sk/~niteshadow/gpgkey.txt
------------- další část ---------------
Netextová příloha byla odstraněna...
Jméno: [žádný popis není k dispozici]
Typ: application/pgp-signature
Velikost: 232 bytes
Popis: [žádný popis není k dispozici]
Url : http://lists.linux.sk/pipermail/linux/attachments/20000810/2c5ee1c2/attachment.bin
Další informace o konferenci linux