新手求教命名管道的问题
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/stat.h>
#include<stdbool.h>
#include<fcntl.h>
#include<pthread.h>
#include<errno.h>
#define FIFO_READ "readfifo"
#define FIFO_WRITE "writefifo"
#define BUFSIZE 1024
bool connect=true;
void *read_from(void *arg)
{
int rfd=-1;
char buf[BUFSIZE]={0};
int i;
printf("waiting...\n");
while((rfd=open(FIFO_READ,O_RDONLY))==-1)
{
sleep(1);
}
while(connect)
{
int len=read(rfd,buf,BUFSIZE);
if(len>0)
{
buf[len]='\0';
if(strncmp(buf,"byebye",6)==0)
{
printf("disconnection\n");
connect=false;
break;
}
}
printf("Other Side:%s\n",buf);
printf("me:");
fflush(stdout);
}
close(rfd);
return NULL;
}
void *write_to(void *arg)
{
int wfd;
char buf[BUFSIZE]={0};
int len;
mode_t omd,nmd;
nmd=S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
//omd=umask(nmd);
if(!mkfifo(FIFO_WRITE,S_IFIFO|0666))
{
printf("create fifo:%s error,because %s\n",FIFO_WRITE,strerror(errno));
exit(EXIT_FAILURE);
}
//umask(omd);
//chmod(FIFO_WRITE,nmd);
wfd=open(FIFO_WRITE,O_WRONLY);
if(wfd==-1)
{
printf("open fifo:%s error,becase %s\n",FIFO_WRITE,strerror(errno));
exit(EXIT_FAILURE);
}
while(connect)
{
int n;
printf("me:");
n=read(STDIN_FILENO,buf,BUFSIZE);
if(n<0)
{
printf("read error\n");
exit(EXIT_FAILURE);
}
buf[n]='\0';
if(strncmp(buf,"byebye",6)==0||!connect)
{
write(wfd,buf,n);
close(wfd);
unlink(FIFO_WRITE);
exit(EXIT_SUCCESS);
}
write(wfd,buf,n);
fflush(stdout);
}
return NULL;
}
int main(void)
{
pthread_t thIDr,thIDw;
pthread_create(&thIDr,NULL,&read_from,NULL);
pthread_create(&thIDw,NULL,&write_to,NULL);
pthread_join(thIDr,NULL);
pthread_join(thIDw,NULL);
return 0;
}

看错误好像是没有FIFO文件的意思。我前面mkfifo成功了的,为什么?
...全文
相关推荐
匿名管道与命名管道的使用
### 知识点二:命名管道(FIFO)#### 定义:命名管道或FIFO是一种具有全局名称的管道,它可以在任何进程之间进行通信。作为一种特殊的文件类型,它存在于文件系统中。
命名管道实例 命名管道
- **同步问题**:因为命名管道是半双工的,所以在设计通信协议时要考虑读写顺序,避免数据交错。- **错误处理**:在实际编程中,要对可能出现的错误(如连接失败、数据传输错误等)进行妥善处理。
命名管道用于进程间双向通信
本文将深入探讨命名管道的工作原理、API的使用方法以及如何通过编程实现匿名管道的双向通信。首先,我们了解下命名管道的基本概念。
C# 命名管道 异步通信的例子
**命名管道基础**:命名管道有别于匿名管道,它具有名字,可以被多个进程共享。
命名管道,命名管道,命名管道
**安全性**:由于命名管道可能涉及不同进程甚至不同计算机之间的通信,因此需要考虑安全问题。可以设置访问控制列表(ACL)来限制哪些用户或进程可以访问管道,防止未经授权的访问。4.


