码迷,mamicode.com
首页 > 系统相关 > 详细

linux之有名管道

时间:2017-08-07 10:06:09      阅读:349      评论:0      收藏:0      [点我收藏+]

标签:原子性   否则   printf   size   函数   方式   取数   memset   ==   

有名管道
1、查看命令:man 3 mkfifo

2、头文件:#include <sys/types.h>
#include <sys/stat.h>

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<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>

  1. #include<string.h>

#include<fcntl.h>
#include<stdlib.h>
#include<errno.h>

#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<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<string.h>
#include<fcntl.h>
#include<stdlib.h>
#include<errno.h>

#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;
}

linux之有名管道

标签:原子性   否则   printf   size   函数   方式   取数   memset   ==   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!