新手求教命名管道的问题

成长记情 2017-04-05 10:07:26

#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成功了的,为什么?
...全文
186 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
成长记情 2017-04-06
  • 打赏
  • 举报
回复
引用 3 楼 u014311648 的回复:
代码写错了。

 if(mkfifo(FIFO_WRITE,S_IFIFO|0666))
 {
                printf("create fifo:%s error,because %s\n",FIFO_WRITE,strerror(errno));
                exit(EXIT_FAILURE);
 }
这里改成这样才是正确逻辑。我这样改了以后,错误提示变成::create fifo:writefifo error,because Operation not permitted 没有权限。我改成ROOT执行都一样。
我是用的是win10的linux子系统
成长记情 2017-04-06
  • 打赏
  • 举报
回复
代码写错了。

 if(mkfifo(FIFO_WRITE,S_IFIFO|0666))
 {
                printf("create fifo:%s error,because %s\n",FIFO_WRITE,strerror(errno));
                exit(EXIT_FAILURE);
 }
这里改成这样才是正确逻辑。我这样改了以后,错误提示变成::create fifo:writefifo error,because Operation not permitted 没有权限。我改成ROOT执行都一样。
成长记情 2017-04-06
  • 打赏
  • 举报
回复
引用 1 楼 nswcfd 的回复:
mkfifo成功返回0,if (!mkfifo())就退出了,不过这样的话错误应该打印create fifo error才是。
if (!mkfifo())好像是没进。那就是说FIFO创建成功。但是错误是写出错
nswcfd 2017-04-06
  • 打赏
  • 举报
回复
mkfifo成功返回0,if (!mkfifo())就退出了,不过这样的话错误应该打印create fifo error才是。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧