linux有名管道读写函数,linux之有名管道

有名管道

1、查看命令:man 3 mkfifo

2、头文件:#include

#include

3、函数原型:int mkfifo(const char *pathname, mode_t mode);

a、*pathname:有名管道的名字 例如:/home/gec/myfifo

b、 mode:八进制的权限, 例如:0777

4、返回值:

成功:0

失败-1

5、函数特点:

有名管道存在于文件系统中,提供写入原子性特征,共享内存效率高

6、有名管道的特征:

a、有名字,储存于普通文件系统中

b、任何具有相应权限的进程都可以使用open()来获取FIFO的文件描述符

c、跟普通文件一样,用read()和writ()来读和写

d、不能用lseek来定位

e、具有写入原子性,支持多写者同时进行写操作而数据不会相互践踏

(1)读取数据代码:fifo_read.c

#include

#include

#include

#include

#include

#include

#include

#include

#define FIFO "/home/gec/FIFO" /*有名管道的名字*/

#define LENGTH 50 /*字符数组的长度*/

int main(int argc,char **argv)

{

int ret,fd; /*ret用来接收mkfifo返回的值,fd用来存饭打开有名管道的文件描述符*/

char buf[LENGTH];

if(access(FIFO,F_OK))/*判断是否已经创建了有名管道,如果已经创建,则返回0否则返回非0的数*/

{

ret = mkfifo(FIFO,0777); /*创建有名管道,成功返回0,失败返回-1*/

if(ret == -1) /*创建有名管道失败*/

{

perror("mkfifo");

exit(1);

}

}

fd = open(FIFO,O_RDONLY); /*已读方式打开有名管道,不能同时以读写权限打开,成功返回文件

描述符,失败返回-1*/

if(fd == -1) /*打开失败*/

{

perror("open");

exit(1);

}

puts("从有名管道中读取到的数据:");

while(1)

{

memset(buf,0,sizeof(buf)); /*清空缓冲区*/

read(fd,buf,sizeof(buf)); /*阻塞读取有名管道中的数据到buf中*/

printf("%s",buf);

if(strncmp(buf,"q",1) == 0) /*buf中的数据和q比较,如果相等,则返回0*/

{

break;

}

}

close(fd); /*关闭有名管道*/

return 0;

}

(2)写入数据代码:fifo_write.c

#include

#include

#include

#include

#include

#include

#include

#include

#define FIFO "/home/gec/FIFO" /*有名管道的名字*/

#define LENGTH 50 /*字符数组的长度*/

int main(int argc,char **argv)

{

int ret,fd; /*ret用来接收mkfifo返回的值,fd用来存饭打开有名管道的文件描述符*/

char buf[LENGTH];

if(access(FIFO,F_OK))/*判断是否已经创建了有名管道,如果已经创建,则返回0 否则返回非0的数*/

{

ret = mkfifo(FIFO,0777); /*创建有名管道,成功返回0,失败返回-1*/

if(ret == -1) /*创建有名管道失败*/

{

perror("mkfifo");

exit(1);

}

}

fd = open(FIFO,O_WRONLY); /*以写方式打开有名管道,不能同时以读写权限打开,成功返回文件

描述符,失败返回-1*/

if(fd == -1) /*打开失败*/

{

perror("open");

exit(1);

}

puts("请输入数据到有名管道中,输入q退出:");

while(1)

{

memset(buf,0,sizeof(buf)); /*清空缓冲区*/

fgets(buf,sizeof(buf),stdin); /*从终端输入数据到buf中*/

write(fd,buf,strlen(buf)); /*阻塞把数据写入有名管道*/

if(strncmp(buf,"q",1) == 0) /*buf中的数据和q比较,如果相等,则返回0*/

{

printf("aaaa\n");

break;

}

}

close(fd); /*关闭有名管道*/

return 0;

}

原文:http://www.cnblogs.com/wurenzhong/p/7297405.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值