//命名管道特点:
//1.如果打开管道的一方仅以读或写的方式打开管道,必须需要另一方的介入,管道才能打开
//双方都调用open
//可以一方打开,以读写的方式打开open(DEF_FIFO_PATH,O_RDWR)
//发送少量简单无格式的数据
//双方读写都存在,才能打开管道
//计时性存储数据
//2.存在的文件
//3.单向写入,单向写出
//问答形式
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#define DEF_FIFO_PATH ("./FIFO")
#define DEF_STD_ERROR (-1)
int main(int argc,char *argv[])
{
int ret;
int fd;
char str[1024];
//if argv[1] > 0,writer
if(atoi(argv[1])>0)
{
ret = mkfifo(DEF_FIFO_PATH,S_IWUSR | S_IRUSR);
if(ret == DEF_STD_ERROR)
{
if(errno == EEXIST)
{
printf("Fifo always exist\n");
}
else
{
printf("%d\n",strerror(errno));
return -1;
}
}
//open fifo
fd = open(DEF_FIFO_PATH,O_WRONLY)//O_WRONLY紧以读的方式打开,两个进程
if(fd == DEF_STD_ERROR)
{
printf("%d\n",strerror(errno));
//delete pipe打开失败删除文件(管道)
unlink(DEF_FIFO_PATH);
return -1;
}
//write
while(1)
{
printf("Please input string:\n");
scanf("%s",str);
write(fd,str,strlen(str)+1);
if(!strcmp(str,"goodbye"))
{
break;
}
}
//close fifo
close(fd);
}
else
{
//if argv[1] <= 0,reader
//check fifo
ret = access(DEF_FIFO_PATH,W_OK);
if(ret == DEF_STD_ERROR)
{
printf("%d\n",strerror(errno));
return -1;
}
//open fifo
fd = open(DEF_FIFO_PATH,O_RDONLY);
if(fd == DEF_STD_ERROR)
{
printf("%d\n",strerror(errno));
return -1;
}
//read fifo
while(1)
{
read(fd,str,sizeof(str));
printf("Receive data:[%s]\n",str);
if(strcmp("goodbye",str)==0)
{
break;
}
}
//close fifo
close(fd);
}
return 0;
}
Linux命名管道
最新推荐文章于 2024-08-09 14:59:31 发布