linux 远程命名管道,linux中的命名管道(FIFO)

管道只能用于亲缘关系之间的通信,而FIFO中,只要可以访问路径,就可以进行通信。

FIFO按照先进先出的原则进行通信,第一个被写入的数据首先从管道中读出。

创建命名管道的系统函数有两个: mknod和mkfifo。两个函数均定义在头文件sys/stat.h,函数原型如下:

#include

#include

int mknod(const char *path,mode_t mod,dev_t dev);

int mkfifo(const char *path,mode_t mode);

函数mknod参数中path为创建的命名管道的全路径名: mod为创建的命名管道的模式,指明其存取权限; dev为设备值,该值取决于文件创建的种类,它只在创建设备文件时才会用到。这两个函数调用成功都返回0,失败都返回- 1。使用mknod函数创建了一个命名管道:

umask(0);

if (mknod("/tmp/fifo",S_IFIFO | 0666) == -1)

{

perror("mkfifo error");

exit(1);

}

函数mkfifo前两个参数的含义和mknod相同。

umask(0);

if (mkfifo("/tmp/fifo",S_IFIFO|0666) == -1)

{

perror("mkfifo error!");

exit(1);

}

“S_IFIFO|0666”指明创建一个命名管道且存取权限为0666,即创建者、与创建者同组的用户、其他用户对该命名管道的访问权限都是可读可写(这需要注意umask对生成的管道文件权限的响)。

调用open()打开命名管道的进程可能会被阻塞。但如果同时用读写方式( O_RDWR)打开,则一定不会导致阻塞;如果以只读方式( O_RDONLY)打开,则调用open()函数的进程将会被阻塞直到有写方打开管道;同样以写方式( O_WRONLY)打开也会阻塞直到有读方式打开管道。

对文件系统来说,匿名管道是不可见的,它的作用仅限于在父进程和子进程两个进程间进行通信。而命名管道是一个可见的文件,因此,它可以用于任何两个进程之间的通信,不管这两个进程是不是父子进程,也不管这两个进程之间有没有关系。

fifo read端:#include 

#include 

#include 

#include 

#include 

#include 

#define _PATH_ "/tmp/file.tmp"

#define _SIZE_ 100

int main()

{

int fd = open(_PATH_, O_RDONLY);

if (fd 

printf("open file error!\n");

return 1;

}

char buf[_SIZE_];

memset(buf, '\0', sizeof(buf));

while (1){

int ret = read(fd, buf, sizeof(buf));

if (ret <= 0)//error or end of file

{

printf("read end or error!\n");

break;

}

printf("%s\n", buf);

if (strncmp(buf, "quit", 4) == 0){

break;

}

}

close(fd);

return 0;

}

fifo write端:#include 

#include 

#include 

#include 

#include 

#include 

#define _PATH_ "/tmp/file.tmp"

#define _SIZE_ 100

int main()

{

int ret = mkfifo(_PATH_, 0666|S_IFIFO);

if (ret == -1){

printf("mkfifo error\n");

return 1;

}

int fd = open(_PATH_, O_WRONLY);

if (fd 

printf("open error\n");

}

char buf[_SIZE_];

memset(buf, '\0', sizeof(buf));

while (1){

scanf("%s", buf);

int ret = write(fd, buf, strlen(buf) + 1);

if (ret 

printf("write error\n");

break;

}

if (strncmp(buf, "quit", 4) == 0){

break;

}

}

close(fd);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值