命名管道与上一篇讲到的匿名管道很像,但是命名管道没有血缘关系的限制。
mkfifo创建命名管道文件,文件的大小永远为0,表示不占用磁盘的大小,它是用一个名字代表内核上的一块缓存,没有亲缘关系的进程可以通过名字拿到内核上的这块缓存,值得注意的是要写的时候读写管道必须同时打开
Python实现:
if os.access(path,os.F_OK):
print("/tmp/pyfifo is exsit!")
else:
print("/tmp/pyfifo is not exsit!")
os.mkfifo(path)
fd_read = os.open(path,os.O_RDONLY)
ret = os.read(fd_read,20)
print(ret)
os.close(fd_read)
if os.access(path,os.F_OK):
print("/tmp/pyfifo is exsit!")
else:
os.mkfifo(path)
fd_write = os.open("/tmp/pyfifo",os.O_RDWR)
str = input("please input string:")
os.write(fd_write,str)
print("write successful")
os.close(fd_write)
C实现:
#include "head4fifo.h"
int main(int argc, char **argv)
{
if(access(FIFO, F_OK))
{
mkfifo(FIFO, 0644);
}
int fifo = open(FIFO, O_WRONLY);
char msg[20];
bzero(msg, 20);
fgets(msg, 20, stdin);
int n = write(fifo, msg, strlen(msg));
printf("%d bytes have been sended.\n", n);
return 0;
}
#include "head4fifo.h"
int main(int argc, char **argv)
{
if(access(FIFO, F_OK))
{
mkfifo(FIFO, 0644);
}
int fifo = open(FIFO, O_RDONLY);
char msg[20];
bzero(msg, 20);
read(fifo, msg, 20);
printf("from FIFO: %s", msg);
return 0;
}